一、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 " << 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.检测是否支持NVCUVENC2.新建编码器,设置编码类型3.设置编码参数,注册回调函数4.创建编码器相关资源5.循环编码每帧数据6.删除编码器,释放资源伪代码示意图如下所示,其中编码前缓冲区的分配,以及编码后的数据处理都由回调函数。

回调函数说明:
AcquireBitstream() 分配coded bitstream缓冲区ReleaseBitstream() 处理、保存coded bitstreamOnBeginFrame() 编码前的初始化工作OnEndFrame() 编码后的统计工作回调函数的调用顺序:
http://www.cnblogs.com/dwdxdy/p/3247075.html