交叉编译 FFmpeg 完整指南:从 x264 到 RK3588 部署实战
工具链:aarch64-none-linux-gnu
目标平台:RK3588 ARM64 开发板
1. 引言
在嵌入式开发中,经常需要在性能强大的主机上编译目标平台的软件。本文记录使用 aarch64-none-linux-gnu 工具链交叉编译 FFmpeg 的完整过程,包括依赖库 x264 的编译,以及在 RK3588 开发板上的部署和测试。
2. 环境准备
2.1 交叉编译工具链
首先确保交叉编译工具链已正确安装并配置:
bash
# 添加工具链到 PATH
export PATH=$PATH:~/sdk/toolchain/bin
# 验证工具链
aarch64-none-linux-gnu-gcc --version
输出应显示类似:

2.2 获取源代码
bash
# 创建编译目录
mkdir -p /crossCompiling
cd /crossCompiling
# 获取 FFmpeg 源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
# 获取 x264 源码
git clone https://code.videolan.org/videolan/x264.git
3. 编译 x264 库
x264 是 H.264 视频编码器,FFmpeg 需要它来支持 H.264 编码。
3.1 配置编译环境
bash
cd x264
# 创建安装目录
mkdir aaa
# 配置x264
./configure \
--prefix=/crossCompiling/x264/install \ # 安装路径
--host=aarch64-none-linux-gnu \ # 目标平台
--cross-prefix=aarch64-none-linux-gnu- \ # 工具链前缀
--enable-shared \ # 生成动态库
--enable-static \ # 生成静态库
--disable-asm \ # 禁用汇编优化(避免ARM指令集兼容性问题)
--enable-pic \ # 生成位置无关代码(动态库必需)
--bit-depth=8 \ # 8位深度(RK3588硬件支持)
--chroma-format=all # 支持所有色度格式
3.2 编译和安装
bash
make -j4 && make install
3.3 验证编译结果
检查生成的库文件:
bash
ls /crossCompiling/x264/aaa/lib/

应该看到 libx264.so 等库文件。
4. 编译 FFmpeg
4.1 解决pkg-config路径问题
pkg-config需指定x264的pkg-config文件路径,否则FFmpeg无法找到x264依赖:
bash
# 临时设置(永久生效需写入~/.bashrc)
export PKG_CONFIG_PATH=/crossCompiling/x264/install/lib/pkgconfig:$PKG_CONFIG_PATH
# 验证x264 pkg-config配置
pkg-config --libs x264

4.2 配置 FFmpeg
bash
cd /crossCompiling/ffmpeg
# 创建安装目录
mkdir aaa
# 配置FFmpeg
./configure \
--cross-prefix=aarch64-none-linux-gnu- \ # 工具链前缀
--enable-cross-compile \ # 启用交叉编译模式
--target-os=linux \ # 目标系统
--arch=aarch64 \ # 目标架构
--cc=aarch64-none-linux-gnu-gcc \ # C编译器
--cxx=aarch64-none-linux-gnu-g++ \ # C++编译器(可选,部分功能需要)
--prefix=/crossCompiling/ffmpeg/aaa\ # 安装路径
# 依赖库配置
--extra-cflags="-I/crossCompiling/x264/aaa/include -fPIC" \ # x264头文件+位置无关编译
--extra-ldflags="-L/crossCompiling/x264/aaa/lib -lx264"" \ # x264库路径
# 功能配置
--enable-shared \ # 生成动态库
--enable-static \ # 生成静态库
--enable-gpl \ # 启用GPL协议(x264依赖)
--enable-libx264 \ # 启用x264支持
--enable-ffmpeg \ # 编译ffmpeg主程序
--enable-ffprobe \ # 编译ffprobe(媒体信息查询工具)
--disable-ffplay \ # 禁用ffplay(RK3588无GUI时无需)
--disable-doc \ # 禁用文档(加快编译)
--disable-debug \ # 禁用调试信息(减小文件体积)
--enable-small \ # 优化文件体积
# RK3588硬件特性(可选,需驱动支持)
--enable-neon \ # 启用ARM NEON指令集加速
--enable-hardcoded-tables \ # 硬编码查表(提升性能)
若需启用RK3588硬件编解码,需额外集成Rockchip MPP库,需在配置时添加--enable-mpp及对应库路径,具体需参考Rockchip官方SDK文档。
4.3 编译和安装
bash
make -j4 && make install
5. 部署到 RK3588
5.1 文件整理
编译完成后,在 /crossCompiling/ffmpeg/aaa 目录中可以看到:
bin/ # ffmpeg, ffprobe 可执行文件
lib/ # 共享库文件
include/ # 头文件(部署不需要)
share/ # 文档文件(部署不需要)
部署到 RK3588 只需要:
bin/目录中的所有可执行文件lib/目录中的所有.so共享库文件
5.2 创建部署包传输到 RK3588
bash
# 创建精简部署目录
mkdir -p ffmpeg_for_rk3588/{bin,lib}
# 复制必要文件
cp /crossCompiling/ffmpeg/aaa/bin/ffmpeg /crossCompiling/ffmpeg/aaa/bin/ffprobe ffmpeg_for_rk3588/bin/
cp /crossCompiling/ffmpeg/aaa/lib/*.so* ffmpeg_for_rk3588/lib/
cp /crossCompiling/x264/aaa/lib/libx264.so* ffmpeg_for_rk3588/lib/
# 打包
tar -czf ffmpeg_rk3588.tar.gz ffmpeg_for_rk3588/
我这边是执行文件放置在/usr/bin,lib库放在/usr/lib64下
6. 测试和验证
6.1 基本功能测试
bash
# 验证 FFmpeg 版本
ffmpeg -version

bash
# 检查编解码器支持
ffmpeg -codecs | grep h264

6.2 RTSP 流测试
录制 RTSP 流:
bash
ffmpeg -rtsp_transport tcp -i "rtsp://username:password@192.168.1.100:554/stream" -c copy -y recorded_video.mp4
7.总结与优化建议
本文完成了从x264依赖编译到FFmpeg部署RK3588的全流程,核心在于正确配置交叉编译工具链和依赖库路径。后续可从以下方向优化:
- 集成更多依赖库:如fdk-aac(音频编码)、libmp3lame(MP3编码)、libvpx(VP9编码),拓展FFmpeg格式支持。
- 硬件编解码深度整合:基于Rockchip MPP库开发FFmpeg硬件编解码插件,充分利用RK3588的硬件性能,转码效率可提升3-5倍。
- 编译优化:使用-O2优化等级(配置时添加--extra-cflags="-O2"),平衡性能与文件体积。
- 静态编译:若需在无依赖环境下运行,可配置--disable-shared --enable-static生成静态链接的ffmpeg,文件体积较大但无需依赖动态库。