开发者-导航 猿导航

RK3576 设备 FFmpeg 与 OpenCV 集成指南:基于 rkmpp 硬解的编译安装与测试步骤

发布时间:

目录

警告

假设所有必要的库和工具链都已安装,例如git,meson,cmake,pkg-config,gcc,libdrm-dev等等……

预计全部编译完成需要 2-3 个小时。官方提供了一个新的固件据说已经支持了 ffmpeg,没试过不知道行不行

一、重装 MPP #

  1. 依赖工具

    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++  # 若交叉编译需安装
  2. 获取 MPP 源码:瑞芯微官方 MPP 仓库:

    git clone https://github.com/rockchip-linux/mpp.git
    cd mpp
  3. 脚本所在目录:make-Makefiles.bash

    cd mpp/build/linux/aarch64/ 
  4. 执行脚本

    chmod +x make-Makefiles.bash  # 赋予执行权限
    ./make-Makefiles.bash
  5. 编译

    make -j$(nproc)  # 多线程编译,加速过程
  6. 安装

    sudo make install  # 默认安装到 /usr/local/lib 和 /usr/local/include
  7. 更新动态链接库缓存

    sudo ldconfig
  8. 测试

    # 测试 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 硬解。

  1. 卸载系统预装的 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
  1. 删除旧版本的残留文件和符号链接
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

修改编译配置:

./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