我无法通过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。关于标记不受支持的警告消失了,但生成的视频仍然无法读取。
我认为你的发现是关键:
具有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。
问题与显示的警告无关。我试图编写单通道图像,而VideoWriter期待一个3通道彩色图像(默认值为isColor,VideoWriter的构造函数的第5个参数,是“真”)。解决方案是将isColor设置为false。
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。这会生成一个有效且可解释的视频文件。”