我有一个摄像头捕捉程序和视频流程序一起作为 运行rpicam-vid ... | go2rtc
。我的问题是,go2rtc
只有当有人打开视频流时,它才会从管道读取数据,但rpicam-vid
即使视频流未启动,我也需要连续运行。当读取器未提取数据时,有没有办法简单地丢弃数据?
我有一个摄像头捕捉程序和视频流程序一起作为 运行rpicam-vid ... | go2rtc
。我的问题是,go2rtc
只有当有人打开视频流时,它才会从管道读取数据,但rpicam-vid
即使视频流未启动,我也需要连续运行。当读取器未提取数据时,有没有办法简单地丢弃数据?
您可以在两者之间插入一些内容
ripcam-vid
,并go2rtc
以非阻塞模式将数据与输出一起转发,这样当管道因没有内容读取而变满时,数据将被丢弃(write()
管道的 s 会失败并显示EAGAIN
(资源暂时不可用)¹):这里使用
dd
(假设是的 GNU 实现dd
)将 stdout 更改为非阻塞模式并perl
以最多 8KiB 的块形式转发数据。在 Linux 上,默认情况下,管道缓冲区大小为 64KiB,您可以使用 fnctl 将其扩大,以减少在正常操作中数据被丢弃的可能性
F_SETPIPE_SZ
。例如,使用以下命令同时进行非阻塞和管道容量扩大perl
:/proc/sys/fs/pipe-max-size
可以使用的最大管道尺寸值由( )决定sysctl fs/pipe-max-size
,默认值为 1MiB,如果需要,您可以root
用增加该值。sysctl -w fs/pipe-max-size="$newvalue"
但我不确定丢弃这样的视频片段是否是个好主意。
¹ 非阻塞模式也可能意味着短写入,也就是说,当写入几乎已满的管道时,仅写入管道可容纳的内容,如果不重新尝试,其余内容将被丢弃。