Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南

1. 引言

本流程适用于在 Ubuntu 22.04 PC 上使用 aarch64-linux-gnu- 交叉编译工具链,编译支持 Rockchip MPP 硬件加速的 FFmpeg,并部署到 RK3568 开发板。

2. 环境准备

2.1 安装依赖

bash 复制代码
sudo apt update
sudo apt install -y git pkg-config yasm build-essential

2.2 安装 ARM64 内核头文件

bash 复制代码
sudo apt install -y linux-libc-dev-arm64-cross

2.3 创建工作目录

bash 复制代码
mkdir -p ~/ffmpeg_build
cd ~/ffmpeg_build

3. 克隆源码

bash 复制代码
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg

4. 编译 MPP 库

bash 复制代码
cd ~/ffmpeg_build/rkmpp/build/linux/aarch64

# 修改 mpp_dmabuf.c 使用绝对路径
sed -i 's|#include <linux/dma-buf.h>|#include "/usr/aarch64-linux-gnu/include/linux/dma-buf.h"|' ~/ffmpeg_build/rkmpp/osal/mpp_dmabuf.c

# 清理缓存(首次可跳过)
rm -rf CMakeCache.txt CMakeFiles

# 编译
./make-Makefiles.bash

# 安装到临时目录
make install DESTDIR=~/ffmpeg_build/mpp_install PREFIX=/usr

5. 准备 libdrm 依赖(关键差异点)

5.1 下载 Ubuntu 20.04 的 ARM64 libdrm 包

bash 复制代码
cd ~/ffmpeg_build
mkdir -p drm_pkg && cd drm_pkg

wget http://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/libdrm2_2.4.107-8ubuntu1~20.04.2_arm64.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/libd/libdrm/libdrm-dev_2.4.107-8ubuntu1~20.04.2_arm64.deb

5.2 解压并复制库文件

bash 复制代码
dpkg-deb -x libdrm2_2.4.107-8ubuntu1~20.04.2_arm64.deb tmp_drm2
dpkg-deb -x libdrm-dev_2.4.107-8ubuntu1~20.04.2_arm64.deb tmp_drm_dev

sudo mkdir -p /usr/aarch64-linux-gnu/lib
sudo mkdir -p /usr/aarch64-linux-gnu/include/drm

sudo cp tmp_drm2/usr/lib/aarch64-linux-gnu/libdrm.so.2.4.0 /usr/aarch64-linux-gnu/lib/
sudo cp tmp_drm2/usr/lib/aarch64-linux-gnu/libdrm.so.2 /usr/aarch64-linux-gnu/lib/

cd /usr/aarch64-linux-gnu/lib
sudo ln -sf libdrm.so.2.4.0 libdrm.so

