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

18

我用OpenCV 3通过FFmpeg写H.264视频(“'X','2','6','4'” FOURCC)遇到了问题。目前为止我已经看过所有相关的SO帖子,但是都没有帮助。代码如下:

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)'中不受支持,退回使用标签0x00000021/'!???'

生成的视频非常小(字节),无法读取。将four_cc设置为-1会从FFmpeg获得“未知标签”,我没有像其他人建议的选择编解码器的提示。

OpenCV 3文档说明:

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

他们所引用的页面上没有列出h264 / x264,并且我不确定如何解释该声明,因为早期的SO帖子似乎都将X.2.6.4列为适当的代码。实际上,使用H.2.6.4会产生相同的输出。

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

P.S. ffmpeg是最新的Ubuntu维护者,它列出了使用--enable-libx264进行配置。

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


1
我无法确定如何解决这个问题,但是VideoWriter并不是很强大。你可能需要使用一些可用的格式保存视频,然后再使用ffmpeg转换为H264格式。 - Miki
@Miki 如果你知道一种正确地将OpenCV矩阵转换为x264_picture_t以直接使用x264的方法,那可能会起作用。我尝试过将其转换为YUV_I420并手动设置x264_picture_t的字段,但迄今为止失败了。 - Greg Kramida
3个回答

11

我认为你在这里的发现是关键:

  

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

ffmpeg实现的mp4标签值证实了这一点,并且存在于isom.c中的ff_mp4_obj_type[]中。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

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

供参考,我的软件版本为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版本。


1
这很有趣。我也在Linux上,将isColor标志设置为false对我非常有帮助。无论你遇到了什么问题,显然与我的不同,所以,如果你仍然对来自OpenCV的直接mp4输出感兴趣,我建议你发布一个单独的问题,描述你的问题并参考此问题。我还建议我们将这个对话转移到私人聊天中,以遵守SO的首选QA格式。我可以在那里提供我的编译标志。 - Greg Kramida

8

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


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

5

在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);

正如Jameson在上面评论的那样,

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


Opencv的FOURCC转换方式与FFMPEG不兼容。正确的方法是硬编码0x21!对我有用! - Menilik Belay Woldeyes
我真的不明白为什么调试信息会显示“回退使用标签0x21”,那么回退难道不应该与硬编码的0x21标签相同吗? - Jodo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接