1、OpenCV视频I/O概述

OpenCV视频I/O模块是一组用于读取和写入视频或图像序列的类和功能。

基本上,该模块将cv :: VideoCapture和cv :: VideoWriter类作为2层接口提供给许多用作后端的视频I / O API

某些后端,例如(DSHOW)Direct Show,Windows视频(VFW),Microsoft Media Foundation(MSMF),Video 4 Linux(V4L)等,是操作系统提供的视频I / O库的接口。
其他一些后端,例如用于Kinect的OpenNI2,英特尔感知计算SDK,GStreamer,XIMEA相机API等,都是专有驱动程序或外部库的接口。

2、运行时选择后端
OpenCV运行时自动选择并使用第一个可用的后端(apiPreference=cv::CAP_ANY);

用于可以根据需要,选择要运行的后端。

这里重点来了:以Windows为例,我们下载或者编译的OpenCV默认都是使用FFmpeg库作为后端来记录,导致使用AVC1/AVC3/H.264编码,生成MP4视频时,编码都非常大,通常还需要结合思科的openh264-1.8.0-win64.dll动态库来使用。

在这里我们不采用FFmpeg库,而是选择Microsoft Media Foundation(MSMF)作为后端来生成视频(Windows系统默认都带有该视频播放器)。

对应到OpenCV源码,我们只需要更改下图画红线的码率设置,重新编译之后,就可以达到更改H.264视频码率的效果。

 3、C++调用:

cv::VideoWriter video("video.mp4", CAP_MSMF, cv::VideoWriter::fourcc('H', '2', '6', '4'), 25, cv::Size(frame_width, frame_height));

 生成视频的大小要比使用FFmpeg+openh264-1.8.0-win64.dll的方式小得多。

有其他方式修改码率的小伙伴,记得分享下你们的经验

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