将音频和视频块从 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 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中
使用url从python流传输youtube音频而无需下载python