qidao123.com技术社区-IT企服评测·应用市场

标题: 编译日记:关于编译opencv带有ffmpeg视频解码支持的多少办法 [打印本页]

作者: 三尺非寒    时间: 2025-5-10 16:02
标题: 编译日记:关于编译opencv带有ffmpeg视频解码支持的多少办法
编译日记:关于编译opencv带有ffmpeg视频解码支持的多少办法

前言

​ 笔者这里是封装了简单的OpenCV视频播放抽象,然后却发现移植到Ubuntu和开辟板上都罢工的事变,原来是Windows平台下我们是默认下载了ffmpeg的库的,但是在泛Linux平台下却不一定,因此,我们须要自己手动的构建ffmpeg + opencv团结编译。
​ 值得一题的是,因为笔者这里的IMX6ULL上没有硬件解码芯片,因此笔者须要自己客制化ffmpeg,所以这里笔者计划先容一下ffmpeg的编译方式 + OpenCV如何进一步的进行调整
编译ffmpeg

​ 由于我当时是想将ffmpeg同时用在作为QMultiMedia的后端,因此我下载了我利用的Qt6.8.3推介的ffmpeg分支:
  1. git clone --branch n7.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg
复制代码
​ 这个是文档中给出的,地址在Building FFmpeg from source on Linux | Qt Multimedia | Qt 6.9.0,当然,你可以自己选择根据自己项目标ffmpeg,这里跟我们的OpenCV编译是没有关系的,但是ffmpeg的接口在不同的版本不一样,所以你最好是看看opencv要的是哪个版本的接口(看Documentations),笔者因为编译的是最新的OpenCV4.12.0,所以这个branch的ffmpeg当然能用。
​ 下载好了ffmpeg后,写一个构建脚本表明自己须要哪些东西被编译:
  1. ➜  cat auto.sh
  2. ./configure \
  3.   --prefix=/home/charliechen/imx6ull/ffmpeg-arm-dynamic \
  4.   --cross-prefix=arm-linux-gnueabihf- \
  5.   --target-os=linux \
  6.   --arch=arm \
  7.   --enable-cross-compile \
  8.   --disable-static \
  9.   --enable-shared \
  10.   --disable-doc \
  11.   --disable-programs \
  12.   --disable-everything \
  13.   --enable-avformat \
  14.   --enable-avcodec \
  15.   --enable-avutil \
  16.   --enable-swresample \
  17.   --enable-swscale \
  18.   --enable-decoder=mp3,aac,flac,h264 \
  19.   --enable-demuxer=mp3,aac,flac,h264,mov,matroska \
  20.   --enable-parser=mp3,aac,h264 \
  21.   --enable-protocol=file \
  22.   --disable-network \
  23.   --disable-iconv \
  24.   --disable-zlib \
  25.   --disable-bzlib \
  26.   --disable-encoders \
  27.   --disable-muxers \
  28.   --disable-filters \
  29.   --disable-hwaccels \
  30.   --disable-postproc \
  31.   --disable-debug \
  32.   --extra-cflags="-O2 -march=armv7-a -mfpu=neon -mfloat-abi=hard"
复制代码
​ 这里笔者阐明一下这些参数的寄义,这里是交叉编译成动态库的版本,笔者发现默认的OpenCV是须要ffmpeg动态库的,当然你可以设置CMake要的FFMPEG是静态毗连,但是笔者没有尝试,这个留给大家尝试

​ 为了UBuntu上位机也Mirror一份环境,我们只须要轻微改一下架构即可。
  1. ./configure \
  2.   --prefix=/home/charliechen/imx6ull/ffmpeg-x86 \
  3.   --target-os=linux \
  4.   --disable-static \
  5.   --enable-shared \
  6.   --disable-doc \
  7.   --disable-programs \
  8.   --disable-everything \
  9.   --enable-avformat \
  10.   --enable-avcodec \
  11.   --enable-avutil \
  12.   --enable-swresample \
  13.   --enable-swscale \
  14.   --enable-decoder=mp3,aac,flac,h264 \
  15.   --enable-demuxer=mp3,aac,flac,h264,mov,matroska \
  16.   --enable-parser=mp3,aac,h264 \
  17.   --enable-protocol=file \
  18.   --disable-network \
  19.   --disable-iconv \
  20.   --disable-zlib \
  21.   --disable-bzlib \
  22.   --disable-encoders \
  23.   --disable-muxers \
  24.   --disable-filters \
  25.   --disable-hwaccels \
  26.   --disable-postproc \
  27.   --disable-debug
复制代码
  PS:如果交叉编译它告诉你LD的时候文件格式非法,转向make clean清理构建的同时export LD=/path/to/cross_compile_ld即可,阐明LD毗连器照旧用了宿主机的。
  OpenCV对接

​ OpenCV的对接上,笔者看了非常多的博客,发现这些博客对pkgconfig和CMake构建系统的认知匮乏,绕了好大的弯子,现实上,完全可以通过给定pkgconfig的环境变量解决这个事变。
上位机的编译

​ 对于上位机的编译,我们跟往常一样,只须要在同一个shell中给定pkgconfig的搜索路径即可
  1. export PKG_CONFIG_PATH=/path/to/x86/ffmpeg/lib/pkgconfig;$PKG_CONFIG_PATH  # 指向检索ffmpeg的pkgconfig路径即可
复制代码
​ 之后,我们在同一个环境下起cmake-gui,让cmake-gui继续环境变量,就可以让CMake找到我们的ffmpeg了,留意的是,让CMake决议认为ffmpeg不存在的原因非常多,如果你如许搞不定,去检索FFMPEG的cmake文件下打日记解决,看看哪些地方被否掉了导致判定ffmpeg不存在。
​ 须要留意的是,你必须看到如许的结果日记:
  1. --   FFMPEG:                      YES
  2. --     avcodec:                   YES (ver x.x.x)
  3. --     avformat:                  YES (ver x.x.x)
  4. --     avutil:                    YES (ver x.x.x)
  5. ...
复制代码
​ 任何一点不一样,你的ffmpeg就会集成失败,题目留到背面是很麻烦的,立马解决。
下位机ARM32编译

​ OpenCV禁掉了利用PKG_CONFIG_PATH来指定交叉编译库路径的大概。
  1. OpenCV disables pkg-config to avoid using of host libraries. Consider using PKG_CONFIG_LIBDIR to specify target SYSROOT
复制代码
​ 这个事变我们的CMake日记就告诉了我们的解决方案,是转向定义:
  1. export PKG_CONFIG_LIBDIR=/path/to/arm/ffmpeg/lib/pkgconfig;$PKG_CONFIG_LIBDIR
复制代码
​ 现在就可以了。然后剩下的设置如法炮制即可。没有任何其他的变革!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4