使用 FFmpeg 通过管道输出视频片段

Posted

技术标签:

【中文标题】使用 FFmpeg 通过管道输出视频片段【英文标题】:Output video segments via a pipe using FFmpeg 【发布时间】:2014-07-01 10:45:32 【问题描述】:

我的 Node.js 应用程序使用 FFmpeg 来捕获 DirectShow 设备的视频,然后输出用于实时流 (HLS) 的片段。目前我将段输出到文件,但是如果我可以通过管道输出它们,它将允许我通过 websocket 有效地发送段,而不是托管 HTTP 服务器。

我试过使用这个命令:

ffmpeg -y -f dshow -i video=FFsource:audio=Stereo Mix (Realtek High 定义音频)-vcodec libvpx -acodec libvorbis -threads 0 -b:v 3300k -cpu-used 5 -keyint_min 150 -g 150 -map 0 -flags:v +global_header -f 段 -

但是它给出了错误“无法为输出文件 #0 写入标头(编解码器参数不正确?):未找到多路复用器”。此命令适用于输出到文件(通过将 '-' 替换为 'seg_%03d.webm')。

FFmpeg 不支持分段视频的管道,还是命令有问题?谢谢。

【问题讨论】:

在管道上输出分段文件是什么意思? 你找到解决办法了吗? 【参考方案1】:

使用-f nut 代替-f segmentnut 格式可以包含所有类型的标头和音频、视频编解码器。

ffmpeg -y -f dshow -i video=FFsource:audio=Stereo Mix (Realtek High Definition Audio) -vcodec libvpx -acodec libvorbis -threads 0 -b:v 3300k -cpu-used 5 -keyint_min 150 -g 150 -map 0 -flags:v +global_header -f nut pipe:

【讨论】:

【参考方案2】:

您可以通过ffmpeg -i pipe:0 pipe:1 从标准输入读取并输出到标准输出。

您可以查看我在一个项目中使用的示例 FFmpeg 包装器:

https://github.com/lperrin/node_airtunes/blob/master/examples/play_ffmpeg.js

如果您计划从网络流式传输,则可能在某个时候需要一个循环缓冲区。项目中有一个你可以抢。

【讨论】:

尝试使用 'pipe:1' 而不是 '-' 输出到标准输出,但我仍然得到同样的错误。似乎只是分段的问题,因为使用'pipe:1'输出整个文件工作正常。还是谢谢。

以上是关于使用 FFmpeg 通过管道输出视频片段的主要内容,如果未能解决你的问题,请参考以下文章

我可以将多个 ffmpeg 输出通过管道传输到不同的管道吗?

FFmpeg - 通过管道输入原始帧 - FFmpeg不检测管道关闭

ffmpeg 为啥输出视频对比度/亮度太亮?

Python 子进程中的 ffmpeg - 无法为“管道:”找到合适的输出格式

使用python将opencv图像通过管道传输到ffmpeg

ffmpeg 在尝试用图像制作幻灯片时抛出“输出文件 #0 不包含任何流”