基于FFmpeg的代码在Ubuntu GCC编译报错:未识别AVCodecParameters等符号
解决Ubuntu 16.04 GCC编译FFmpeg代码时API/结构体未识别的问题
这问题我在帮人排查FFmpeg跨平台编译时碰到过好多次,核心原因其实很明确:Ubuntu 16.04默认自带的FFmpeg版本太老了。你提到的AVCodecParameters结构体、avcodec_send_packet和avcodec_receive_frame函数,都是FFmpeg 3.1版本才正式引入的新API,而Ubuntu 16.04的官方软件源里,FFmpeg的版本还是2.8.x,根本不支持这些新特性,所以编译时才会报“未声明”的错误。
下面给你两种可行的解决办法,按需选择:
方法一:手动编译安装最新版FFmpeg(推荐)
这种方式能让你获得完整的FFmpeg新API支持,而且版本可控:
- 先卸载系统自带的旧版FFmpeg及开发库:
sudo apt remove --purge ffmpeg libavcodec-dev libavformat-dev libavutil-dev sudo apt autoremove && sudo apt clean - 安装编译所需的依赖工具和编码库:
sudo apt install build-essential yasm cmake libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev - 下载FFmpeg源码(这里以最新稳定版为例,你也可以去官网选特定版本):
git clone https://git.ffmpeg.org/ffmpeg.git cd ffmpeg - 配置编译参数(按需开启需要的功能,下面是常用的配置):
./configure --prefix=/usr/local --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libfdk-aac --enable-libmp3lame - 编译并安装(
-j$(nproc)会用到所有CPU核心,加速编译):make -j$(nproc) sudo make install - 验证安装成功:
看到版本号在3.1以上就没问题了。之后编译你的代码时,用下面的命令确保链接到新安装的库:ffmpeg -versiongcc your_ffmpeg_code.c -o your_program $(pkg-config --cflags --libs libavcodec libavformat libavutil)
方法二:通过第三方PPA安装较新的FFmpeg版本(适合不想编译的用户)
如果不想手动编译,可以用第三方PPA直接安装FFmpeg 4.x版本(支持16.04):
- 添加PPA源:
sudo add-apt-repository ppa:jonathonf/ffmpeg-4 - 更新软件源并安装:
sudo apt update && sudo apt install ffmpeg libavcodec-dev libavformat-dev libavutil-dev - 同样用
pkg-config来编译你的代码,确保链接到新安装的库即可。
额外提示
- 编译前可以先确认当前系统的FFmpeg版本:
ffmpeg -version或者pkg-config --modversion libavcodec,确认是不是低于3.1。 - 如果你的代码里还有其他FFmpeg新API,也要对应确认版本兼容性,避免再次出现类似错误。
- 要是编译时还是找不到库,可以检查
pkg-config的路径,确保能识别到新安装的FFmpeg库。
内容的提问来源于stack exchange,提问作者StarShine
相关产品推荐
相关产品推荐

