织梦CMS - 轻松建站从此开始!

罗索

【GPU编解码】GPU硬编码

落鹤生 发布于 2014-11-17 23:37 点击:次 
一、OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由 cv::gpu::VideoWriter_GPU 完成,其示例程序如下。 int main( int argc, const char *argv[]) { if (argc!=2) { std::cerr Usage:video_writerinputvideofile std::endl; return -1; } const
TAG: GPU  硬解码  硬编码  

一、OpenCV中的硬编码

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

  1. int main(int argc, const char* argv[]) 
  2.     if (argc != 2) 
  3.     { 
  4.         std::cerr << "Usage : video_writer <input video file>" << std::endl; 
  5.         return -1; 
  6.     } 
  7.  
  8.     const double FPS = 25.0; 
  9.     cv::VideoCapture reader(argv[1]); 
  10.  
  11.     if (!reader.isOpened()) 
  12.     { 
  13.         std::cerr << "Can't open input video file" << std::endl; 
  14.         return -1; 
  15.     } 
  16.  
  17.     cv::gpu::printShortCudaDeviceInfo(cv::gpu::getDevice()); 
  18.     cv::gpu::VideoWriter_GPU d_writer; 
  19.  
  20.     cv::Mat frame; 
  21.     cv::gpu::GpuMat d_frame; 
  22.  
  23.     for (int i = 1;; ++i) 
  24.     { 
  25.         std::cout << "Read " << i << " frame" << std::endl; 
  26.         reader >> frame; 
  27.         if (frame.empty()) 
  28.         { 
  29.             std::cout << "Stop" << std::endl; 
  30.             break
  31.         } 
  32.         cv::resize(frame,frame,cv::Size(704,576)); 
  33.         if (!d_writer.isOpened()) 
  34.         { 
  35.             std::cout << "Open GPU Writer" << std::endl; 
  36.  
  37.             d_writer.open("output_gpu.avi", frame.size(), FPS); 
  38.         } 
  39.         d_frame.upload(frame); 
  40.         std::cout << "Write " << i << " frame" << std::endl; 
  41.         d_writer.write(d_frame); 
  42.     } 
  43.     return 0; 

深入阅读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() 编码后的统计工作

回调函数的调用顺序:

(dwdxdy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201411/17127.html]
本文出处:博客园 作者:dwdxdy 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容