一、前言
? ? ? ? RK3588 支持VPU硬件解碼,需要rkmpp進行調用;支持2D圖像加速,需要 RGA 進行調用。
? ? ? ? 這兩個庫均能通過 ffmpeg-rockchip 進行間接調用,編譯時需要開啟對應的功能。
二、依賴安裝
? ? ? ? 編譯ffmpeg前需要編譯 rkmpp 和 RGA,我嘗試直接調用板端的庫,ffmpeg 編譯可以通過,但是使用 rkmpp 解碼時會導致段錯誤,debug 發現是庫調用相關的報錯,應該是版本差距較大,所以建議下載最新的 rkmpp 和 RGA 進行編譯。
1、編譯RKmpp
源碼來自大佬的GitHub:
https://github.com/nyanmisaka
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=OFFmake -j $(nproc)
make install
我個人喜歡將編譯后的庫與板端隔離,防止破壞系統庫的依賴,所以安裝到當前 install 目錄下。配置參數與源碼的 WIKI 保持一致,省去了 pushd 指令。
2、編譯RGA
編譯 RGA 需要用到 meson 和 ninja,如果沒有,可以直接安裝:
sudo apt-get install meson
sudo apt install ninja-build
如果想編譯 ninja 的最新源碼,我這里也提供方法:
git clone git://github.com/ninja-build/ninja.git
cd ninja
./configure.py --bootstrap
(optional) cp ninja /usr/bin
編譯 RGA:
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
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 源碼目錄下,查看編譯后的支持情況:
./ffmpeg -decoders | grep rkmpp # 查看是否有 rk 的解碼器
./ffmpeg -encoders | grep rkmpp # 查看是否有 rk 的編碼器
./ffmpeg -filters | grep rkrga # 查看是否有 rk 的 rga
輸出分別為:
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)
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)
... 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)如果有視頻文件,可以執行以下指令測試硬件解碼:
./ffmpeg -c:v h264_rkmpp -i 720p60hz.mp4 -f null -
在?Stream mapping 部分可以查看使用的解碼方式,輸出為(h264_rkmpp)。
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 需要初始化硬件設備,不能只設置過濾器。
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。