5. 安装带硬编码版本的ffmpeg

通过apt安装的ffmpeg不带硬件编解码,需要自行编译专为Rockchip平台设计的ffmpeg分支,以支持硬件加速视频处理,包括MPP硬件编码器、解码器,以及RGA滤镜加速。

提示

只有鲁班猫4/5系列的Ubuntu22/24系统默认安装了带硬编码版本的ffmpeg,其他板卡及系统都需要自行编译安装。

源码仓库位于GitHub,如果访问GitHub困难也可访问资料网盘/6-开发软件/ffmpeg.tar.gz获取源码。

5.1. 安装依赖

在板卡执行以下命令,安装依赖:

1
2
sudo apt update
sudo apt install git meson cmake pkg-config gcc libasound2-dev libdrm-dev ninja-build libv4l-dev -y

5.2. 编译MPP库

在板卡执行以下命令,编译MPP库:

1
2
3
4
5
6
mkdir -p ~/ffmpeg && cd ~/ffmpeg
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
mkdir -p rkmpp/rkmpp_build && cd rkmpp/rkmpp_build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DBUILD_TEST=OFF ..
sudo make -j$(nproc)
sudo make install

5.3. 编译RGA库

在板卡执行以下命令,编译RGA库:

1
2
3
4
5
mkdir -p ~/ffmpeg && cd ~/ffmpeg
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 -Dcpp_args=-fpermissive -Dlibdrm=false -Dlibrga_demo=false
meson configure rkrga_build
sudo ninja -C rkrga_build install

5.4. 编译ffmpeg-rockchip

在板卡执行以下命令,编译ffmpeg-rockchip:

1
2
3
4
5
6
mkdir -p ~/ffmpeg && cd ~/ffmpeg
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg-rockchip
cd ffmpeg-rockchip
./configure --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga --enable-alsa --enable-libv4l2
make -j$(nproc)
sudo make install

安装完成后验证支持情况:

  • 查看rkmpp解码器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#查看rkmpp解码器
ffmpeg -decoders | grep rkmpp

#信息打印如下
ffmpeg version 2eb0b5d Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration: --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga --enable-alsa --enable-libv4l2
libavutil      58. 29.100 / 58. 29.100
libavcodec     60. 31.102 / 60. 31.102
libavformat    60. 16.100 / 60. 16.100
libavdevice    60.  3.100 / 60.  3.100
libavfilter     9. 12.100 /  9. 12.100
libswscale      7.  5.100 /  7.  5.100
libswresample   4. 12.100 /  4. 12.100
libpostproc    57.  3.100 / 57.  3.100
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..... mjpeg_rkmpp          Rockchip MPP (Media Process Platform) MJPEG decoder (codec mjpeg)
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)
  • 查看rkmpp编码器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#查看rkmpp编码器
ffmpeg -encoders | grep rkmpp

#信息打印如下
ffmpeg version 2eb0b5d Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration: --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga --enable-alsa --enable-libv4l2
libavutil      58. 29.100 / 58. 29.100
libavcodec     60. 31.102 / 60. 31.102
libavformat    60. 16.100 / 60. 16.100
libavdevice    60.  3.100 / 60.  3.100
libavfilter     9. 12.100 /  9. 12.100
libswscale      7.  5.100 /  7.  5.100
libswresample   4. 12.100 /  4. 12.100
libpostproc    57.  3.100 / 57.  3.100
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)
  • 查看rkrga:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#查看rkrga
ffmpeg -filters | grep rkrga

#信息打印如下
ffmpeg version 2eb0b5d Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration: --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga --enable-alsa --enable-libv4l2
libavutil      58. 29.100 / 58. 29.100
libavcodec     60. 31.102 / 60. 31.102
libavformat    60. 16.100 / 60. 16.100
libavdevice    60.  3.100 / 60.  3.100
libavfilter     9. 12.100 /  9. 12.100
libswscale      7.  5.100 /  7.  5.100
libswresample   4. 12.100 /  4. 12.100
libpostproc    57.  3.100 / 57.  3.100
... 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)

具体测试可参考源码仓库的wiki

5.5. 推流USB摄像头测试

5.5.1. 启动RTSP服务器

推流前需要启动RTSP服务器,需要运行mediamtx

访问: mediamtx,下载mediamtx_vx.x.x_linux_arm64v8.tar.gz

或者访问资料网盘/6-开发软件/mediamtx_v1.9.1_linux_arm64v8.tar.gz

将mediamtx_v1.9.1_linux_arm64v8.tar.gz传到板卡解压并运行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
tar xvf mediamtx_v1.9.1_linux_arm64v8.tar.gz

#运行mediamtx
sudo ./mediamtx &

#信息输出如下
2024/09/18 16:24:54 INF MediaMTX v1.9.1
2024/09/18 16:24:54 INF configuration loaded from /home/cat/mediamtx.yml
2024/09/18 16:24:54 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2024/09/18 16:24:54 INF [RTMP] listener opened on :1935
2024/09/18 16:24:54 INF [HLS] listener opened on :8888
2024/09/18 16:24:54 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)
2024/09/18 16:24:54 INF [SRT] listener opened on :8890 (UDP)

5.5.2. 推流测试

推流前确认摄像头节点和帧率,按实际进行修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#查看摄像头节点
v4l2-ctl --list-devices

#进行推流,设备节点/dev/video0,30帧
ffmpeg \
-f v4l2 \
-video_size 1920x1080 \
-framerate 30 \
-pixel_format nv24 \
-i /dev/video0 \
-vf "format=yuv420p" \
-c:v h264_rkmpp \
-b:v 4000k \
-g 60 \
-f rtsp \
-rtsp_transport tcp \
-listen 1 \
rtsp://127.0.0.1:8554/live

使用VLC工具,打开左上角媒体->打开网络串流

../../../_images/ffmpeg_0.jpg

然后根据推流板卡实际IP输入RTSP地址

../../../_images/ffmpeg_1.jpg

如果链接成功则会出现摄像头画面。