2019-周报4

本周编译了支持GPU的opencv源码(编译时间挺长的),并分别测试了使用H264,H265编码的视频读写情况。除此之外翻译了一篇pytorch官方的教程。

1 OpenCV读写H264,H265编码视频

测试了opencv读,写,拼接 H264,H265视频,下面是详细过程与结果。

1.1 读取H264,H265编码视频

分别使用opencv中的cv::VideoCapture(source) 读取 H264,H265编码后的视频,读取H264的视频一切正常,读取H265的视频整体正常,但提示丢失帧:

图1.h265-read

使用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'))编码时,提示信息如下:

图2.opencv-h264-write

提示缺少 openh264-1.6.0-win64msvc.dll 文件,OpenCV默认情况下没有编译此文件,可通过下载 openh264-1.6.0-win64msvc.dll.bz2 文件解决此问题。

当我们选择 H265 编码时,提示信息如下:

图3.opencv-h265-write

表示根本找不到此编码方式,opencv目前还不支持 H265 编码。官方论坛上此问题也没得到解决官方论坛相关问题

实验表明 OpenCV 虽然支持 H264,265的解码,但是对编码的支持不够友好,官方文档对此问题专门做出了说明,如下:

图4.The structure of a video

1.4 GPU解决方案

以上操作均是在CPU中处理实现,在查询并阅读opencv官方文档之后发现

  • cv::cudacodec::VideoReader Class
  • cv::cudacodec::VideoWriter Class
  • cv::cuda::GpuMat Class

等GPU中的视频读写,帧操作方法。但是资料较少,暂时还没有使用代码实现相应的功能,具体编解码支持情况还没调查清楚。

1.5 总结

实验表明,解码,拼接 部分,在 cpu 中能够正常完成。并且容易推测,在GPU中也能完成 解码,拼接部分任务。目前问题主要出在编码部分,视频编码不是OpenCV的主要关注点,目前仅能支持 H264的编码。

1.6 参考资料

2 pytorch官方资料翻译

深入理解TORCH.NN

Share Comments