如何将使用管道的脚本转换为命名管道

如何将使用管道的脚本转换为命名管道

我有一个使用匿名管道来实现的 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 是命名管道,那么我怀疑写入它们的程序可能会被阻塞,等待它们的输出缓冲区被耗尽。

相关内容