使用管道将文件 i/o 传输到另一个进程

Posted

技术标签:

【中文标题】使用管道将文件 i/o 传输到另一个进程【英文标题】:using pipes to channel file i/o to another process 【发布时间】:2011-03-12 19:44:17 【问题描述】:

刚开始学习/使用管道,想知道如何将应用程序的文件输出路由到管道中,以便另一个应用程序可以使用它。

确切地说,我想将 ffmpeg 的输出(转码视频数据)传送到我的应用程序中以使用它。如果我创建一个像/tmp/out.mp4 这样的命名管道并将其作为输出文件名提供给ffmpeg,则ffmpeg 将尝试再次创建此文件,可能会覆盖我的管道(或类似的东西)。如何处理这种情况?

是否有任何通用的方法可以透明地转移应用程序的文件 IO?

(我正在尝试编写一个视频流服务器(只是为了学习和娱乐),它在流式传输过程中将 avi 等格式转码为 mpeg4 等流式友好格式,我发现 ffmpeg 太慢了,它需要 2秒转码 1 秒视频 :(

是我的设置/PC 的问题还是 ffmpeg 以迟缓着称? )

PS : 顺便说一下,我是用 C 写的。

【问题讨论】:

【参考方案1】:

可以说服ffmpeg输出到管道:

ffmpeg -i whatever.avi -f mp4 -

“-”告诉它输出到标准输出而不是文件,“-f”告诉它输出文件应该是什么输出。

当然,您可以将其重定向到命名管道,但使用 popen 调用它以直接将输出作为文件描述符获取似乎是我的方法。

【讨论】:

嗨,freiheit,你能看看这个吗,***.com/questions/5302196/…【参考方案2】:

ffmpeg 也可以像这样从标准输入读取并写入标准输出:

ffmpeg -i pipe:0 -f wav pipe:1

其中 0 和 1 是标准 POSIX 文件描述符。

【讨论】:

以上是关于使用管道将文件 i/o 传输到另一个进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程间通信

使用 !ERRORLEVEL!在通过管道传输到另一个进程的代码块中

如何将 find 命令返回的文件列表通过管道传输到 cat 以查看所有文件

使用 bash,我如何将标准错误传递到另一个进程?

如何在 Linux 上使用标准 I/O 函数在多个进程中写入文件?

如何通过命名管道传输文件描述符