我必须在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"
答案 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