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


我无法通过FFmpeg(“'X','2','6','4'”FOURCC)用OpenCV 3编写h264视频。到目前为止,我已经看过所有相关帖子了,但没有任何帮助。码:

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 /'!???'

生成的视频非常小(按字节)并且不可读。将four_cc设置为-1会导致来自FFmpeg的“未知标记”,我没有像其他人建议的那样提示选择编解码器。

OpenCV 3文档指出:

MPMPEG后端与MP4容器本身使用其他值为fourcc   代码:看 对象类型,因此您可能会收到OpenCV的警告消息   关于fourcc代码转换。

他们引用的那个页面没有列出h264 / x264,我不确定如何解释该语句,因为 早期的SO帖子 似乎都将X.2.6.4列为适当的代码。使用H.2.6.4实际上提供相同的输出。

有什么建议/解决方法吗?

附: ffmpeg是最新的Ubuntu维护者,它列出了它配置的 --enable-libx264

编辑: 我试图使用mkv容器而不是mp4。关于标记不受支持的警告消失了,但生成的视频仍然无法读取。


4284
2017-12-01 15:31


起源

我不知道如何解决这个问题,但是 VideoWriter 功能不是很强大。您可能需要使用某种工作格式保存视频,然后使用ffmpeg转换为H264。 - Miki
@Miki如果你知道一种方法将opencv矩阵正确转换为x264_picture_t直接使用x264,那可能会有效。我尝试过转换为YUV_I420并手动设置x264_picture_t的字段,但到目前为止都失败了。 - Greg Kramida


答案:


我认为你的发现是关键:

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

实现的mp4标记值 ffmpeg 确认这一点,并在 ff_mp4_obj_type[],在 isom.c。 OpenCV中的代码 cap_ffmpeg_impl.hpp 可能需要更新以支持这一点。我捅了一两个小时,意识到这是非平凡的,并且被保释了。

一种解决方法是输出到 .avi 文件。有许多人在使用OpenCV和mp4时遇到问题,并被告知要使用 .mov 要么 .avi。 (这是一个。)

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

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

在我在命令行上调用它时确认libx264的值为0x21:

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

我决定用 0x21 直接进入 VideoWriter.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是 libx264-142:amd64 发布Debian Jessie。


5
2018-02-19 10:31



这很有趣。我也在Linux上,并设置 isColor 旗帜到假为我带来了所有的不同。无论你遇到什么问题,它显然与我的不同,所以,如果你仍然对OpenCV的直接mp4输出感兴趣,我建议你发一个单独的问题来描述你的问题,引用这个问题。我还建议我们将这个对话用于私人聊天,以坚持SO的首选QA格式。我可以在那里提供我的编译标志。 - Greg Kramida


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


4
2017-12-03 16:50



在进行投票时,请考虑解释投票以帮助改进答案。 - Greg Kramida
这个答案已经有几年了,但我还是遇到了同样的问题。我在OSX上使用OpenCV 3.2.0和ffmpeg编译 openh264。对我来说,将第五个参数设置为 True 要么 False 或者遗漏它没有任何区别。我有什么其他想法可以调试这个吗? - kramer65
@ kramer65,我强烈建议发布一个单独的问题,并参考这个,说这个不是你遇到的问题(即isColor标志没有区别)。我唯一的建议 - 尝试X264和H264代码。另外,在Linux上,需要安装libx264开发库,而不是openh264 ...我不知道是否有适用于OSX的软件包。 - Greg Kramida


OpenCV上的问题是:

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

它由CV_FOURCC('H','2','6','4')的定义产生,该值与isom.c上定义的值不对应。

{AV_CODEC_ID_H264,0x21}

然后将fourcc定义为0x21 cv :: VideoWriter工作顺利,

cv::VideoWriter VF;
VF.open(filename,0x21,fps,frameSize,true);

正如詹姆森在上面的评论,

“我决定直接在VideoWriter.open()中使用0x21。这会生成一个有效且可解释的视频文件。”


1
2017-09-07 17:49