Python:如何将mp3块解码为PCM样本?

问题描述 投票:1回答:1

我正在尝试捕获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文件。我有...

python audio ffmpeg mp3 wav
1个回答
1
投票

您缺少对mp3流的解码。您只是将mp3文件另存为wav。

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