如何将命令输出通过管道传输到多个程序

如何将命令输出通过管道传输到多个程序

我正在使用 FFmpeg,并且制作了一个自定义应用程序,它是 TCP 服务器。我在 ffmpeg 中使用重复输出。

我想要的是,对于每个输出,我想启动我的程序来侦听特定端口。例如我现在可以做什么:

ffmpeg -i "stream_link" -codec copy -f mpegts - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

我的程序从 ffmpeg 获取数据并将它们存储在服务器内。现在,我不能做以下事情

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - \
    | myprogram -h 127.0.0.1 -p 12345 -f - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

我想你明白了我。我正在尝试输出 2 个不同的容器 mpegts、flv 并再次打开我的程序的 2 个实例。那么我怎样才能做到呢?

这个问题仅与管道相关。我只是举了一个使用 FFmpeg 的真实例子。

答案1

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f - | 
myprogram -h 127.0.0.1 -p 12345 -f -

所以如果我理解正确的话,您正在尝试将这两个命令合并为一个。

mpegts格式

ffmpeg -i "stream_link" -codec copy -f mpegts - |  
myprogram -h 127.0.0.1 -p 12345 -f - 

电影格式

ffmpeg -i "stream_link"  -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f -

所以,如果我的上述理解是正确的,我相信你可以使用tee命令来完成它。您可以从这个问题中获得更多详细信息这里

因此,您可以将命令改写为:

 ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
 tee >(myprogram -h 127.0.0.1 -p 12345 -f -) 
     >(myprogram -h 127.0.0.1 -p 12346 -f -) 

然而,作为用户麦克塞夫他在评论中指出,

ffmpeg正在将两个流写入一个文件。 thempegts和 the都flv转到标准输出这是|管道。

因此,解决方案必须涉及ffmpeg写入两个不同的文件。类似的,ffmpeg flv processing -o flvfile, mpegts processing -o mpegtsfile两个进程从两个输出中读取数据。

无论是该进程还是接收输入的进程都必须解析ffmpeg的输出,以了解从哪个偏移量开始读取其预期的流。

因此,该方法的问题tee在于tee可能会重复 的输入,并且可以使用ffmpeg两个。ffmpeg

因此,解决此问题的更好方法是使用以下方法:

{ { ffmpeg -i "stream_link"            #one input stream
        -codec copy -f flv /dev/fd/3   #duped and processed, out >&3
        -codec copy -f mpegts - |      #duped and processed, out >&1
        myprogram1 >&4                 #receives >&1 on <&0, out >&4
        } 3>&1 | myprogram2            #receives >&3 on <&0, out >&1
} 4>&1                                 #ensures both myprograms write to >&1

当我们使用上述方法时,ffmpeg显式地分割其输出。它确实取决于在理解链接的系统上运行/dev/fd/[num]

相关内容