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

Writing x264 from OpenCV 3 with FFmpeg on Linux

本文关键字:x264 OpenCV Linux 上用 FFmpeg      更新时间:2023-10-16

我在使用OpenCV 3通过FFmpeg("'X','2','6','4'"FOURCC)编写h264视频时遇到问题。到目前为止,我已经在so上看到了所有相关的帖子,但没有任何帮助。代码:

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

输出:

OpenCV:FFMPEG:编解码器id不支持标记0x4363258/"X264"28和格式"mp4/mp4(MPEG-4第14部分)"OpenCV:FFMPEG:回退到使用标记0x00000021/'!???'

生成的视频非常小(按字节),无法读取。将four_cc设置为-1会导致FFmpeg中的"未知标签",我不会像其他人建议的那样得到任何选择编解码器的提示。

OpenCV 3文档说明:

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

他们引用的页面没有列出h264/x264,我不知道如何解释该语句,因为之前的SO帖子似乎都将X.2.6.4列为合适的代码。使用H.2.6.4实际上可以得到相同的输出。

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

附言:ffmpeg是Ubuntu维护人员提供的最新版本,它列出了它配置了--enable-libx264

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

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

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

ffmpeg实现的mp4标签值证实了这一点,并且在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是Debian Jessie的libx264-142:amd64版本。

问题与显示的警告无关。我正试图编写单通道图像,而VideoWriter则希望得到一个3通道的彩色图像(VideoWriter构造函数的第5个参数isColor的默认值为"true")。解决方案是将isColor设置为false。

OpenCV上的问题,消息是:

OpenCV:FFMPEG:编解码器id 28和格式"mp4/mp4(MPEG-4第14部分)"不支持标记0x4363248/"H264"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。这会生成一个有效且可解释的视频文件。"