一、OpenCV中的硬编码
OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下。
- int main(int argc, const char* argv[])
- {
- if (argc != 2)
- {
- std::cerr << "Usage : video_writer <input video file>" << std::endl;
- return -1;
- }
-
- const double FPS = 25.0;
- cv::VideoCapture reader(argv[1]);
-
- if (!reader.isOpened())
- {
- std::cerr << "Can't open input video file" << std::endl;
- return -1;
- }
-
- cv::gpu::printShortCudaDeviceInfo(cv::gpu::getDevice());
- cv::gpu::VideoWriter_GPU d_writer;
-
- cv::Mat frame;
- cv::gpu::GpuMat d_frame;
-
- for (int i = 1;; ++i)
- {
- std::cout << "Read " << i << " frame" << std::endl;
- reader >> frame;
- if (frame.empty())
- {
- std::cout << "Stop" << std::endl;
- break;
- }
- cv::resize(frame,frame,cv::Size(704,576));
- if (!d_writer.isOpened())
- {
- std::cout << "Open GPU Writer" << std::endl;
-
- d_writer.open("output_gpu.avi", frame.size(), FPS);
- }
- d_frame.upload(frame);
- std::cout << "Write " << i << " frame" << std::endl;
- d_writer.write(d_frame);
- }
- 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) |
相关推荐
NVIDIA显卡H.264/H.265硬编解码参考文档,别的地方下载
x264源码及其配置文件,用于配置树莓派GPU硬件编解码,通过指定编码器h264_omx实现树莓派上的硬件编解码
这是一个用Ffmpeg进行h265编解码的实例,集成了demux,解码,编码相关的代码。
rk3568 rtsp拉流 mpp硬解码
基于FFmpeg和CUVID库内置的一套多视频源硬解码,硬编码框架,完成对多路视频文件或视频流的硬解码并硬编码成jpg图像用于人脸检测识别等场景。 进度 已完成一个三级流水线形式的视频解码框架,使用trylock形式避免...
Video.mp4 -> cuvid(GPU Decoder) -> GPU Memory -> Normialize Cuda Kernel -> float* Channel based -> DNN Inference 输入格式:支持的文件/USB摄像头/RTSP/RTMP/CustomStream等。 Normialize Kernel:减去...
使用 NVIDIA Video SDK API 进行 GPU 加速视频编码/解码的示例源码
本播放器支持软硬解码,硬解码采用的DXVA2, ffmpeg解码后,通过重写QOpenGLWidget,可以让YUV转RGB在GPU进行处理,减少对CPU的使用。音频播放采用的是QAudioOutput,通过setVolumn接口可以控制音量的大小。本播放器...
您可以替换sdk中的ffmpeg库以支持更多格式GPU解码器(由于qtmutimedia限制而硬编码,请参阅 优化的OpenGL渲染HDR色调映射建造从或下载sdk 将SDK提取到该目录中生成并安装。 在QtCreator中,您可以添加带有Make参数...
SoundPi 远场语音开发套件是一款软硬一体化的智能语音交互开发解决方案,采用 SoundAI 定制的量产麦克风阵列,集成全方向唤醒、声源测向、定向拾音、噪声抑制、混响消除、回声抵消、远场语音识别、语义理解、语音...