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

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

【GPU编解码】GPU硬编码 (转)的更多相关文章
- 【视频开发】GPU编解码:GPU硬解码---DXVA
GPU编解码:GPU硬解码---DXVA 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反 ...
- 【GPU编解码】GPU硬编码
一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. int main(int argc, ...
- 【GPU编解码】GPU硬解码---CUVID
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...
- 【GPU编解码】GPU硬解码---DXVA
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 【GPU编解码】GPU硬解码---DXVA (转)
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 视频编解码---x264用于编码,ffmpeg用于解码
项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时间.将自己的最终成果记录于此,期望会给其他人提供些许帮助. 参考教程: http://ffmpeg.org/trac/ffm ...
- [编解码] 关于base64编码的原理及实现
转载自: http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html [Base64]-base64的编码都是按字符串长度,以每3个8b ...
- 图像压缩编解码实验(DCT编码+量化+熵编码(哈夫曼编码))【MATLAB】
课程要求 Assignment IV Transform + Quantization + Entropy Coding Input: an intra-frame or a residue pict ...
- 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)
原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...
随机推荐
- 【ES】代码例子
#!/usr/bin/env python #coding=utf-8 from elasticsearch import Elasticsearch from elasticsearch_dsl i ...
- Codeforces 448C Painting Fence(分治法)
题目链接:http://codeforces.com/contest/448/problem/C 题目大意:n个1* a [ i ] 的木板,把他们立起来,变成每个木板宽为1长为 a [ i ] 的栅 ...
- poj2019 二维RMQ模板题
和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> # ...
- C# byte数组与Image的相互转换【转】
功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte ...
- Myeclipse调试模式下自动提示变量值设置
1.Window->Preferences->Java->Editor->Hovers 将[Variable Values]选择即可,如果第一个[Combined Hover] ...
- 《转》Web Service实践之——开始XFire
Web Service实践之——开始XFire 一.Axis与XFire的比较XFire是与Axis2 并列的新一代WebService平台.之所以并称为新一代,因为它:1.支持一系列Web Serv ...
- 《剑指offer》-找到数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- Asp.NetMVC和WebForm的请求生命周期
1.MVC的执行过程 用户 ---->控制器--->ViewData进行传值--->视图(进行显示) 2.Controller中的Action 主要进行的作用: 1.处理用户的请求 ...
- django 2中的app_name和namespace
最近看<精通DJANGO>里遇到的疑惑. 简书URL如下: https://www.jianshu.com/p/404500a0408a 其中的官方解释: 应用命名空间 它表示正在部署的应 ...
- jsp统计页面访问量和刷访问量的简单使用
~Jsp可以进行简单的页面访问量统计,当然也可以使用Jsp刷访问量. 1:第一种使用全局变量<%! int i=0;%>进行页面的访问量统计,只有新打开一个浏览器才可以进行统计. 2:第二 ...