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
相关推荐
IT大白鼠2 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 2 篇 · 安全守规矩的 AI:分级安全管控是灵魂
linux·运维·人工智能
风华同学2 小时前
免密SSH登录Ubuntu
linux·运维·ubuntu
꯭自꯭闭꯭2 小时前
达梦守护集群手工切换及故障切换
linux·运维·服务器·数据库
wdfk_prog2 小时前
Wi-Fi Direct 教程 04:Interface 协议子系统初始化——WPA/EAPOL、WPS、DPP/NAN、GAS 与 P2P callback
android·运维·服务器·ubuntu·p2p·wps·wifi-direct
cuijiecheng20182 小时前
RK3588 DEP 接入 Dante Domain Manager(DDM)完整测试记录
linux
爱吃香菜的初学者3 小时前
十二.Linux——管道
linux·运维·服务器
网硕互联的小客服11 小时前
Linux服务器磁盘应该如何合理分区?
linux·运维·服务器
allnlei11 小时前
Opus In-Band FEC 详解:原理、实现与开源方案
ffmpeg·音视频·gstreamer
贵沫末12 小时前
Ubuntu——常用软件安装
linux·运维·ubuntu
Doraemomo12 小时前
Linux内核驱动开发——中断与定时器
linux·运维·驱动开发