2

我正在使用 vlc 媒体播放器通过 Internet 连接到 rtsp 流。

我只需要定期查看流,但每次建立连接都需要很长时间。

相反,我保持连接打开,vlc 将输出作为传输流写入命名管道。

然后 vlc 的第二个实例可以在我需要时从管道中读取。

问题是,据我了解,除非打开以供阅读,否则无法写入命名管道。

为了在 vlc 的第二个实例未打开时解决此问题,我:

    cat < $PIPE > /dev/null

除了以这种方式使用 cat 之外,还有更好的方法来保持管道打开以进行写入吗?

4

1 回答 1

1

如果管道还没有准备好写入,你没有告诉连接的 VLC 做了什么。

如果它在看到管道尚未准备好写入并继续从连接中读取时丢弃输出,那么您可以简单地拥有一个打开管道但不读取它的进程。像这样的东西:

while sleep 7d; do :; done < $PIPE &

然后,当您开始播放 VLC 时,它将开始从管道读取,连接的 VLC 将写入它,直到播放 VLC 停止。

但是,如果连接的 VLC 在写入管道时停止,那么通过上述设置,RTSP 连接最终将超时,并且当正在播放的 VLC 开始从管道读取时,连接的 VLC 将终止或需要重新连接。VLC 也可能只是在写入管道时超时。

在这种情况下,您可以从管道中读取并丢弃其内容,直到正在播放的 VLC 到达,并在它停止时继续读取。您可以让多个进程打开一个管道,但数据只能从中读取一次,即进程将竞争数据。

您可以通过在开始播放 VLC 之前使用 SIGSTOP 暂停丢弃过程并在停止后使用 SIGCONT 恢复它来实现,假设读取管道的间隙不足以使连接超时。

像这样:

cat $FIFO > /dev/null &
kill -SIGSTOP %
vlc $FIFO
kill -SIGCONT %
于 2013-03-04T15:38:33.043 回答