【发布时间】:2018-05-31 10:02:24
【问题描述】:
我正在努力实现以下目标:
- 将视频从我的 Raspberry Pi 摄像头写入磁盘,不受流媒体的任何干扰
- 通过网络优化延迟流式传输相同的视频
重要的是流媒体不会干扰正在写入磁盘的视频,因为网络连接可能不稳定,例如 WiFi 路由器可能超出范围等。
为此,我尝试的第一件事如下:
#Receiver side
FPS="30"
netcat -l -p 5000 | mplayer -vf scale -zoom -xy 1280 -fps $FPS -cache-min 50 -cache 1024 - &
#RPi side
FPS="30"
mkfifo netcat_fifo
raspivid -t 0 -md 5 -fps $FPS -o - | tee --output-error=warn netcat_fifo > $video_out &
cat netcat_fifo | netcat -v 192.168.0.101 5000 &> $netcat_log &
而且流媒体效果很好。但是,当我关闭路由器,模拟网络问题时,我的 $video_out 被切断。我认为这是由于来自 netcat_fifo 的背压。
我在 stackexchange 找到了一个关于非阻塞 FIFO 的解决方案,将 tee 替换为 ftee:
Linux non-blocking fifo (on demand logging)
现在它可以防止我的 $video_out 受到流媒体的影响,但流媒体本身非常不稳定。最好的结果是使用以下脚本:
#RPi side
FPS="30"
MULTIPIPE="ftee"
mkfifo netcat_fifo
raspivid -t 0 -md 5 -fps $FPS -o - | ./${MULTIPIPE} netcat_fifo > $video_out &
cat netcat_fifo | mbuffer --direct -t -s 2k 2> $mbuffer_log | netcat -v 192.168.0.101 5000 &> $netcat_log &
当我检查 mbuffer 日志时,我诊断出一个 FIFO,它大部分时间都是空的,但利用率峰值为 99-100%。在这些高峰期间,我的 mplayer 接收端在解码视频时出现许多错误,并且需要大约 5 秒才能自行恢复。在此间隔之后,mbuffer 日志再次显示一个空的 FIFO。 empty->full->empty 一直不停。
我有两个问题:
- 我是否使用正确的方法来解决我的问题?
- 如果是这样,我怎样才能在保持 $video_out 文件完整的同时使流式传输更加健壮?
【问题讨论】:
标签: linux shell raspberry-pi video-streaming mkfifo