博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【计算机视觉】【并行计算与CUDA开发】GPU硬编码
阅读量:5329 次
发布时间:2019-06-14

本文共 1774 字,大约阅读时间需要 5 分钟。

一、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.检测是否支持NVCUVENC

2.新建编码器,设置编码类型

3.设置编码参数,注册回调函数

4.创建编码器相关资源

5.循环编码每帧数据

6.删除编码器,释放资源

伪代码示意图如下所示,其中编码前缓冲区的分配,以及编码后的数据处理都由回调函数。

回调函数说明:

AcquireBitstream() 分配coded bitstream缓冲区

ReleaseBitstream() 处理、保存coded bitstream

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

OnEndFrame() 编码后的统计工作

回调函数的调用顺序:

转载于:https://www.cnblogs.com/huty/p/8517788.html

你可能感兴趣的文章
B+树介绍
查看>>
redux-effect
查看>>
Swift和OC混编
查看>>
深度学习文献阅读笔记(6)
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
[PHP] excel 的导入导出
查看>>
SDL(01-10)
查看>>
网络爬虫基本原理(一)
查看>>
IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
查看>>
Android Studio 创建/打开项目时一直处于Building“project name”Gradle project info 的解决...
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
FastReport.Net使用:[18]形状(Shape)控件用法
查看>>
asp.net学习笔记1
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
sed用法
查看>>
codeforces 1041A Heist
查看>>
centos 7 升级python2.7 到3.5
查看>>