在Linux上用FFmpeg从OpenCV 3中编写x264
Writing x264 from OpenCV 3 with FFmpeg on Linux
我在使用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。这会生成一个有效且可解释的视频文件。"
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OpenCV C++.快速计算混淆矩阵
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 哪些库可以通过Opencv调整曝光率
- 安装opencv失败-粘贴CMakeError.log的内容
- C++中的openCV Mat访问冲突
- OpenCV Android C++ imwrite not found
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- C++ OpenCV 卡尔曼滤波器构造函数错误
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 如何使用OpenCV-C++编写*.mp4视频?
- 在Linux上用FFmpeg从OpenCV 3中编写x264