我正在尝试使用 FFMpeg 进行一些流式传输,我想我终于找到了解决屏幕消隐问题的方法。这需要将 PNG 写入命名管道,然后让 FFMpeg 将它们读取为覆盖层。但是,我似乎遇到了一个奇怪的问题。
#!/bin/bash
mkfifo /tmp/stream_pipe
cat /path/to/transparent/or/splash/screen.png > stream_pipe
echo "done!"
在这个例子中,echo "done!"
实际上从未运行。
因此,我转到终端并尝试了同样的事情,果然命令cat
无限期挂起。
我不记得曾经遇到过将 catting 到命名管道的问题,事实上,我看到很多命名管道引用都只使用这个。这里可能出了什么问题?cat
一旦将文件写入管道,它不应该退出吗?正在写入的文件只是一个普通的 PNG 文件,所以这真的让我很困惑。
或者是cat
在写入时尝试关闭管道?这可以解释为什么它会挂起,因为它不是一个合法的文件,但我想它cat
会知道区别或不会在意。
编辑:cat $file | echo -n > /tmp/stream_pipe
表现出相同的行为
答案1
您需要从 FIFO 读取一些内容。
尝试这个:
#!/bin/bash
mkfifo /tmp/stream_pipe
cat /path/to/transparent/or/splash/screen.png > stream_pipe &
cat stream_pipe
echo "done!"
您应该将文件的内容打印到屏幕上(与您执行的操作相同cat /path/to/transparent/or/splash/screen.png
)。
答案2
cat $file >/tmp/stream_pipe
没有工作,但我能够通过将管道分配给文件描述符使其工作(在某种程度上),如下所示:
#!/bin/bash
exec 3<>/tmp/stream_pipe
cat /path/to/file.png >&3
我说它在某种程度上有效,因为单独运行它会堵塞管道,并且脚本似乎挂起了。这是因为 Ubuntu 中的管道有 1M 的缓冲区限制,如通过命令所见systcl fs.pipe-max-size
。不幸的是,通过设置此值sysctl
似乎不会改变它。但是,只要管道数据被另一个进程使用,就不会出现问题。对完整管道的任何写入都会被阻止(看起来像是挂起了,但事实并非如此),直到数据被使用,此时写入将继续。