您的位置:首页 > 其它

GPU编解码 - 硬编码

2013-10-10 15:44 281 查看
一、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.删除编码器,释放资源
伪代码示意图如下所示,其中编码前缓冲区的分配,以及编码后的数据处理都由回调函数。



回调函数说明:
AcquireBitstream() 分配coded bitstream缓冲区
ReleaseBitstream() 处理、保存coded bitstream
OnBeginFrame() 编码前的初始化工作
OnEndFrame() 编码后的统计工作回调函数的调用顺序:


http://www.cnblogs.com/dwdxdy/p/3247075.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: