首页 > 解决方案 > Python:如何将 mp3 块解码为 PCM 样本?

问题描述

我正在尝试捕获 mp3 webstream 的块并将它们解码为 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()

你知道如何处理这个问题吗?

标签: pythonaudioffmpegmp3wav

解决方案


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

您首先需要解码 mp3 音频。这将为您提供 PCM 样本 + 音频信息。


推荐阅读