一、前言
RK3588 支持VPU硬件解码,需要rkmpp进行调用;支持2D图像加速,需要 RGA 进行调用。
这两个库均能通过 ffmpeg-rockchip 进行间接调用,编译时需要开启对应的功能。
二、依赖安装
编译ffmpeg前需要编译 rkmpp 和 RGA,我尝试直接调用板端的库,ffmpeg 编译可以通过,但是使用 rkmpp 解码时会导致段错误,debug 发现是库调用相关的报错,应该是版本差距较大,所以建议下载最新的 rkmpp 和 RGA 进行编译。
1、编译RKmpp
源码来自大佬的GitHub:

bash
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
cd rkmmp
mkdir install
cmake . \
-DCMAKE_INSTALL_PREFIX=$PWD/install \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_TEST=OFF
make -j $(nproc)
make install
我个人喜欢将编译后的库与板端隔离,防止破坏系统库的依赖,所以安装到当前 install 目录下。配置参数与源码的 WIKI 保持一致,省去了 pushd 指令。
2、编译RGA
编译 RGA 需要用到 meson 和 ninja,如果没有,可以直接安装:
bash
sudo apt-get install meson
sudo apt install ninja-build
如果想编译 ninja 的最新源码,我这里也提供方法:
bash
git clone git://github.com/ninja-build/ninja.git
cd ninja
./configure.py --bootstrap
(optional) cp ninja /usr/bin
编译 RGA:
bash
git clone -b jellyfin-rga --depth=1 https://github.com/nyanmisaka/rk-mirrors.git rkrga
cd rkrga
mkdir install rkrga_build
# . 源代码目录,rkrga_build 是构建目录
meson setup . rkrga_build \
--prefix=$PWD/install \
--libdir=lib \
--buildtype=release \
--default-library=shared \
-Dcpp_args=-fpermissive \
-Dlibdrm=false \
-Dlibrga_demo=false
meson configure rkrga_build
ninja -C rkrga_build install
源码也是出自 nyanmisaka 大佬。大佬的 WIKI 在源码的父目录进行编译,我这里改成了在源码下编译,看个人喜好。
3、编译 ffmpeg
bash
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
cd ffmpeg
mkdir install
./configure --prefix=$PWD/install --enable-gpl --enable-version3 \
--enable-libdrm --enable-rkmpp --enable-rkrga \
--extra-cflags="-I$(pwd)/../rkmpp/install/include/rockchip -I$(pwd)/../rkrga/install/include/rga" \
--extra-ldflags="-L$(pwd)/../rkmpp/install/lib -L$(pwd)/../rkrga/install/lib -Wl,-rpath,$(pwd)/../rkmpp/install/lib:$(pwd)/../rkrga/install/lib -lrockchip_mpp -lrga"
make -j $(nproc)
make install
这里我主要是增加了动态库和头文件的搜索路径,指定为刚刚编译的 RKmpp 和 RGA。另外使用-Wl,-rpath指定了运行时库的搜索路径,防止使用系统的库。
三、验证
(1)在 ffmpeg 源码目录下,查看编译后的支持情况:
bash
./ffmpeg -decoders | grep rkmpp # 查看是否有 rk 的解码器
./ffmpeg -encoders | grep rkmpp # 查看是否有 rk 的编码器
./ffmpeg -filters | grep rkrga # 查看是否有 rk 的 rga
输出分别为:
bash
V..... av1_rkmpp Rockchip MPP (Media Process Platform) AV1 decoder (codec av1)
V..... h263_rkmpp Rockchip MPP (Media Process Platform) H263 decoder (codec h263)
V..... h264_rkmpp Rockchip MPP (Media Process Platform) H264 decoder (codec h264)
V..... hevc_rkmpp Rockchip MPP (Media Process Platform) HEVC decoder (codec hevc)
V..... mpeg1_rkmpp Rockchip MPP (Media Process Platform) MPEG1VIDEO decoder (codec mpeg1video)
V..... mpeg2_rkmpp Rockchip MPP (Media Process Platform) MPEG2VIDEO decoder (codec mpeg2video)
V..... mpeg4_rkmpp Rockchip MPP (Media Process Platform) MPEG4 decoder (codec mpeg4)
V..... vp8_rkmpp Rockchip MPP (Media Process Platform) VP8 decoder (codec vp8)
V..... vp9_rkmpp Rockchip MPP (Media Process Platform) VP9 decoder (codec vp9)
bash
V..... h264_rkmpp Rockchip MPP (Media Process Platform) H264 encoder (codec h264)
V..... hevc_rkmpp Rockchip MPP (Media Process Platform) HEVC encoder (codec hevc)
V..... mjpeg_rkmpp Rockchip MPP (Media Process Platform) MJPEG encoder (codec mjpeg)
bash
... overlay_rkrga VV->V Rockchip RGA (2D Raster Graphic Acceleration) video compositor
... scale_rkrga V->V Rockchip RGA (2D Raster Graphic Acceleration) video resizer and format converter
... vpp_rkrga V->V Rockchip RGA (2D Raster Graphic Acceleration) video post-process (scale/crop/transpose)
(2)如果有视频文件,可以执行以下指令测试硬件解码:
bash
./ffmpeg -c:v h264_rkmpp -i 720p60hz.mp4 -f null -
在 Stream mapping 部分可以查看使用的解码方式,输出为(h264_rkmpp)。
bash
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_rkmpp) -> wrapped_avframe (native))
Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
(3)测试 RGA 需要初始化硬件设备,不能只设置过滤器。
bash
ffmpeg -init_hw_device rkmpp=hw -filter_hw_device hw \
-c:v h264_rkmpp -i 720p60hz.mp4 \
-vf "hwupload,scale_rkrga=w=1920:h=1080:format=nv12" \
-f null -
-init_hw_device rkmpp=hw 初始化一个名为hw的 RKMPP 硬件设备;
-filter_hw_device hw指定过滤器链使用之前初始化的硬件设备hw;
-vf hwupload,scale_rkrga=w=1920:h=1080:format=nv12 将输入的视频帧上传到硬件设备(RKMPP),使用 RKMP 提供的 scale_rkrga 过滤器将视频帧缩放到 1920x1080 分辨率,并转换像素格式为 NV12。
