RTSP 推流
需求
- 兼容的摄像头
- 如果使用 ROCK 5B,也可使用 HDMI RX 作为视频源
服务端配置
- 基于 FFmpeg
- 基于 Gstreamer + mediamtx
- 基于 Gstreamer + gst-rtsp-server
使用 HDMI RX 时,低于 720P 分辨率的输入源可能会导致编码失败。
经测试,ffmpeg-rockchip 与我们发布的 Debian 11 系统的 rkmpp 和 librga 版本不兼容,Debian 12 系统不受影响。
如果你使用的是我们发布的 Debian 11 系统请移步 ffmpeg-rockchip 官方编译教程,构建 rkmpp 和 librga 后构建 ffmpeg-rockchip,
并运行 sudo apt-get update && sudo apt-get install librga2=2.2.0-1
。
安装编译依赖
sudo apt-get update
sudo apt-get install build-essential cmake git libdrm-dev librga-dev librockchip-mpp-dev libsdl2*-dev libx264-dev libx265-dev pkg-config
编译并安装 ffmpeg-rockchip
git clone https://github.com/nyanmisaka/ffmpeg-rockchip
pushd ffmpeg-rockchip/
./configure --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga --enable-libx264 --enable-libx265 --enable-ffplay
make -j$(nproc)
sudo make install
popd
运行 mediamtx 与 ffmpeg-rockchip
此处我们假定 /dev/video-camera0
是你想要使用的视频源。如果你的摄像头被分配到了其他的名称下,请替换以下命令行中对应的设备名。
-vf "fps=30"
与 -s 3840x2160
分别对应帧率与分辨率,需根据命令 sudo v4l2-ctl -d /dev/video-camera0 --all
的输出进 行调整,否则可能会因为无法自动读取到摄像头信息而影响编码性能甚至启动推流失败。
-c:v
选项可以指定使用的编码器,目前 ffmpeg-rockchip 支持的硬件编码器有 h264_rkmpp
、hevc_rkmpp
和 mjpeg_rkmpp
。
wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.0/mediamtx_v1.9.0_linux_arm64v8.tar.gz
tar -xzvf mediamtx_v1.9.0_linux_arm64v8.tar.gz
nohup ./mediamtx &
ffmpeg-rockchip/ffmpeg -f v4l2 -i /dev/video-camera0 -vf "fps=30" -s 3840x2160 -c:v h264_rkmpp -rc_mode AVBR -b:v 20M -minrate 10M -maxrate 40M -profile:v main -level 5.1 -f rtsp rtsp://0.0.0.0:8554/stream
# 如果仅想将摄像头录制成文件,请使用以下命令
# ffmpeg-rockchip/ffmpeg -f v4l2 -i /dev/video-camera0 -vf "fps=30" -s 3840x2160 -c:v h264_rkmpp -rc_mode AVBR -b:v 20M -minrate 10M -maxrate 40M -profile:v main -level 5.1 /tmp/tmp.mp4
因为 mpph264enc 在 Rockchip 6.1 Linux 内核的 Radxa OS 编解码效率很差,推荐优先使用 mpph265enc。
使用 HDMI RX 时,目前 gst-mppenc 暂不支持 NV24(YCbCr444) 与 RGB 输入,需要 HDMI 输入端切换颜色格式为 NV12(YCbCr420) 或 NV16(YCbCr422),或者使用 FFmpeg 进行推流。
安装依赖
sudo apt-get update
sudo apt-get install gstreamer1.0-rtsp
运行 mediamtx 和 Gstreamer
此处我们假定 /dev/video-camera0
是你想要使用的视频源。如果你的摄像头被分配到了其他的名称下,请替换以下命令行中对应的设备名。
wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.0/mediamtx_v1.9.0_linux_arm64v8.tar.gz
tar -xzvf mediamtx_v1.9.0_linux_arm64v8.tar.gz
nohup ./mediamtx &
# mpph264enc 编码器目前在 Rockchip 6.1 Linux 内核下有卡顿问题,建议使用 mpph265enc 编码器
# 可用的编码器有 mpph264enc、mpph265enc、mppjpegenc、mppvp8enc,修改编码器需要修改 pipeline 后的 rtp*pay 或 *parse
gst-launch-1.0 -v v4l2src device=/dev/video-camera0 ! queue ! mpph265enc bps=51200000 rc-mode=vbr ! rtspclientsink location=rtsp://localhost:8554/test
# 如果仅想将摄像头录制成文件,请使用以下命令
# gst-launch-1.0 --gst-debug-level=3 v4l2src device=/dev/video-camera0 ! queue ! mpph265enc bps=51200000 rc-mode=vbr ! h265parse ! mp4mux ! filesink location=output.mp4
因为 mpph264enc 在 Rockchip 6.1 Linux 内核的 Radxa OS 编解码效率很差,推荐优先使用 mpph265enc。
使用 HDMI RX 时,目前 gst-mppenc 暂不支持 NV24(YCbCr444) 与 RGB 输入,需要 HDMI 输入端切换颜色格式为 NV12(YCbCr420) 或 NV16(YCbCr422),或者使用 FFmpeg 进行推流。
安装编译依赖
sudo apt update
sudo apt install build-essential gobject-introspection libcgroup-dev libgirepository1.0-dev libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-dev meson librga-dev
获取 gst-rtsp-server 源码
git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git
cd gstreamer/subprojects/gst-rtsp-server
# 查询系统内 gstreamer-rtsp-1.0 的版本号
pkg-config --modversion gstreamer-rtsp-1.0
# 此处的 1.22 对应上面查询到的版本号,所有可用版本号可使用 `git branch -a` 查询,使用最相近的版本号即可
git switch 1.22
编译 gst-rtsp-server
meson build
cd build
ninja
运行 gst-rtsp-server
此处我们假定 /dev/video-camera0
是你想要使用的视频源。如果你的摄像头被分配到了其他的名称下,请替换以下命令行中对应的设备名。
cd examples/
# mpph264enc 编码器目前在 Rockchip 6.1 Linux 内核下有卡顿问题,建议使用 mpph265enc 编码器
# 可用的编码器有 mpph264enc、mpph265enc、mppjpegenc、mppvp8enc,修改编码器需要修改 pipeline 后的 rtp*pay 或 *parse
./test-launch --gst-debug-level=3 "( v4l2src device=/dev/video-camera0 ! queue ! mpph265enc bps=51200000 rc-mode=vbr ! rtph265pay name=pay0 pt=97 )"
# 如果仅想将摄像头录制成文件,请使用以下命令
# gst-launch-1.0 --gst-debug-level=3 v4l2src device=/dev/video-camera0 ! queue ! mpph265enc bps=51200000 rc-mode=vbr ! h265parse ! mp4mux ! filesink location=output.mp4
客户端配置
使用 VLC 播放器
以下以 Windows 下运行 VLC 为例,介绍如何收看 RTSP 视频推流。
-
下载并安装 VLC
-
点击 媒体 - 打开网络串流 来输入 RTSP 推流地址
需替换为服务端命令行中指定的 URL 与 IP 地址。
- 点击播放后即可查看 RTSP 远程推流内容
在开发板上使用 ffplay 播放器
也可直接使用上面提到的 FFmpeg 的 ffplay 工具进行播放
需替换为服务端命令行中指定的 URL 与 IP 地址。
-vcodec
选项为指定的解码器,请根据 RTSP 流的编码进行调整,目前 ffmpeg-rockchip 支持的硬件解码器有 av1_rkmpp
、h263_rkmpp
、h264_rkmpp
、hevc_rkmpp
、mpeg1_rkmpp
、mpeg2_rkmpp
、mpeg4_rkmpp
、vp8_rkmpp
、vp9_rkmpp
。
ffmpeg-rockchip/ffplay -vcodec h264_rkmpp rtsp://192.168.10.9:8554/stream