我知道在OpenCV中还有其他问题涉及FFmpeg的使用,但是大多数问题似乎已经过时了 .
通过在CMake中打开makefile,我可以验证我已经打开了 WITH_FFMPEG
标志 . 我的OpenCV版本的输出文件夹包含一个 bin
文件夹,其中包含 Debug
和 Release
个文件夹,每个文件夹都包含一个名为 opencv_ffmpeg244.dll
的.dll文件的副本 . 当我创建一个VideoWriter并验证指向.dll的函数指针是否正确填充时,我可以进入OpenCV的源代码 . 这似乎很有效 .
如果我使用CV_FOURCC_PROMPT的FOURCC代码,则以下编解码器 work properly :
-
Microsoft Video 1
-
Intel IYUV编解码器
-
罗技视频(I420)
由Radius撰写的 -
Cinepak编解码器
-
全帧(未压缩)
以下编解码器 do not work properly (即生成0kb视频文件):
- Microsoft RLE
如果我的理解是正确的,使用FFMPEG应该允许使用一大堆新的编解码器(x264,DIVX,XVID等)编码视频 . 但是,这些都不会出现在提示中 . 使用宏 CV_FOURCC(...)
通过FOURCC代码手动设置它们也不起作用 . 例如,使用: CV_FOURCC('X','2','6','4')
生成消息:
Could not find encoder for codec id 28: Encoder not found
并制作一个大小为0kb的视频文件 .
使用此: CV_FOURCC('X','V','I','D')
不会产生任何错误消息,并生成6kb的视频文件,该文件无法在Windows Media Player或VLC中播放 .
我尝试从Xvid.org手动下载Xvid编解码器 . 安装完成后,它会出现在提示符下的VFW选项下,并且编码正常 . 所以它接近一个解决方案,但如果我尝试直接设置FOURCC代码,它仍然会失败,如上所述!我每次都必须从提示中选择它 . 是不是FFmpeg应该包含一大堆编解码器?如果是这样,为什么我手动下载编解码器而不是使用FFmpeg内置的编解码器?
我在这里错过了什么?有没有办法检查FFMPEG是"enabled"?似乎提示中唯一可用的编解码器是VFW编解码器,而不是FFMPEG编解码器 . .dll
已经构建并且与可执行文件位于同一文件夹中,但它似乎没有以任何方式使用 .
这里有很多相关的问题 . 希望找到一些了解OpenCV中FFmpeg实现的人,并了解所有这些部分是如何组合在一起的 .
3 回答
如何分别运行ffmpeg和你的应用程序并使用管道数据传输图像?
将视频导入opencv程序,
和录音等
program.exe应该能够从stdin读取连接的jpeg图像并将其写入stdout,上述工作流程将起作用 . 这是从stdin读取并显示视频的一些代码 .
写输出这样的东西应该工作 .
上面的问题是jpegs的多重编码/解码,可以通过与libjpeg-turbo链接来部分解决 . 或者可以去弄清楚如何直接从ffmpeg和opencv传递原始数据 . 对于我的情况,这是完全可以接受的,因为大部分开销是在编码或视频处理中 .
部分方式
我使用了CV_FOURCC('x','2','6','4')虽然它选择了正确的编解码器,但我的默认设置是错误的,我不确定如何正确设置它们 .
相关的c源
您的设置失败,因为ffmpeg为您创建了一个XVID编解码器但无法操作它 . 因此,您获得无效文件 .
幸运的是,XVID编解码器已在VfW中注册,因此您只需删除opencv_ffmpeg * .dll库即可将其禁用 . 一旦不使用ffmpeg,你的fourcc“xvid”将通过VfW机制触发正确的编解码器 .