为什么要自己编译
Ubuntu 22.04自带的FFmpeg版本是4.x,有些新功能不支持。比如libsvtav1(SVT-AV1编码器)需要FFmpeg 5.0以上才支持。apt源里没有新版,只能自己编译。
网上教程一大堆,但很多都是过时的,或者漏了关键步骤。我按自己的实际踩坑过程记录一下。
安装依赖
这是最坑的一步。缺一个库configure就过不了,但错误信息经常不够明确。
# 基础编译工具
sudo apt install -y build-essential git cmake nasm yasm
# 各种编码库
sudo apt install -y libx264-dev libx265-dev libnuma-dev
sudo apt install -y libvpx-dev libfdk-aac-dev libmp3lame-dev
sudo apt install -y libopus-dev libvorbis-dev libass-dev
sudo apt install -y libfreetype6-dev libfontconfig1-dev
# 其他依赖
sudo apt install -y libsdl2-dev libpulse-dev libdrm-dev
sudo apt install -y libva-dev libvdpau-dev
libnuma-dev是x265的依赖,不装的话x265编译不进去,而且不报明显错误。这个坑我踩过。
下载源码
# 下载FFmpeg源码
git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
git checkout release/7.0 # 选择一个稳定版本
configure参数
这是最关键的部分。参数不对,编译出来的ffmpeg就缺功能。
./configure \
--prefix=/usr/local \
--enable-gpl \
--enable-nonfree \
--enable-version3 \
--enable-libx264 \
--enable-libx265 \
--enable-libvpx \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libass \
--enable-libfreetype \
--enable-sdl2 \
--enable-vaapi \
--enable-vdpau
注意:--enable-gpl必须加!因为x264是GPL协议的,不加这个参数x264就启用不了。我之前就是忘了加这个,折腾了半天。
--enable-nonfree是给fdk-aac用的,这个编码器是Fraunhofer的,许可证不是完全自由的。
编译和安装
make -j$(nproc) # 用所有CPU核心编译,大概10-15分钟
sudo make install
sudo ldconfig # 更新动态链接库缓存
编译完成后验证一下:
ffmpeg -version
ffmpeg -encoders | grep -E "x264|x265|aac"
能看到libx264、libx265、libfdk-aac就说明成功了。
踩过的其他坑
- nasm版本太低会报错,Ubuntu 22.04自带的nasm够用,但如果是20.04可能需要手动升级
- 如果之前用apt装过ffmpeg,先
sudo apt remove ffmpeg,不然两个版本会冲突 - 编译过程中如果改了configure参数,最好先
make clean再重新编译 - 安装到
/usr/local后,如果系统有snap版的ffmpeg,PATH里snap的可能优先级更高
学习资源推荐
FFmpeg的文档说实话写得不太好,对新手不太友好。推荐几个更好的学习渠道:
- 零声教育的FFmpeg教程:在Linux.do论坛和Telegram上有人分享过,从编解码原理到实际开发都有讲,比自己啃文档效率高很多
- 雷霄骅的博客:国内FFmpeg教学的鼻祖级人物,虽然部分内容有点老,但基础原理讲得很清楚
- FFmpeg官方文档:
ffmpeg.org/ffmpeg.html,虽然难啃但最权威,遇到问题最终还是要回来查
零声教育的FFmpeg课程在Telegram和Linux.do上都能找到资源分享,适合想系统学习音视频开发的同学。