创建输入和输出管道,以将wav转换为mp3编码

时间:2019-11-18 13:21:46

标签: python audio ffmpeg

我必须在Python中将wave 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将包含wave音频文件。

现在,我想通过输入流传输相同的数据,但是由于某些原因,它无法按预期运行:

    # 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())

buffer获得结果后,输出process.communicate为空,而err

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

1 个答案:

答案 0 :(得分:1)

我知道已经很久了..但是对于其他可能遇到相同问题的人:如果您使用管道流来掌握输出,那么您必须给ffmpeg适当的格式,以便它知道哪种格式。输出应该进行转换,只需在const [array,setArray]= useState([]); setArray(array => { let data = [...array]; let temp = data[j]; data[j] = data[j+1]; data[j+1] = temp; console.log(data); return data ; }) 中添加'-f <fmt>'这样的标志'-f mp3',然后应该这样做。

例如,如果您要将音频转换为.mp3,则$ path是您的原始音频文件路径,然后按如下所示修改**output_kwargs

output_kwargs

然后将您的mp3文件保存在 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()

相关的“ $out_path”命令应类似于

subprocess.popen