【问题标题】:Create a pipe of input and output for wav to mp3 encoding为 wav 到 mp3 编码创建输入和输出管道
【发布时间】:2020-03-13 21:09:39
【问题描述】:

我必须在 Python 中将波 data 流传输到 ffmpeg。我可以轻松地从输入 mp3 文件创建输出管道,例如:

       process = (
            ffmpeg
            .input(path)
            .output('pipe:', **output_kwargs)
            .run_async(pipe_stdout=True, pipe_stderr=True))
        buffer, _ = process.communicate()
        # because of we need (n_channels, samples)
        waveform = np.frombuffer(buffer, dtype='<f4').reshape(-1, n_channels)
        if not waveform.dtype == np.dtype(dtype):
            waveform = waveform.astype(dtype)

这里waveform 将包含波形音频文件。

现在,我想通过管道传输相同的数据,但来自输入流,但由于某种原因它不能按预期工作:

    # data shape is like (9161728, 2) for two channels audio data
    input_kwargs = {'ar': sample_rate, 'ac': data.shape[1]} 
    output_kwargs = {'ar': sample_rate, 'strict': '-2'}
    n_channels = 2
    process = (
        ffmpeg
        .input('pipe:', format='f32le', **input_kwargs)
        .output('pipe:', **output_kwargs)
        .run_async(pipe_stdin=True, quiet=True))
    buffer, err = process.communicate(input=data.astype('<f4').tobytes())

process.communicate得到结果后,这里的输出buffer是空的,而err

Unable to find a suitable output format for 'pipe:'\npipe:: Invalid argument\n"

【问题讨论】:

标签: python audio ffmpeg


【解决方案1】:

我知道已经很久了.. 但是对于可能遇到同样问题的其他人:如果您使用管道流来获取输出,那么您必须给 ffmpeg 一个正确的格式,以便它知道什么样的格式输出应该被转换,简单地在**output_kwargs中添加标志'-f &lt;fmt&gt;'比如'-f mp3',然后就可以了。

说如果你想把一个音频转换成.mp3,$path是你原来的音频文件路径,然后修改output_kwargs如下:

 process = (
        ffmpeg
        .input(path)
        .output('pipe:', **{'loglevel':'error', 'codec:a':libmp3lame, 'f':'mp3'})
        .run_async(pipe_stdout=True, pipe_stderr=True))
    buffer, _ = process.communicate()
    data_byte = io.BytesIO(buffer)
    fout = open(out_path,'wb')
    fout.writelines(data_byte)
    fout.close()

那么您的 mp3 文件位于 $out_path

相关的“subprocess.popen”命令应该是这样的

import subprocess
my_process = subprocess.Popen(['ffmpeg','-i', path, '-codec:a', 'libmp3lame', '-f', 'mp3', 'pipe:1'], stdout=PIPE, stderr=PIPE)
buffer, _ = process.communicate()
etc....

【讨论】:

  • 感谢您花时间回答很久以前的答案;这肯定会有所帮助?您介意格式化您的代码并提供一个完整且直接工作的示例吗?
  • @CyrilCHAPON no pro,抱歉回复晚了,我没有经常查看我的通知,
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2010-09-26
相关资源
最近更新 更多