cd ~/ffmpeg_build/drm_pkg
sudo cp tmp_drm_dev/usr/include/libdrm/*.h /usr/aarch64-linux-gnu/include/drm/

5.3 创建 pkg-config 文件

bash 复制代码
sudo mkdir -p /usr/aarch64-linux-gnu/lib/pkgconfig
sudo tee /usr/aarch64-linux-gnu/lib/pkgconfig/libdrm.pc <<'EOF'
prefix=/usr/aarch64-linux-gnu
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${exec_prefix}/include

Name: libdrm
Description: Direct Rendering Manager
Version: 2.4.107
Libs: -L${libdir} -ldrm
Cflags: -I${includedir} -I${includedir}/drm
EOF

6. 修正 MPP 的 pkg-config 文件

bash 复制代码
sed -i 's|^prefix=.*|prefix=/home/heqingchun/ffmpeg_build/mpp_install/usr/local|' ~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc
sed -i 's|^libdir=.*|libdir=${prefix}/lib|' ~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc
sed -i 's|^includedir=.*|includedir=${prefix}/include|' ~/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig/rockchip_mpp.pc

7. 编译 FFmpeg

7.1 设置 pkg-config 环境变量

bash 复制代码
export PKG_CONFIG_LIBDIR=/usr/aarch64-linux-gnu/lib/pkgconfig:$HOME/ffmpeg_build/mpp_install/usr/local/lib/pkgconfig

7.2 配置 FFmpeg

bash 复制代码
cd ~/ffmpeg_build/ffmpeg
make distclean 2>/dev/null
bash 复制代码
./configure \
    --prefix=/usr \
    --enable-cross-compile \
    --arch=aarch64 \
    --target-os=linux \
    --cross-prefix=aarch64-linux-gnu- \
    --enable-gpl \
    --enable-version3 \
    --enable-rkmpp \
    --enable-libdrm \
    --disable-indev=kmsgrab \
    --enable-shared \
    --disable-static \
    --extra-cflags="-I/usr/aarch64-linux-gnu/include" \
    --extra-ldflags="-L/usr/aarch64-linux-gnu/lib" \
    --pkg-config=pkg-config

7.3 编译与安装

bash 复制代码
make -j$(nproc)
make install DESTDIR=~/ffmpeg_build/ffmpeg_install

8. 打包

bash 复制代码
cd ~/ffmpeg_build

tar -czf ffmpeg.tar.gz -C ffmpeg_install/usr bin lib include
tar -czf mpp.tar.gz -C mpp_install/usr/local lib include

9. 部署到开发板

bash 复制代码
scp ffmpeg.tar.gz mpp.tar.gz user@开发板IP:~

在开发板上执行:

bash 复制代码
sudo tar -xzf ~/mpp.tar.gz -C /usr/local
sudo tar -xzf ~/ffmpeg.tar.gz -C /usr/local
sudo ldconfig

# 配置 PATH 和权限
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
sudo usermod -a -G video $USER   # 重新登录生效

10. 验证

bash 复制代码
ffmpeg -hwaccels | grep rkmpp
ffmpeg -hwaccel rkmpp -i test.mp4 -f null -

安装libz

1. 创建临时目录并进入

bash 复制代码
mkdir -p ~/ffmpeg_build/zlib_pkg && cd ~/ffmpeg_build/zlib_pkg

2. 下载 Ubuntu 20.04 的 ARM64 zlib 包(兼容旧版交叉工具链)

bash 复制代码
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2ubuntu1_arm64.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2ubuntu1_arm64.deb

3. 解压包

bash 复制代码
dpkg-deb -x zlib1g_1.2.11.dfsg-2ubuntu1_arm64.deb tmp_zlib
dpkg-deb -x zlib1g-dev_1.2.11.dfsg-2ubuntu1_arm64.deb tmp_zlib_dev

4. 复制库文件到交叉编译目录(注意路径是 lib/aarch64-linux-gnu)

bash 复制代码
sudo cp tmp_zlib/lib/aarch64-linux-gnu/libz.so.1.2.11 /usr/aarch64-linux-gnu/lib/
sudo cp tmp_zlib/lib/aarch64-linux-gnu/libz.so.1 /usr/aarch64-linux-gnu/lib/

5. 创建开发链接 libz.so(指向实际版本)

bash 复制代码
cd /usr/aarch64-linux-gnu/lib
sudo ln -sf libz.so.1.2.11 libz.so

6. 验证

bash 复制代码
ls -l /usr/aarch64-linux-gnu/lib/libz.so*
file /usr/aarch64-linux-gnu/lib/libz.so.1.2.11
相关推荐
好评1241 小时前
【Linux】五种IO模型与非阻塞IO
linux·服务器·nat
啦啦啦啦啦zzzz1 小时前
Appender抽象类的实现c++20
linux·服务器·c++·c++20
小此方1 小时前
Linux网络(七):从 Socket 封装到应用层协议:手写网络版计算器,彻底搞懂 TCP 通信、序列化与反序列化
linux·网络·tcp/ip
kyle~2 小时前
Linux --- epoll (I/O就绪事件通知机制)
linux·运维·服务器
刘广睿2 小时前
音频降噪实战:ffmpeg 滤镜、RNNoise 与人声分离方案对比
ffmpeg·音视频·效率工具·剪辑
AlfredZhao2 小时前
进程都杀了,为什么 `netstat` 还能看到端口?
linux
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| 邮件协议入门:SMTP、POP3、IMAP
linux·运维·计算机网络·github
Johny_Zhao12 小时前
网络安全等级保护测评实施方案
linux·网络·人工智能·网络安全·信息安全·云计算·等保测评·系统运维·itsm
落羽的落羽13 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法