在Linux上使用FFmpeg从OpenCV 3编写x264

我无法通过FFmpeg(“X”,“2”,“6”,“4”,FOURCC)使用OpenCV 3编写h264video。 到目前为止,我已经看到所有相关的post,但没有任何帮助。 码:

cv::VideoWriter writer(output_path.string(), CV_FOURCC('X','2','6','4'), 60, frame_size); 

输出:

OpenCV:FFMPEG:标记0x34363258 /'X264'不支持编解码器ID 28和格式'MP4 / MP4(MPEG-4 Part 14)'OpenCV:FFMPEG:回退使用标记0x00000021 /'!???'

由此产生的video非常小(按字节),不可读。 设置four_cc为-1的结果来自FFmpeg的“未知标签”,我没有得到任何提示select其他人build议的编解码器。

OpenCV 3文档指出:

带MP4容器的FFMPEG后端本身使用其他值作为fourcc代码:请参阅ObjectType ,因此您可能会收到来自OpenCV的关于fourcc代码转换的警告消息。

这个页面他们没有列出h264 / x264,我不知道如何解释这个声明,因为早先的SOpost似乎都列出了X.2.6.4作为适当的代码。 使用H.2.6.4实际上给出相同的输出。

任何build议/解决方法?

PS的ffmpeg是最新的Ubuntu维护者,它列出它configuration了--enable-libx264

编辑:我试图使用mkv容器,而不是mp4。 关于标签不被支持的警告消失了,但是由此产生的video仍然是不可读的。

我认为你的发现是关键:

带MP4容器的FFMPEG后端本身使用其他值作为fourcc代码:请参阅ObjectType,因此您可能会收到来自OpenCV的关于fourcc代码转换的警告消息。

ffmpeg实现的mp4标记值在ff_mp4_obj_type[]证实了这一点,并在ff_mp4_obj_type[]中。 OpenCV的cap_ffmpeg_impl.hpp的代码可能需要更新以支持这一点。 我捅了一两个钟头,意识到这是不平凡的,并获得保释。

一个解决方法是输出到一个.avi文件。 有很多人在OpenCV和MP4上遇到麻烦,被告知使用.mov.avi 。 ( 这是一个 )

@Greg克拉米达:设置isColor = false对我没有帮助:消息仍然存在,我的输出文件变成只有~48字节。 根据文档,这是一个Windows标志 – 无论它在Linux上为我做什么,这是不好的。

你确认你可以用ffmpeg自己生成x264吗?

在命令行调用此命令后,确认libx264的值为0x21:

 ffmpeg -i x264-input.mp4 -vcodec libx264 -f mp4 x264-output.mp4 

我决定直接使用0x21VideoWriter.open() 。 这会生成一个有效的可解释的视频文件。

作为参考,我的软件是ffmpeg 3.0:

 ffmpeg -version ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.9.2 (Debian 4.9.2-10) configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc=`gcc -fPIC` --enable-libfdk-aac --enable-libx265 --enable-nonfree --enable-libmp3lame libavutil 55. 17.103 / 55. 17.103 libavcodec 57. 24.102 / 57. 24.102 libavformat 57. 25.100 / 57. 25.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 31.100 / 6. 31.100 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100 

和OpenCV 3.1.0一起配置:

 cmake \ -D WITH_IPP=ON \ -D INSTALL_CREATE_DISTRIB=ON \ -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=/usr/local .. 

x264是Debian Jessie的libx264-142:amd64发行版。

这个问题与显示的警告无关。 我试图写单通道图像,而VideoWriter期待3通道彩色图像(默认值isColor,VideoWriter构造函数的第5个参数是“true”)。 解决方法是将isColor设置为false。