因为虚拟机的交叉编译器是 Linaro GCC 4.9.4,编译不了新版的 ffmpeg(4.3+ 需要 C11,5.0+ 需要 C17)
所以,FFmpeg 版本:选择下载 ffmpeg 4.2.11,在虚拟机编译 动态库版 FFmpeg,移植到开发板。
FFmpeg 是一个多媒体框架,本身支持各种编解码器,但它不自带 x264 的 H.264 编码实现(出于
专利和 GPL 许可考虑)。
x264 是开源的 H.264(也叫 AVC)视频编码库。
如果希望 FFmpeg 能够生成 H.264 视频(例如做视频推流、录像),就必须让它链接 x264,所以,需要先编译 x264 并提供给 FFmpeg。
第一步:编译 x264
- 下载 x264 源码
git clone --branch stable https://code.videolan.org/videolan/x264.git
- 进入目录: cd x264
x264 配置交叉编译:
下面的路径 /home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm 根据自己的实际安装路径修改
命令行输入下面的命令,按回车
./configure \
--host=arm-linux \
--cross-prefix=arm-linux-gnueabihf- \
--prefix=/home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm \
--enable-static \
--disable-opencl \
--disable-cli \
--enable-pic
- 编译安装
make -j4
make install
第二步:编译 ffmpeg
- 下载 ffmpeg 4.2.11
wget https://ffmpeg.org/releases/ffmpeg-4.2.11.tar.xz
- 解压:
tar xf ffmpeg-4.2.11.tar.xz
3.进入目录
cd ffmpeg-4.2.11
ffmpeg 4.2.11 配置交叉编译:
下面的4个路径 /home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm 根据自己的实际安装路径修改
命令行输入下面的命令,按回车
export PKG_CONFIG_PATH=/home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm/lib/pkgconfig:$PKG_CONFIG_PATH
然后,命令行输入下面的命令,按回车
./configure \
--enable-cross-compile \
--arch=arm \
--cpu=cortex-a7 \
--target-os=linux \
--cross-prefix=arm-linux-gnueabihf- \
--enable-gpl \
--enable-libx264 \
--extra-cflags="-I/home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm/include" \
--extra-ldflags="-L/home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm/lib" \
--enable-avdevice \
--enable-indev=v4l2 \
--enable-muxer=mpegts \
--enable-muxer=rtp \
--enable-protocol=udp \
--enable-protocol=rtp \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-debug \
--enable-shared \
--disable-static \
--prefix=/home/leo/linux_c/tool/ffmpeg-4.2.11-install-arm
- 编译安装
make -j4
make install
进入自己的ffmpeg安装目录,查看,然后移植到开发板

|----------------------|------------------------------------|-------------------|
| 源目录 (虚拟机) | 目标目录 (开发板) | 说明 |
| bin/ffmpeg | /usr/local/bin/ 或 /opt/ffmpeg/bin/ | 主程序 |
| lib/libav*.so* | /usr/local/lib/ 或 /opt/ffmpeg/lib/ | FFmpeg 核心动态库及符号链接 |
| lib/libsw*.so* | /usr/local/lib/ 或 /opt/ffmpeg/lib/ | FFmpeg 核心动态库及符号链接 |
| lib/libpostproc.so* | /usr/local/lib/ 或 /opt/ffmpeg/lib/ | 后处理动态库 |
在虚拟机 NFS 挂载的开发板根文件系统,直接拷贝到开发板的根文件系统中。
移植 ffmpe 主程序
sudo cp bin/ffmpeg /home/leo/linux/nfs/ubuntu_rootfs/usr/local/bin/ -f
移植 FFmpeg 核心动态库及符号链接
sudo cp -a lib/libav*.so* /home/leo/linux/nfs/ubuntu_rootfs/usr/local/lib/ -f
sudo cp -a lib/libsw*.so* /home/leo/linux/nfs/ubuntu_rootfs/usr/local/lib/ -f
sudo cp -a lib/libpostproc.so* /home/leo/linux/nfs/ubuntu_rootfs/usr/local/lib/ -f
赋予可执行权限(以防万一)
sudo chmod +x /home/leo/linux/nfs/ubuntu_rootfs/usr/local/bin/ffmpeg
移植完毕。
在开发板上更新动态库缓存
- 把 /usr/local/lib 添加到动态链接器的搜索路径里。
echo "/usr/local/lib" >> /etc/ld.so.conf
- 刷新动态链接库缓存,扫描 ld.so.conf 指定的路径,把所有共享库的信息缓存起来。
ldconfig
- 验证是否部署成功
ffmpeg -version

输出显示 FFmpeg 已经成功编译,支持 V4L2 输入、x264 编码、UDP/RTP 协议等。
显示 libav* 版本都匹配,说明共享库也被正确加载了(不是静态链接)