我正在尝试捕获mp3网络流的大块并将其解码为PCM样本以进行信号处理。我试图通过请求和io.BytesIO捕获音频,以将数据另存为.wav文件。
我必须将mp3数据转换为wav数据,但我不知道如何。 (我的目标不是记录.wav文件,我只是在测试算法。)
我找到了pymedia lib,但是它很旧(上一次提交是在2006年),使用python 2.7,对我来说不可安装。
也许使用ffmpeg-python可能,但是我刚刚看到了使用文件作为输入和输出的示例。
这是我的代码:
import requests import io import soundfile as sf import struct import wave import numpy as np def main(): stream_url = r'http://dg-wdr-http-dus-dtag-cdn.cast.addradio.de/wdr/1live/diggi/mp3/128/stream.mp3' r = requests.get(stream_url, stream=True) sample_array = [] try: for block in r.iter_content(1024): data, samplerate = sf.read(io.BytesIO(block), format="RAW", channels=2, samplerate=44100, subtype='FLOAT', dtype='float32') sample_array = np.append(sample_array, data) except KeyboardInterrupt: print("...saving") obj = wave.open('sounds/stream1.wav', 'w') obj.setnchannels(1) # mono obj.setsampwidth(2) # bytes obj.setframerate(44100) data_max = np.nanmax(abs(sample_array)) # fill WAV with samples from sample_array for sample in sample_array: if (np.isnan(sample) or np.isnan(32760 * sample / data_max)) is True: continue try: value = int(32760 * sample / data_max) # normalization INT16 except ValueError: value = 1 finally: data = struct.pack('<h', value) obj.writeframesraw(data) obj.close() print("end") if __name__ == '__main__': main()
您有解决该问题的想法吗?
我正在尝试捕获mp3网络流的大块并将其解码为PCM样本以进行信号处理。我试图通过请求和io.BytesIO捕获音频,以将数据另存为.wav文件。我有...
您缺少对mp3流的解码。您只是将mp3文件另存为wav。