我有一个使用匿名管道来实现的 bash 脚本:
- 从 dv 捕获设备抓取视频
- 写入文件(使用 tee)
- 将其传输到 ffmpeg2theora(转换为 ogv/theora 视频)
- 写入文件(使用 tee)
- 通过管道传输到 oggfwd 以便将其发送到 icecast 流媒体服务器
我如何使用命名管道(fifos)实现这一点,以便我可以拥有可以单独控制的单独进程?
我正在使用这个脚本:
#!/bin/bash
while (true);
do
dvgrab --format dv1 - | \
tee /filename_`date +%y%m%d_%H%M%S`.dv | \
ffmpeg2theora.linux -f dv -x 382 -y 288 -v 3 --speedlevel 2 --no-skeleton -o /dev/stdout - | \
tee /filename_`date +%y%m%d_%H%M%S`_stream_382x288.ogv | \
oggfwd icecastserver.com 8000 password /mountpoint.ogv
done
我问这个问题的原因之一是,无论网络是否正常运行且 icecast 流媒体服务器是否可访问,我都需要在磁盘上拥有干净的 dv 文件和 ogv 文件。
答案1
如果你根本不需要任何并发性,那么你可以用普通文件来做到这一点。命名管道的原理是一样的
改变
foo | \
bar | \
baz
到
foo > foo.out
bar < foo.out > bar.out
baz < bar.out
如果 *.out 是命名管道,那么我怀疑写入它们的程序可能会被阻塞,等待它们的输出缓冲区被耗尽。