将音频和视频块从 python 中传输到 ffmpeg 的最佳方法

Posted

技术标签:

【中文标题】将音频和视频块从 python 中传输到 ffmpeg 的最佳方法【英文标题】:Best way to pipe audio and video chunks from within python to ffmpeg 【发布时间】:2016-05-06 17:19:33 【问题描述】:

问题

我从第三方服务器获取音频和视频块,我想根据这些说明将这些块通过管道传输到 ffmpeg 以创建 WebM 实时流:

http://wiki.webmproject.org/adaptive-streaming/instructions-to-do-webm-live-streaming-via-dash

这里他们使用来自网络摄像头和麦克风的输入,但我需要使用数据块,所以 ffmpeg 命令看起来像这样:

    cmd = [
        "ffmpeg",
        "-f", "flv", "-i", "video.fifo",
        "-f", "s16le", "-ar", "16000", "-ac", "1", "-i", "audio.fifo",
        "-map", "0:0",
        "-pix_fmt", "yuv420p",
        "-c:v", "libvpx-vp9",
        "-s", "640x480", "-keyint_min", "40", "-g", "40", "-speed", "6",
        "-tile-columns", "4", "-frame-parallel", "1", "-threads", "8",
        "-static-thresh", "0", "-max-intra-rate", "300",
        "-deadline", "realtime", "-lag-in-frames", "0",
        "-error-resilient", "1",
        "-b:v", "3000k",
        "-f", "webm_chunk",
        "-header", self.video_header,
        "-chunk_start_index", "1",
        "video_360_%d.chk",
        "-map", "1:0",
        "-c:a", "libvorbis",
        "-b:a", "16k", "-ar", "16000",
        "-f", "webm_chunk",
        "-audio_chunk_duration", "2000",
        "-header", self.audio_header,
        "-chunk_start_index", "1",
        "audio_171_%d.chk"
    ]

如您所见,我正在使用“video.fifo”和“audio.fifo”文件,因为我认为通过命名管道将块导入是个好主意,但我无法获得它工作。这是我正在做的事情:

p = subprocess.Popen(cmd)
fa = os.open("video.fifo", os.O_WRONLY)
fv = os.open("audio.fifo", os.O_WRONLY)

所以我首先启动子进程,以便它打开 fifo 文件进行读取。在那之后,我应该能够打开它们进行写作,但我不能。更具体地说,我可以打开第一个,但不能打开第二个。因此,如果有多个输入,这可能与 ffmpeg 如何处理其输入有关,但我只是不知道。

问题

如何解决不可打开的命名管道的问题,或者如何在没有命名管道的情况下实现我想要实现的目标。

【问题讨论】:

我确实想实现这一点并将原始视频/音频发送到两个不同的管道,因为将它们发送到一个会导致我的视​​频很奇怪而且仍然没有声音! 【参考方案1】:

链接中的说明建议在后台运行 ffmpeg。从 ffmpeg 手册页:

-标准输入

在标准输入上启用交互。默认情况下打开,除非标准输入用作输入。要明确禁用交互,您需要指定“-nostdin”。

禁用标准输入上的交互很有用,例如,如果 ffmpeg 在后台进程组中。使用 "ffmpeg ... /null" 可以达到大致相同的结果,但它需要一个 shell。

不久前我遇到了类似的问题。当处理多个输入时,ffmpeg 第一次会按预期工作,然后每次都开始抛出错误。将-nostdin 添加到您的全局参数或</dev/null 应该可以解决问题。去掉所有的花里胡哨,下面的任何一个都应该可以工作。

ffmpeg [in-args][input][out-args][output] & </dev/null

ffmpeg [-nostdin in-args][input][out-args][output] &

希望这会有所帮助。

【讨论】:

以上是关于将音频和视频块从 python 中传输到 ffmpeg 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 合并音频和视频流并将其通过管道传输到客户端

使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中

Android:如何通过蓝牙连接传输视频和音频?

使用url从python流传输youtube音频而无需下载python

将 getUserMedia 流式传输到 Icecast 服务器?

使用 JMF 将多路复用的音频/视频录制到文件中