本周编译了支持GPU的opencv源码(编译时间挺长的),并分别测试了使用H264,H265编码的视频读写情况。除此之外翻译了一篇pytorch官方的教程。
1 OpenCV读写H264,H265编码视频
测试了opencv读,写,拼接 H264,H265视频,下面是详细过程与结果。
1.1 读取H264,H265编码视频
分别使用opencv中的cv::VideoCapture(source) 读取 H264,H265编码后的视频,读取H264的视频一切正常,读取H265的视频整体正常,但提示丢失帧:

使用100帧H265编码视频测试发现读取正常,并没有少帧。所以,读取部分没有问题。
测试还发现,使用cv::VideoCapture(source) 读取的视频都是在cpu中进行解码处理。且解码后的帧为 BGR 数据,而不是YUV420,但并不影响后续拼接操作。
1.2 拼接
视频读取后便可很容易地获取每一帧,拼接部分只需要对每一帧进行操作即可。 BGR 数据反而解决了 UV 数据不可分的问题。
1.3 写视频
在视频写入之前的操作都没有什么大的问题,视频写入使用 cv::VideoWriter Class 进行操作。该类可以通过 VideoWriter::fourcc('H', 'E', 'V', 'C')选择编码方式。
当我们选择 H264 (VideoWriter::fourcc('X', '2', '6', '4'))编码时,提示信息如下:

提示缺少 openh264-1.6.0-win64msvc.dll 文件,OpenCV默认情况下没有编译此文件,可通过下载 openh264-1.6.0-win64msvc.dll.bz2 文件解决此问题。
当我们选择 H265 编码时,提示信息如下:

表示根本找不到此编码方式,opencv目前还不支持 H265 编码。官方论坛上此问题也没得到解决官方论坛相关问题
实验表明 OpenCV 虽然支持 H264,265的解码,但是对编码的支持不够友好,官方文档对此问题专门做出了说明,如下:

1.4 GPU解决方案
以上操作均是在CPU中处理实现,在查询并阅读opencv官方文档之后发现
cv::cudacodec::VideoReader Classcv::cudacodec::VideoWriter Classcv::cuda::GpuMat Class
等GPU中的视频读写,帧操作方法。但是资料较少,暂时还没有使用代码实现相应的功能,具体编解码支持情况还没调查清楚。
1.5 总结
实验表明,解码,拼接 部分,在 cpu 中能够正常完成。并且容易推测,在GPU中也能完成 解码,拼接部分任务。目前问题主要出在编码部分,视频编码不是OpenCV的主要关注点,目前仅能支持 H264的编码。
1.6 参考资料
- Video Input with OpenCV and similarity measurement
- Creating a video with OpenCV
- cv::VideoWriter Class Reference
- Video Codecs by FOURCC
- cv::cudacodec::VideoReader Class Reference
- cv::cuda::GpuMat Class Reference
- Similarity check (PNSR and SSIM) on the GPU
- cv::cudacodec::VideoWriter Class Reference