使用 ffmpeg 构建 opencv 时出错

Posted

技术标签:

【中文标题】使用 ffmpeg 构建 opencv 时出错【英文标题】:Error in building opencv with ffmpeg 【发布时间】:2018-04-03 17:24:46 【问题描述】:

我按照这个article安装了ffmpeg。 ffmpeg 安装没问题。 现在我用 ffmpeg 支持构建 opencv,但我有一些错误。 错误是

/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp:1484:21: error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope
         c->flags |= CODEC_FLAG_GLOBAL_HEADER;
                     ^
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp: In function ‘int icv_av_write_frame_FFMPEG(AVFormatContext*, AVStream*, uint8_t*, uint32_t, AVFrame*)’:
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp:1512:30: error: ‘AVFMT_RAWPICTURE’ was not declared in this scope
     if (oc->oformat->flags & AVFMT_RAWPICTURE) 
                              ^
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp: In member function ‘void CvVideoWriter_FFMPEG::close()’:
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp:1686:35: error: ‘AVFMT_RAWPICTURE’ was not declared in this scope
         if( (oc->oformat->flags & AVFMT_RAWPICTURE) == 0 )
                                   ^
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp: In member function ‘bool CvVideoWriter_FFMPEG::open(const char*, int, double, int, int, bool)’:
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp:1920:32: error: ‘AVFMT_RAWPICTURE’ was not declared in this scope
     if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) 
                                ^
In file included from /home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg.cpp:45:0:
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp: In static member function ‘static AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext*, AVCodecID, int, int, int, double, AVPixelFormat)’:
/home/coie/Softwares/Libraries/opencv-2.4.13.3/modules/highgui/src/cap_ffmpeg_impl.hpp:2214:25: error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope
             c->flags |= CODEC_FLAG_GLOBAL_HEADER;
                         ^
modules/highgui/CMakeFiles/opencv_highgui.dir/build.make:230: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/src/cap_ffmpeg.cpp.o' failed
make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/cap_ffmpeg.cpp.o] Error 1
CMakeFiles/Makefile2:2349: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/all' failed

可能出了什么问题?

【问题讨论】:

与 Ubuntu 16.04、来自 github 的 ffmpeg 和 opencv 3.3.0 的相同问题。 @Anonymous 是我的 Ubuntu 16.04 和 opencv 2.4.13.4。如何解决问题? 那是版本冲突。 OpenCV 尚未更新以匹配 ffmpeg 的最新版本。我从这个链接 (ffmpeg.org/releases) 更改为早期版本的 ffmpeg 并使用 --enable-shared 标志编译,现在可以了。 【参考方案1】:

我的解决方案是使用 grep -r 从 FFmpeg grep 缺少的定义(总共 2 个),这会导致在 libavcodec/avcodec.h 中找到以下代码:

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

复制粘贴到:

opencv-3.3.0/modules/videoio/src/cap_ffmpeg_impl.hpp

编译,即使使用最新的源代码也能正常工作

【讨论】:

也适用于 opencv 3.2。 我在 ubuntu 16 上的 opencv 3.4 也需要这个。 这可能会解决编译错误,但可能会引入新问题。您需要检查AVFMT_RAWPICTURE 0x0020 的定义在您正在构建的OpenCV 代码中是否有意义。但是,如果这个videoio 模块根本不是您关注的焦点,那么以这种方式解决编译错误应该没问题。 适用于 raspi 3+ 上的 OpenCV 3.2【参考方案2】:

在 opencv:0/2.4 中没有 modules/videoio 目录!为了让旧版本(2.4.13-r3)在 gentoo(4.1.3)上使用最新的 media-video/ffmpeg 进行编译,我必须将上述更改添加到 modules/highgui/src/cap_ffmpeg_api.hpp 补丁:

--- opencv-2.4.13/modules/highgui/src/cap_ffmpeg_api.hpp        2019-05-27 13:28:05.736339890 +0200
+++ opencv-2.4.13-new/modules/highgui/src/cap_ffmpeg_api.hpp    2019-05-27 13:27:48.787198507 +0200
@@ -12,6 +12,10 @@
 #define OPENCV_FFMPEG_API
 #endif

+#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
+#define CODEC_FLAG_GLOBAL_HEADER 
AV_CODEC_FLAG_GLOBAL_HEADER
+#define AVFMT_RAWPICTURE 0x0020
+
 enum
 
     CV_FFMPEG_CAP_PROP_POS_MSEC=0,

(即我使用该内容创建了路径和文件 /etc/portage/patches/media-libs/opencv-2.4.13-r3/old-ffmpeg.patch。) 为了保护 gentoo,我应该提一下,新的 media-libs/opencv:0/3.4.1 也可用,旧的 media-video/ffmpeg-3.4.5 也是可用的,所以我也可以选择屏蔽掉版本或提交错误供开发人员为我执行此操作...

【讨论】:

【参考方案3】:

CODEC_FLAG_GLOBAL_HEADER 最简单的更改是将其更改为 AV_CODEC_FLAG_GLOBAL_HEADER,它已在较新的版本中重新定义。

注意前面的“AV_”

【讨论】:

以上是关于使用 ffmpeg 构建 opencv 时出错的主要内容,如果未能解决你的问题,请参考以下文章

在jupyter笔记本电脑中使用opencv时出错:

使用 MacPorts 构建 openCV 时出错

使用opencv构建项目时出错

使用 Cuda 10.2 构建 OpenCV 2.4xx 时出错

使用 Ffmpeg 构建和使用 OpenCV 作为静态库

导入 OpenCV python 模块时出错(使用 Qt 和 QtOpenGL 构建时)