【GPU编解码】GPU硬编码 (转)

摘要:
video_ writer<视频捕获读取器(argv[1]);reader.isOpened())13{14std;“无法打开输入视频文件”<“读取”&lt:i&lt:27reader>“停止”&lt:std;frame;大小(704;d_writer.isOpened(())35{36std;std:

一、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硬编码 (转)第3张

回调函数说明:

AcquireBitstream() 分配coded bitstream缓冲区

ReleaseBitstream() 处理、保存coded bitstream

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

OnEndFrame() 编码后的统计工作

回调函数的调用顺序:

【GPU编解码】GPU硬编码 (转)第4张

免责声明:文章转载自《【GPU编解码】GPU硬编码 (转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#图解教程 第二十章 异步编程jenkins部署python语言webUI自动化项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

webpack2.x基础属性讲解

webpack作为构建工具平时作为前端作为优化、模块编程、和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x版本,webpack2的文档结构和代码提示都非常友善。 webpack从1.x升到2版,并没有作为大的更改改动,而且内部的接口文档形式也与1基本无修改,那么对...

vue前端上传图片并回显,同时获取文件的base64编码

<el-form-item label="部位缩略图:" required> <div class="upload-img" style=" 148px; height: 100px;" > <input type="file" ref="...

微信默认表情符号的代码对照表

之前有不少朋友问我,微信公众平台如何发带有表情符号的图片,其实只需要在信息里面插入表情代码就可以使用的。 微信表情对照表如下: 表情图片 字符串代码 替换关键字 /::) 微笑 /::~ 伤心 /::B 美女 /::| 发呆 /:8-) 墨镜 /::< 哭 /::$ 羞 /::X 哑 /::...

STM32程序中使用printf打印中文字符乱码

STM32程序printf打印中文字符到串口出现乱码解决方法 作者 : 李剀 出处 : https://blog.csdn.net/Kevin_8_Lee/ 或者 https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明。 谢谢! (以上两个链接均是我个人的博客,只是在不同的平台上面) 前言: 相信...

python之路 django基础

Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。 一、基本配置 1、创建Django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质...

Navigation Bar的简单设置

前面的一篇文章《iOS开发16:使用Navigation Controller切换视图》中的小例子在运行时,屏幕上方出现的工具栏就是Navigation Bar,而所谓UINavigationItem就可以理解为Navigation Bar中的内容,通过编辑UINavigationItem,我们可以使得在Navigation Bar中显示想要的东西,比如设置...