【GPU编解码】GPU硬编码

一、OpenCV中的硬编码

OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下。

复制代码

 1 int main(int argc, const char* argv[])

 2 {

 3     if (argc != 2)

 4     {

 5         std::cerr << "Usage : video_writer <input video file>" << std::endl;

 6         return -1;

 7     }

 8 

 9     const double FPS = 25.0;

10     cv::VideoCapture reader(argv[1]);

11 

12     if (!reader.isOpened())

13     {

14         std::cerr << "Can't open input video file" << std::endl;

15         return -1;

16     }

17 

18     cv::gpu::printShortCudaDeviceInfo(cv::gpu::getDevice());

19     cv::gpu::VideoWriter_GPU d_writer;

20 

21     cv::Mat frame;

22     cv::gpu::GpuMat d_frame;

23 

24     for (int i = 1;; ++i)

25     {

26         std::cout << "Read " << i << " frame" << std::endl;

27         reader >> frame;

28         if (frame.empty())

29         {

30             std::cout << "Stop" << std::endl;

31             break;

32         }

33         cv::resize(frame,frame,cv::Size(704,576));

34         if (!d_writer.isOpened())

35         {

36             std::cout << "Open GPU Writer" << std::endl;

37 

38             d_writer.open("output_gpu.avi", frame.size(), FPS);

39         }

40         d_frame.upload(frame);

41         std::cout << "Write " << i << " frame" << std::endl;

42         d_writer.write(d_frame);

43     }

44     return 0;

45 }

复制代码

深入阅读cv::gpu::VideoWriter_GPU类的实现,发现其底层编码实现是基于NVCUVENC库,视频文件的封装是FFmpeg。

二、NVCUVENC库

NVCUVENC库是NVIDIA公司提供的视频编码库,可以实现H.264的GPU编码,接收原始YUV frames数据,编码产生NAL packets。

利用NVCUVENC库进行视频硬编码的基本步骤如下:

1.检测是否支持NVCUVENC

2.新建编码器,设置编码类型

3.设置编码参数,注册回调函数

4.创建编码器相关资源

5.循环编码每帧数据

6.删除编码器,释放资源

伪代码示意图如下所示,其中编码前缓冲区的分配,以及编码后的数据处理都由回调函数。

【GPU编解码】GPU硬编码

回调函数说明:

AcquireBitstream() 分配coded bitstream缓冲区

ReleaseBitstream() 处理、保存coded bitstream

OnBeginFrame() 编码前的初始化工作

OnEndFrame() 编码后的统计工作

回调函数的调用顺序:

【GPU编解码】GPU硬编码

你可能感兴趣的:(编码)