简介:面向音视频开发者的 FFmpeg n5.1.2 开发库,适合希望在 Windows 平台完成编译、链接与二次开发的中初级工程师及课程实践者使用。包体共 377 个文件,以 274 个 C 头文件、23 个源文件及 14 个动态库、8 个静态库和 8 个 .lib 导入库为主,另有可执行程序、pkg-config 配置、预设与说明文档,压缩包约 9.12MB,便于直接集成或对照构建。已有 2464 人学习下载,说明其版本与目录组织具备较高参考价值。读者可获得 libavcodec、libavformat、libavfilter、libavutil 等模块的头文件与库文件,配合附带的编译说明了解库的生成与链接方式,并围绕 AVPacket、AVFrame、AVFormatContext、AVCodecContext 及过滤器链开展解码、转码、推流和媒体分析练习,快速搭建可复用的音视频开发环境。
1. 从一次头文件错配说起:FFmpeg n5.1.2 开发库到底装什么
装 FFmpeg n5.1.2 开发库这件事,最容易被低估的不是编译命令,而是版本和路径。某开发者在一个音视频转码 Demo 里直接用了系统自带的 FFmpeg 头文件,项目要求 FFmpeg n5.1.2 的 API,编译时一路警告,链接时又报找不到符号,查了半天才发现pkg-config指向旧库。这套开发库在 FFmpeg 音视频开发环境里很常见:需要 include 头文件、lib 动态库或静态库、pkgconfig 描述文件,装不好不是“跑不起来”那么简单,而是头文件和运行库各指一个版本,排错像黑匣子。适合正在接 FFmpeg 5.1.2 做封装、转码、播放器或滤镜链的开发者,也适合需要多版本共存的人。
2. 环境准备与版本取舍:FFmpeg n5.1.2 依赖清单和路径规划
FFmpeg n5.1.2 开发库不是拷一个.so就能用,编译器、构建工具、pkg-config 和运行库路径要一起对上。我一般先确认机器上有没有旧版本 FFmpeg,再看pkg-config能不能找到它,最后决定是覆盖安装还是独立 prefix 共存。音视频项目最怕“头文件是新的、链接的是旧的”,所以版本取舍要先于安装动作。
2.1 编译器、构建工具与 pkg-config 的最低要求
最小环境需要 C 编译器、make、pkg-config、解压工具,以及 x86 平台上的汇编器。FFmpeg 的 configure 会检查这些工具,缺一个就可能停在C compiler test failed或nasm/yasm not found。下表是我常见的检查项,版本只作为下限参考,实际以机器上能稳定编译为准。
| 组件 | 建议下限 | 检查命令 | 用途 |
|---|---|---|---|
| GCC/Clang | GCC 9 或相近版本 | gcc --version | 编译 C 代码和 configure 探测 |
| make | 4.x | make --version | 驱动构建 |
| pkg-config | 0.29 以上 | pkg-config --version | 读取.pc描述文件 |
| nasm 或 yasm | 2.x | nasm -v或yasm --version | x86 汇编优化 |
| zlib 开发包 | 发行版自带 | pkg-config --exists zlib && echo ok | 部分封装格式和工具需要 |
Debian 系和 RHEL 系的包名不完全一样,下面两组命令按机器选择,不要两边都执行。安装依赖时我习惯只装最小闭环需要的包,libx264、libx265、fdk-aac这类可选编码器等主流程跑通后再加,避免第一次 configure 就因为某个第三方库路径不对翻车。
# Debian 系:安装编译链、pkg-config、汇编器和 zlib 开发包 sudo apt-get update sudo apt-get install -y build-essential pkg-config nasm yasm zlib1g-dev # RHEL 系:包名不同,按发行版选择 sudo dnf groupinstall -y "Development Tools" sudo dnf install -y pkgconf-pkg-config nasm yasm zlib-develbuild-essential带的是 GCC、make 和基础头文件;pkgconf-pkg-config提供pkg-config命令;nasm和yasm二选一即可,FFmpeg 的 x86 汇编优化会优先找 nasm。zlib1g-dev或zlib-devel不是所有构建都必须,但后面跑ffmpeg命令行工具时经常用到,先装省事。装完不要只看命令有没有报错,逐条跑一遍版本检查,确认pkg-config真的在 PATH 里。
# 逐项确认工具链可见,避免 configure 阶段才发现缺命令 gcc --version | head -n 1 make --version | head -n 1 pkg-config --version nasm -v || yasm --versionhead -n 1只取首行版本,输出太长反而看不清;nasm -v || yasm --version表示两个汇编器有一个能用就行。如果这里pkg-config提示 command not found,不要急着编译 FFmpeg,先把包管理器的开发工具组补齐。汇编器缺失时也可以临时用--disable-x86asm绕过,但音视频转码和滤镜链的性能会受影响,能装还是装。
2.2 多版本共存时 prefix 怎么定
我一般不给 FFmpeg n5.1.2 用/usr/local默认前缀,而是放到/opt/ffmpeg-n5.1.2。原因很直接:系统里可能已经有发行版自带的 FFmpeg,项目 A 依赖旧版,项目 B 要 n5.1.2,全部塞进/usr/local后,pkg-config、ldconfig和 IDE 的 include 路径会互相打架。独立 prefix 的好处是卸载时直接删目录,回滚时换一个环境变量脚本就行,不用去系统目录里翻旧文件。
# 统一前缀,后面 configure、pkg-config、CMake 都引用这个变量 export FFMPEG_PREFIX=/opt/ffmpeg-n5.1.2 export PKG_CONFIG_PATH="$FFMPEG_PREFIX/lib/pkgconfig:${PKG_CONFIG_PATH:-}" export LD_LIBRARY_PATH="$FFMPEG_PREFIX/lib:${LD_LIBRARY_PATH:-}" export PATH="$FFMPEG_PREFIX/bin:$PATH"${PKG_CONFIG_PATH:-}的作用是变量未定义时给空值,避免set -u的脚本直接退出;把新路径放在冒号前面,保证pkg-config先命中 n5.1.2 的.pc文件。LD_LIBRARY_PATH只是运行时兜底,长期项目更稳的做法是给可执行文件写 rpath,或者把 prefix 下的 lib 路径写进单独的ld.so.conf.d配置文件。PATH放到最前面是为了让ffmpeg、ffprobe命令优先用这套 n5.1.2,而不是系统旧版。
这套变量不要直接写进/etc/profile给所有用户用,除非这台机器就是专用构建机。我习惯存成~/ffmpeg-n5.1.2.env,进项目终端时source一下,退出终端就失效。这样同一台机器上跑两个项目时,切环境只是切一个脚本,不会出现“昨天还能编译,今天换了终端就找不到库”的玄学问题。
2.3 依赖库的取舍:先跑通最小闭环再开可选编码器
FFmpeg n5.1.2 开发库的核心是libavcodec、libavformat、libavutil、libswscale、libswresample这几块。第一次 configure 时,我建议只开共享库和开发头文件,不要一上来就--enable-libx264 --enable-libx265 --enable-libvpx全开。每加一个外部编码器,就多一个pkg-config查找路径和 ABI 匹配问题,排错面会迅速变大。先让最小 C 程序能 include 头文件、链接库、跑出版本号,再按项目实际用到的编码器逐个补。
可选依赖的路径也要注意:如果第三方库装在/opt/deps下,configure 需要--extra-cflags="-I/opt/deps/include"和--extra-ldflags="-L/opt/deps/lib",否则它会去系统路径找旧版本。静态链接时还要加--pkg-config-flags=--static,但静态链接的许可证和运行时依赖要单独评估,不要为了“拷一个二进制就能跑”把问题留到发布阶段。开发库阶段先用共享库,调试时ldd和readelf都更容易看清依赖关系。
3. 获取与解压开发库:目录结构、文件类型和校验习惯
拿到 FFmpeg n5.1.2 开发库后,先别急着往项目里加 include 路径。开发库压缩包通常包含头文件、库文件、pkgconfig 描述文件和命令行工具,目录层级如果被解压错,后面pkg-config找得到.pc却找不到.so,或者头文件路径多一层ffmpeg-n5.1.2,都会让编译命令看起来对、实际跑不通。先看清结构,再定解压位置。
3.1 压缩包里的 include、lib、pkgconfig 各是什么
一个典型的开发库目录会包含include/libavcodec/avcodec.h、include/libavformat/avformat.h、include/libavutil/avutil.h,以及lib/libavcodec.so、lib/libavformat.so、lib/pkgconfig/libavcodec.pc这类文件。头文件给编译器看,.so给链接器和运行时看,.pc给 pkg-config 看,三者缺一不可。Windows 开发库还会多一个bin目录放 DLL,Linux 下动态库一般在lib或lib64。
# 解压后先看三层结构,不急着配置项目 find ffmpeg-n5.1.2-dev -maxdepth 3 -type d | sort find ffmpeg-n5.1.2-dev -maxdepth 3 -name "*.pc" -o -name "avcodec.h" | sort-maxdepth 3限制目录深度,避免一上来刷出几千个文件;第二条命令同时找.pc和avcodec.h,用来确认头文件和 pkgconfig 是否在同一套 prefix 下。如果avcodec.h在include/libavcodec/下,而.pc在lib/pkgconfig/下,说明目录结构是标准 prefix,可以直接解压到/opt/ffmpeg-n5.1.2。如果多出一层ffmpeg-n5.1.2-dev/ffmpeg-n5.1.2-dev/include,就要么改解压路径,要么在编译参数里补这一层,不要让项目去猜。
Windows 开发库的目录通常是include、lib、bin并排。Visual Studio 项目里把include加到附加包含目录,lib加到附加库目录,附加依赖项写avformat.lib;avcodec.lib;avutil.lib;swscale.lib;swresample.lib,运行时把bin下的 DLL 放到 exe 同目录。不要只配了库目录就以为能跑,DLL 不在 PATH 或 exe 旁边,运行时会直接弹找不到模块。
3.2 解压路径与权限:不要放在 /usr/local 默认前缀就完事
如果开发库压缩包已经是编译好的 prefix 结构,我一般直接解压到/opt/ffmpeg-n5.1.2,再把属主改成当前构建用户。这样pkg-config路径、头文件路径和库路径天然对齐,后面写 CMake 或 Makefile 时只需要一个FFMPEG_PREFIX。不要图省事覆盖/usr/local/lib,那里可能还有别的项目依赖的旧版.so,覆盖后系统里其他程序可能先坏掉。
# 创建独立 prefix,解压后确认权限和顶层目录 sudo mkdir -p /opt/ffmpeg-n5.1.2 sudo tar -xf ffmpeg-n5.1.2-dev.tar.gz -C /opt/ffmpeg-n5.1.2 --strip-components=1 sudo chown -R "$(id -u):$(id -g)" /opt/ffmpeg-n5.1.2 ls /opt/ffmpeg-n5.1.2--strip-components=1用来去掉压缩包最外层目录,避免解压成/opt/ffmpeg-n5.1.2/ffmpeg-n5.1.2-dev/include;如果压缩包本身没有外层目录,这个参数会少解一层,解压前先tar -tf看一眼。chown把 prefix 交给当前用户,后面make install或替换库文件不用每次 sudo。ls只确认顶层有include、lib、bin,不展开全部文件。
如果拿到的是源码包而不是预编译开发库,就不要往/opt/ffmpeg-n5.1.2里直接解压源码再编译,源码目录和安装 prefix 分开。源码放~/src/ffmpeg-n5.1.2,构建目录放~/build/ffmpeg-n5.1.2,安装 prefix 仍然是/opt/ffmpeg-n5.1.2。这样出问题时删构建目录不影响源码,删 prefix 也不影响源码,回滚成本低。
3.3 校验文件完整性和 ABI 标记
开发库最怕半截文件:压缩包传输中断、解压时磁盘满、.so软链接指向一个不存在的 soname,都会在链接阶段报奇怪错误。我一般先看压缩包校验值,再看.so的软链接和 soname 是否成对。没有校验值文件时,至少用file和readelf确认库文件不是文本占位符,也不是空文件。
# 校验压缩包,检查动态库的 soname 和软链接 sha256sum ffmpeg-n5.1.2-dev.tar.gz file /opt/ffmpeg-n5.1.2/lib/libavcodec.so* readelf -d /opt/ffmpeg-n5.1.2/lib/libavcodec.so | grep SONAMEsha256sum的输出要和提供方给的校验值一致;file应该显示 ELF shared object,不是 ASCII text;readelf -d里的SONAME是运行时加载用的名字,libavcodec.so通常是指向带 soname 文件的软链接。如果软链接断了,pkg-config --libs仍然会给-lavcodec,但链接器会报cannot find -lavcodec。这种时候不要改项目链接参数,先把 prefix 下的软链接修好。
ABI 标记也要看一眼:同一套 include 头文件和 lib 库必须来自同一个 n5.1.2 开发库。有人把新头文件覆盖到旧 lib 目录,编译能过,运行时却因为结构体布局或函数签名不一致崩掉。确认.pc文件里的prefix和实际解压路径一致,确认pkg-config --variable=prefix libavcodec输出/opt/ffmpeg-n5.1.2,基本就能排除“头库分家”。
4. 编译安装 FFmpeg n5.1.2:configure 参数逐项拆解
如果手头是源码包,编译这一步决定后面项目能不能稳定链接。FFmpeg 的 configure 参数很多,但开发库场景不需要全开。我的习惯是:独立 prefix、共享库、保留头文件、关文档和调试符号,先不接外部编码器。这样编出来的 n5.1.2 开发库体积可控,pkg-config文件完整,项目接入时问题最少。
4.1 最小可用的 configure 组合
先在源码目录外建构建目录,再调用源码里的configure。下面这组参数是我在开发库场景下常用的最小组合,--prefix指向独立目录,--enable-shared生成动态库,--disable-static先不生成静态库,--enable-pic保证共享库可被其他共享库链接,--disable-doc跳过文档构建,--disable-debug减少调试符号。第一次编译不要加--enable-gpl和外部编码器,等主流程验证完再按需追加。
# 源码目录和构建目录分开,prefix 指向独立安装位置 mkdir -p ~/build/ffmpeg-n5.1.2 cd ~/build/ffmpeg-n5.1.2 /opt/src/ffmpeg-n5.1.2/configure \ --prefix=/opt/ffmpeg-n5.1.2 \ --enable-shared \ --disable-static \ --enable-pic \ --disable-doc \ --disable-debug--prefix决定make install后头文件、库和.pc文件落到哪里,必须和项目里引用的FFMPEG_PREFIX一致。--enable-shared让多个项目共用同一套库,调试时也方便替换;--disable-static不是必须,如果项目要交付单文件二进制,可以改成--enable-static并处理依赖库的静态链接。--enable-pic对共享库很重要,缺少位置无关代码时,其他共享库链接它可能报 relocation 错误。--disable-doc和--disable-debug是构建瘦身项,不影响开发库的头文件和.pc文件。
configure 跑完后不要只看最后一行,翻一下输出里的Enabled和Disabled列表,确认shared是 yes,static是 no,doc是 no。如果输出里出现nasm/yasm not found,要么装汇编器,要么临时加--disable-x86asm。如果出现某个外部库 not found,而项目并不需要它,不要为了消掉提示乱加--enable-*,先让最小组合过。
4.2 共享库、静态库和开发头文件的开关
开发库场景最常见的取舍是共享库还是静态库。共享库的优点是多个项目共用、升级库不用重编项目、ldd能直接看到依赖;缺点是发布时要带.so,运行时路径要配。静态库的优点是交付简单,缺点是每个可执行文件都变大,第三方依赖的许可证和链接顺序也更麻烦。我一般开发阶段用共享库,发布前再评估是否切静态。
# 共享库方案:生成 .so 和 pkgconfig,项目用 pkg-config 链接 ./configure --prefix=/opt/ffmpeg-n5.1.2 --enable-shared --disable-static --enable-pic # 静态库方案:需要额外处理依赖库和链接顺序,不要和共享库混装在同一 prefix ./configure --prefix=/opt/ffmpeg-n5.1.2-static --enable-static --disable-shared --enable-pic共享库和静态库不要装进同一个 prefix,否则pkg-config --libs可能同时给出-lavcodec,链接器优先选.so还是.a取决于搜索顺序,排查起来很费劲。静态库方案单独建/opt/ffmpeg-n5.1.2-static,项目需要时切PKG_CONFIG_PATH。--enable-pic对静态库也有意义,后面如果要把静态库链进共享库,没有 PIC 会报错。
头文件是开发库的另一半。FFmpeg 默认会在make install时安装 include 下的所有公共头文件,不需要额外加--enable-headers之类的参数。装完后检查/opt/ffmpeg-n5.1.2/include/libavcodec/avcodec.h是否存在,pkg-config --cflags libavcodec是否能输出-I/opt/ffmpeg-n5.1.2/include。如果头文件在,但pkg-config的 cflags 是空的,说明.pc文件里的includedir写错了,回到 prefix 结构查。
4.3 make 与 install 阶段要观察的输出
configure 通过后,make -j$(nproc)并行编译,make install安装到 prefix。并行数不要盲目拉满,内存小的机器用-j4或-j2更稳,否则编译到一半被 OOM 杀掉,报错信息还不一定明显。make install时注意看它有没有安装.pc文件,以及软链接是否创建成功。
# 并行编译并安装到独立 prefix make -j"$(nproc)" sudo make install # 安装后确认 pkgconfig、头文件和动态库都在位 find /opt/ffmpeg-n5.1.2 -maxdepth 3 \ \( -name "*.pc" -o -name "avcodec.h" -o -name "libavcodec.so*" \) | sort-j"$(nproc)"用 CPU 核数做并行度;内存不足时改成固定数字。sudo make install是因为/opt目录通常需要权限,如果 prefix 已经chown给当前用户,可以不加 sudo。最后一条find同时查.pc、头文件和动态库,三者都在同一 prefix 下才算安装完整。只看到ffmpeg可执行文件不算开发库装好,项目要的是头文件和链接库。
如果make install报权限错误,不要直接chmod 777,先确认 prefix 属主,或者用DESTDIR安装到临时目录再搬。编译失败时先看config.log,再看ffbuild/config.log这类构建日志,里面会记录 configure 探测编译器和依赖库的完整命令。我一般把config.log留一份,后面换机器复现时直接对比,比凭记忆猜参数靠谱。
5. 常见问题与排查:FFmpeg n5.1.2 开发库装坏后的救法
开发库装坏的表现通常不是“完全没反应”,而是编译能过、链接报错,或者链接能过、运行找不到库。下面这几条是我踩坑比较多的场景,按现象、原因、解决拆开记。每条都先别急着改项目代码,先用pkg-config、ldd、readelf把路径和版本看清楚。
5.1 现象:编译报libavcodec/avcodec.h: No such file or directory
原因通常不是 FFmpeg 没装,而是编译器没拿到-I路径,或者拿到的路径多了一层目录。有人把开发库解压到/opt/ffmpeg-n5.1.2/ffmpeg-n5.1.2-dev/include,项目里却写-I/opt/ffmpeg-n5.1.2/include,自然找不到。另一种情况是pkg-config命中了系统旧版.pc,cflags 指向/usr/include,而系统里没有对应头文件。
解决先从pkg-config查起,确认它给出的 include 路径和实际文件一致:
# 查 pkg-config 实际给出的头文件路径和变量 pkg-config --cflags libavcodec pkg-config --variable=includedir libavcodec ls "$(pkg-config --variable=includedir libavcodec)/libavcodec/avcodec.h"如果--cflags输出为空,或者includedir指向错误位置,检查PKG_CONFIG_PATH是否把/opt/ffmpeg-n5.1.2/lib/pkgconfig放在最前面。CMake 项目里不要手写include_directories(/usr/include),用pkg_check_modules的 imported target,让路径跟着.pc走。确认文件存在但编译仍找不到时,看编译命令里有没有-I被后面的-I/usr/include覆盖,头文件搜索顺序也会影响结果。
5.2 现象:链接报undefined reference to ...或库顺序错误
原因多半是链接顺序不对,或者新旧库混用。Linux 链接器从左到右解析库,-lavformat依赖-lavcodec,-lavcodec又依赖-lavutil,顺序写反就可能找不到符号。另一种情况是项目里同时出现-L/usr/lib和-L/opt/ffmpeg-n5.1.2/lib,链接器先命中旧库,旧库里没有 n5.1.2 的符号。
解决时直接用pkg-config --libs的输出顺序,不要手工重排:
# 让 pkg-config 给出完整链接参数,放在源文件后面 cc main.c -o ffmpeg_probe $(pkg-config --cflags --libs libavformat libavcodec libavutil)$(...)会把 cflags 和 libs 展开到编译命令里,库参数放在源文件后面,符合链接器从左到右的解析顺序。如果必须静态链接,加--pkg-config-flags=--static,并确认依赖库也有静态版本。链接报错里出现undefined reference时,先用nm -D看目标.so里有没有这个符号,再看ldd链接到的到底是哪个路径,不要凭感觉加-l。
5.3 现象:运行时报error while loading shared libraries: libavcodec.so...
原因很明确:编译时找到了库,运行时动态加载器没找到。常见于 prefix 不在/usr/lib,又没有配LD_LIBRARY_PATH或 rpath。有人编译时用-L/opt/ffmpeg-n5.1.2/lib,运行时就以为会自动记住,实际上链接路径和运行时搜索路径是两回事。
解决有三种方式,按项目交付方式选:
# 方式一:当前终端临时指定运行时库路径 export LD_LIBRARY_PATH=/opt/ffmpeg-n5.1.2/lib:${LD_LIBRARY_PATH:-} ./ffmpeg_probe # 方式二:编译时写 rpath,适合交付单个可执行文件 cc main.c -o ffmpeg_probe \ $(pkg-config --cflags --libs libavformat libavcodec libavutil) \ -Wl,-rpath,/opt/ffmpeg-n5.1.2/lib # 方式三:系统级配置,专用构建机再用 echo "/opt/ffmpeg-n5.1.2/lib" | sudo tee /etc/ld.so.conf.d/ffmpeg-n5.1.2.conf sudo ldconfigLD_LIBRARY_PATH只影响当前终端,适合临时调试;-Wl,-rpath把路径写进可执行文件,发布时不用再配环境变量,但路径固定,换机器要重新编;ld.so.conf.d是系统级方案,专用构建机可以用,普通开发机不建议把所有版本都塞进去。配置完用ldd ./ffmpeg_probe看libavcodec指向哪个路径,确认不是系统旧版。
5.4 现象:pkg-config --modversion libavcodec返回旧版本
原因通常是PKG_CONFIG_PATH顺序不对,或者系统.pc文件在默认搜索路径里先命中。pkg-config会按路径顺序找.pc,新路径放在后面就被旧版抢先。容器里更常见:镜像自带 FFmpeg 开发包,项目又装了一套 n5.1.2,但环境变量只在交互式 shell 里生效,CI 脚本里没source。
解决先看当前命中的 prefix,再决定是改路径还是隔离搜索目录:
# 看当前命中的 .pc 来自哪里,以及版本号 pkg-config --variable=prefix libavcodec pkg-config --modversion libavcodec # 只允许搜索指定目录,适合 CI 里强制使用 n5.1.2 export PKG_CONFIG_LIBDIR=/opt/ffmpeg-n5.1.2/lib/pkgconfig--variable=prefix直接告诉你当前用的是哪套库,比只看版本号更直观。PKG_CONFIG_LIBDIR会替换默认搜索目录,适合 CI 里强制隔离;本地开发机如果还要用系统其他.pc文件,就只用PKG_CONFIG_PATH前置,不要设PKG_CONFIG_LIBDIR。改完重新跑pkg-config --cflags --libs,确认路径和版本都指向 n5.1.2。
5.5 现象:configure 报nasm/yasm not found或C compiler test failed
原因分两类:汇编器缺失,或者编译器本身不可用、依赖头文件缺失。nasm/yasm not found不一定致命,可以用--disable-x86asm绕过,但性能会降;C compiler test failed要认真看config.log,里面会记录测试程序编译失败的原因,常见是缺少 zlib 头文件、编译器路径不对、或者CFLAGS里混入了不存在的 include 路径。
解决先读日志,再决定补依赖还是改参数:
# 看 configure 失败的具体编译命令和错误 grep -n "error:" config.log | head -n 20 grep -n "C compiler test failed" -A 20 config.log # 临时绕过汇编器,只用于确认主流程 ./configure --prefix=/opt/ffmpeg-n5.1.2 --enable-shared --disable-static --disable-x86asmgrep -n "error:"只取前 20 条,避免日志刷屏;-A 20把失败上下文带出来。不要一看到nasm缺失就永久关掉汇编优化,先装汇编器是更稳的做法。--disable-x86asm只适合临时验证,编出来的库能用,但转码和滤镜性能会受影响。configure 通过后记得回到完整参数重新编一次,别把临时绕过当成最终配置。
6. 装完怎么验证跑通:从ffmpeg -version到最小解码程序
开发库装完,我至少要跑三层验证:命令行工具版本、pkg-config 路径、最小 C 程序链接和运行。只跑ffmpeg -version不够,它只能证明可执行文件在,不能证明头文件和库文件对得上。下面这套验证顺序是我每次装完新 prefix 都会走的,花不了几分钟,但能提前挡住大部分“编译时好好的、运行时找不到库”的问题。
6.1 命令行工具与库版本交叉核对
先让ffmpeg、ffprobe和pkg-config互相印证。ffmpeg -version看构建配置和库版本,pkg-config --modversion看开发库描述文件,which ffmpeg看命令来自哪个 prefix。三者指向同一个 n5.1.2 安装目录,才算命令行层面闭环。
# 命令行工具、pkg-config、实际路径三方核对 which ffmpeg ffprobe ffmpeg -version | head -n 5 pkg-config --modversion libavcodec libavformat libavutil pkg-config --variable=prefix libavcodecwhich的输出应该是/opt/ffmpeg-n5.1.2/bin/ffmpeg,如果还是/usr/bin/ffmpeg,说明PATH没生效。ffmpeg -version首行会带版本信息,下面几行是构建配置,确认--prefix和共享库状态符合预期。pkg-config --modversion一次查三个包,输出应来自 n5.1.2 的.pc文件,不是系统旧版。
6.2 编译一个最小 C 程序验证头文件和链接
写一个只打印版本号的小程序,能同时验证 include 路径、链接参数和运行时加载。代码不涉及具体编解码逻辑,排除业务代码干扰。编译命令用pkg-config生成,不要手写-I和-l,这样项目里的 CMake 或 Makefile 也能照搬同样的路径逻辑。
#include <stdio.h> #include <libavutil/avutil.h> #include <libavcodec/avcode <p> <a href="https://download.csdn.net/download/qq_43627907/86759392" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>