发布时间:
警告
假设所有必要的库和工具链都已安装,例如git,meson,cmake,pkg-config,gcc,libdrm-dev等等……
预计全部编译完成需要 2-3 个小时。官方提供了一个新的固件据说已经支持了 ffmpeg,没试过不知道行不行
一、重装 MPP #
-
依赖工具:
sudo apt-get update && sudo apt-get install -y \ git build-essential cmake pkg-config \ libdrm-dev libssl-dev libopencv-dev \ aarch64-linux-gnu-gcc aarch64-linux-gnu-g++ # 若交叉编译需安装 -
获取 MPP 源码:瑞芯微官方 MPP 仓库:
git clone https://github.com/rockchip-linux/mpp.git cd mpp -
脚本所在目录:make-Makefiles.bash
cd mpp/build/linux/aarch64/ -
执行脚本
chmod +x make-Makefiles.bash # 赋予执行权限 ./make-Makefiles.bash -
编译
make -j$(nproc) # 多线程编译,加速过程 -
安装
sudo make install # 默认安装到 /usr/local/lib 和 /usr/local/include -
更新动态链接库缓存
sudo ldconfig -
测试
# 测试 H.264 裸流解码(需准备一个 Annex-B 格式的 H.264 测试文件 test.h264) mpi_dec_test -i test.h264 -t 7 # -t 7 表示 H.264 解码如果测试工具能正常输出解码日志(如 decode frame 相关信息),则说明 MPP 库功能正常,可继续集成到你的 rknn_rtsp_grab_demo 程序中使用。
二、安装 rkmpp #
mkdir -p ~/dev && cd ~/dev
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
pushd rkmpp
mkdir rkmpp_build
pushd rkmpp_build
cmake \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_TEST=OFF \
..
make -j $(nproc)
sudo make install
三、安装 rkrga #
mkdir -p ~/dev && cd ~/dev
git clone -b jellyfin-rga --depth=1 https://github.com/nyanmisaka/rk-mirrors.git rkrga
meson setup rkrga rkrga_build \
--prefix=/usr \
--libdir=lib \
--buildtype=release \
--default-library=shared \
-Dcpp_args=-fpermissive \
-Dlibdrm=false \
-Dlibrga_demo=false
meson configure rkrga_build
sudo ninja -C rkrga_build install
四、安装 ffmpeg #
警告
安装 ffmpeg 切记要删除旧版本的一些 lib,否则后面编译安装后会出现两个版,导致 opencv 编译连接 ffmpeg 有问题无法使用 rkmpp 硬解。
- 卸载系统预装的 FFmpeg 库
# 卸载系统预装的 libavcodec 及相关库
sudo apt remove -y libavcodec58 libavcodec-dev libavformat58 libavformat-dev libavutil56 libavutil-dev libswscale5 libswscale-dev
# 清理残留文件
sudo apt autoremove -y
sudo apt autoclean
- 删除旧版本的残留文件和符号链接
sudo rm -f /usr/lib/aarch64-linux-gnu/libavcodec.so*
sudo rm -f /usr/lib/aarch64-linux-gnu/libavformat.so*
sudo rm -f /usr/lib/aarch64-linux-gnu/libavutil.so*
sudo rm -f /usr/lib/aarch64-linux-gnu/libswscale.so*
sudo rm -f /usr/lib/aarch64-linux-gnu/pkgconfig/libavcodec.pc
原编译命令:
mkdir -p ~/dev && cd ~/dev
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
cd ffmpeg
./configure --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga
make -j $(nproc)
# Try the compiled FFmpeg without installation
./ffmpeg -decoders | grep rkmpp
./ffmpeg -encoders | grep rkmpp
./ffmpeg -filters | grep rkrga
# Install FFmpeg to the prefix path
sudo make install
修改编译配置:
- --enable-pic:生成位置无关代码
- --enable-shared:生成动态库(.so)
- --disable-static:禁用静态库(避免冲突)
./configure \
--prefix=/usr \
--enable-gpl \
--enable-version3 \
--enable-libdrm \
--enable-rkmpp \
--enable-rkrga \
--enable-pic \
--enable-shared \
--disable-static
make -j $(nproc)
# Try the compiled FFmpeg without installation
./ffmpeg -decoders | grep rkmpp
./ffmpeg -encoders | grep rkmpp
./ffmpeg -filters | grep rkrga
# Install FFmpeg to the prefix path
sudo make install
不修改会出现的问题:
/usr/bin/ld: /usr/lib/libavutil.a(tx_float_neon.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `ff_tx_tab_32_float' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/lib/libavutil.a(tx_float_neon.o): in function `ff_tx_fft32_float_neon':
/home/ztl/dev/ffmpeg/libavutil/aarch64/tx_float_neon.S:923:(.text+0x61c): 危险的重寻址: unsupported relocation
/usr/bin/ld: /usr/lib/libavutil.a(tx_float_neon.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `ff_tx_tab_32_float' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/lib/libavutil.a(tx_float_neon.o): in function `ff_tx_fft32_ns_float_neon':
为什么会出现这个问题:
这个错误是由于 FFmpeg 编译时未启用 -fPIC 选项 导致的。-fPIC 是生成 “位置无关代码(Position-Independent Code)” 的编译选项,用于动态链接库(.so)的生成。OpenCV 编译时需要链接 FFmpeg 的动态库,但你的 FFmpeg 库是静态编译的(.a 文件)且未带 -fPIC,导致链接失败。
五、安装 OpenCV #
mkdir ~/opencv_build && cd ~/opencv_build
# 下载OpenCV主库 (版本4.8.0,与您当前版本一致)
git clone --depth=1 git clone https://github.com/opencv/opencv.git opencv
cd opencv
git checkout 4.8.0
# 下载opencv_contrib
git clone https://github.com/opencv/opencv_contrib.git opencv_contrib
cd opencv_contrib
git checkout 4.8.0
# 回到工作目录
cd ..
mkdir build && cd build
# cmake 编译
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/home/ztl/opencv_build/opencv_contrib/modules \
-D WITH_GSTREAMER=ON \
-D WITH_FFMPEG=ON \
-D FFMPEG_LIBAVCODEC=/usr/lib/libavcodec.so \
-D FFMPEG_LIBAVFORMAT=/usr/lib/libavformat.so \
-D FFMPEG_LIBAVUTIL=/usr/lib/libavutil.so \
-D FFMPEG_LIBSWSCALE=/usr/lib/libswscale.so \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_INCLUDE_DIR=$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))") \
..
make -j$(nproc)
sudo make install
六、测试验证 rkmpp #
import os
import cv2
# 启用 FFmpeg 详细日志,打印解码器信息
os.environ["FFMPEG_DEBUG"] = "verbose"
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "video_codec;h264_rkmpp"
cap = cv2.VideoCapture("rtsp://admin:123456@192.168.0.111:554/stream1", cv2.CAP_FFMPEG)
if cap.isOpened():
print("流打开成功,硬解大概率生效!")
# 读取10帧,触发解码日志
for _ in range(10):
ret, frame = cap.read()
if ret:
print(f"成功读取第 {_+1} 帧,分辨率:{frame.shape}")
else:
break
cap.release()
输出一下日志说明,opencv 和 ffmpeg 没有关联上。
[ERROR:0@5.788] global cap_ffmpeg_impl.hpp:1246 open Could not find decoder 'h264_rkmpp'
[ERROR:0@5.788] global cap_ffmpeg_impl.hpp:1286 open VIDEOIO/FFMPEG: Failed to initialize VideoCapture
[ WARN:0@5.788] global cap.cpp:204 open VIDEOIO(FFMPEG): backend is generally available but can't be used to capture by nam