用几个出口模拟管道。 python足够快吗?

时间:2011-02-10 20:41:44

标签: python unix

我从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?)")

3 个答案:

答案 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'