RKVision开发日志(七)

一、FFMPEG

经过上一次的梳理,大致的视频流规划如下:

1
2
3
4
5
[Camera] -> [Tee 分流器]
├─> [Queue] -> [Valve (录制开关)] -> [mpph264enc (硬编码)] -> [mp4mux] -> [filesink]
├─> [Queue] -> [rkrga (硬件缩放)] -> [appsink (预览图)] -> 写入共享内存A
└─> [Queue] -> [appsink (原图)] -> 写入共享内存B

现有调用ffmpeg的路线有:

  1. 用python的subprocess调用,这种方法相当于再创建一个进程,首先会破坏我们现在的代码结构,camera进程将只做监听,属实是浪费,其次我们这三个管道,需要拉起三个进程,实在是灾难
  2. PyAV库 这个库的star比较少,而且作者开篇就说有很多缺陷,AI给我的意见是这个库可以很深的嵌入ffmpeg,可以先考虑,先研究一下官方的库
  3. 官方的库Python-ffmpeg,AI给我的意见是功能比较少,只能构造管线,我先研究一下

二、Python-ffmpeg

1. 绘制

单独把这一趴拿出来谈是因为最近的调试中发现有对时间戳记录的需求,为此可以用ffmpeg简单的实现overlay一下datetime,很棒的功能!

ffmpeg. drawtext (streamtext=Nonex=0y=0escape_text=True** kwargs)

Draw a text string or text from a specified file on top of a video, using the libfreetype library.
使用 libfreetype 库在视频上绘制文本字符串或来自指定文件的文本。

To enable compilation of this filter, you need to configure FFmpeg with --enable-libfreetype. To enable default font fallback and the font option you need to configure FFmpeg with --enable-libfontconfig. To enable the text_shaping option, you need to configure FFmpeg with --enable-libfribidi.
要启用此滤镜的编译,您需要使用 --enable-libfreetype 配置 FFmpeg。要启用默认字体回退和字体选项,您需要使用 --enable-libfontconfig 配置 FFmpeg。要启用文本整形选项,您需要使用 --enable-libfribidi 配置 FFmpeg。

然后就没了!github仓库4年没有更新,多达479个open的issue,实在是太半成品了…

三、 原生ffmpeg

力竭了,还是返璞归真一下吧,仔细思考了一下跑命令行的subprocess是最佳选择,可以同时拉起三个进程,不需要的时候直接kill,把调度权交给系统…

1
2
3
4
5
6
7
8
9
10
Camera(NV12,1632x1224@30fps)
|
v
FFmpeg[Process A]
|
+--> [Process B] -> NV12 -> RKRGA to BGR -> [Process Algo(completed)]
|
+--> [Process C] -> RKMpp H264/H265 -> file/output.mp4
|
+--> [Process D] -> RKRGA resize to 544x408@10fps -> RKMpp to MJPEG -> WEB

用别人的代码太困难,还是选择改自己的吧。然后恶补一下ffmpeg的用法,这样也符合我们程序的逻辑,在控制进程拉起ffmpeg的相关控制相机,就是之前写的相机进程和ipc白写了(QAQ)
板子上的源码clone和编译参考:5. 安装带硬编码版本的ffmpeg — 快速使用手册—基于LubanCat-RK356x系列板卡 文档
考虑到mpp被ffmpeg封掉了,需要替换一下新的仓库地址:

1
git clone --depth=1 https://github.com/HermanChen/mpp.git rkmpp

此外测试例程的时候,一直在报错,仔细观察了一下发现只有0.03fps…修改成1/30就好了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#进行推流,设备节点/dev/video0,30帧
ffmpeg \
-f v4l2 \
-video_size 1632x1224 \
-framerate 1/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

根据官方文档:《ffmpeg 文档》 — ffmpeg Documentation,把这个参数改成-r 30/1也可以,注意30也不可以…神奇的bug…

1
2
3
4
5
6
7
8
9
10
11
12
13
ffmpeg \
-f v4l2 \
-video_size 1632x1224 \
-r 30/1 \
-pixel_format nv12 \
-i /dev/video0 \
-c:v h264_rkmpp \
-b:v 4000k \
-g 60 \
-f rtsp \
-rtsp_transport tcp \
-listen 1 \
rtsp://127.0.0.1:8554/live

和GLM友好交流的时候,他提到tee似乎无法实现共享内存之类的功能,而且tee是阻塞式的,这意味着消费者进程如果无法正常读取,相机读流就会卡住,如果要在命令行操作就要写bash做转发,想想就头痛

我是一个想得多而做得少的开发者,总是在想,有没有更好的方案,总是在评估方案的可行性复杂性与性能,这导致我一直在拖累进度
尤雨溪的知乎,大佬当年写Vue2的时候也是边摸索边写,大不了再重构嘛,明天写的代码永远比今天写的好
今天和老师探讨了一下,还可以用ctypes封装cpp的接口,可以为所欲为了…管理内存实现0拷贝不是梦
但是我的能力有限,时间也有限,我还得考虑毕业论文的问题… 把这些事情交给后人来做吧

参考资料

RKVision开发日志(七)
http://blog.mingxuan.xin/2026/01/07/20260107/
作者
Obscure
发布于
2026年1月7日
许可协议