我从ffmpeg输入了字节。我想将此输出发送到其他几个ffmpeg进程。因为我不能使用Unix Pipe,Socket,..为此(或者我可以?)我使用python作为管道的接收端。 然后子程序将接收的数据复制到以前所有“已注册”的出口。
感觉不对!
具体来说,我觉得这意味着大量的内存复制。它现在有效。但我真的很想知道这样做的“正确方法”。
def writeData(self,data):
"""Write 'data' to all outputs"""
if len(self.outlets) > 0:
for outlet in self.outlets:
outlet.writeData(data)
else:
self.logger.warn("Received data but no outlets registred (yet?)")
答案 0 :(得分:2)
编辑:感谢Phil,他更正了早期版本中的错误(请参阅评论)。
使用bash
,您可以
ffmpeg ... | tee >(ffmpeg ...) >(ffmpeg ...) >(ffmepg ...) > /dev/null
这会将第一个ffmpeg
的输出传递给其他三个。
如果您不使用bash
,您可以手动创建命名管道,将它们连接到ffmpeg
进程并使用tee
管道到命名管道:
mkfifo pipe1 pipe2
ffmpeg ... < pipe1
ffmpeg ... < pipe2
ffmpeg ... | tee pipe1 pipe2 | ffmpeg ...
rm pipe1 pipe2
上述bash
代码基本相同。命名管道的创建和删除是透明的。
答案 1 :(得分:1)
这可能足够快,特别是现在CPU的速度与压缩视频数据的相对较低带宽相比。
与往常一样,您必须对解决方案进行测试和基准测试,以确保其符合您的性能要求。
答案 2 :(得分:1)
您是否看过moreutils包中的“小便”实用程序?它正是你所描述的:
ffmpeg | pee 'ffmpeg -stuff1' 'ffmpeg -stuff2' 'ffmpeg -stuff3'