使用Python子进程将PCM数据从FFMPEG管道传输到另一个进程

问题描述 投票:0回答:2

我正在尝试转录播客。为此,我使用FFMPEG解码mp3流,并将生成的PCM输出传送到语音识别组件。我的代码看起来像这样。

mp3=subprocess.Popen(['ffmpeg','-i',audio_url,
                              '-f','s16le','-ac','1','-ar','16000','pipe:0'],
                              stdout=subprocess.PIPE)
sphinx=subprocess.Popen(['java','-jar','transcriber.jar'],
                                stdin=mp3.stdout,
                                stdout=subprocess.PIPE)

其中audio_url是mp3文件的url。

当我尝试运行它时,它会挂起。似乎通过管道馈送解码的PCM数据已陷入僵局。我该怎么做才能解决这个问题?输出数据的大小可能太大,以至于subprocess.Popen.communicate不是一个选项,明确调用mp3.stdout.close()没有任何效果。

python ffmpeg subprocess
2个回答
2
投票

您的pipe号码不正确。正确的值是:

  • pipe:0 - stdin
  • pipe:1 - stdout
  • pipe:2 - stderr

您可以使用:

  • pipe:1,或
  • 只是pipe:,因为输出的默认值是stdout,或
  • 只需使用-

FFmpeg Documentation: pipe protocol


0
投票

事实证明pipe:0不会连接到mp3.stdout。我使用-而现在它正在工作。

© www.soinside.com 2019 - 2024. All rights reserved.