python - 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()
你知道如何处理这个问题吗?
解决方案
您缺少 mp3 流的解码。您只是将 mp3 文件保存为 wav。
您首先需要解码 mp3 音频。这将为您提供 PCM 样本 + 音频信息。
推荐阅读
- javascript - 赛普拉斯 waitUntill 在 400 毫秒后重新分层,如何延长其超时时间?
- vb.net - Datatable.Select 列 A 和 B 上具有相同值的行
- flutter - 灵活的小部件不在列内呈现
- c# - 如何在 VSTO c# 中使用代码名称获取工作表名称?
- annotations - 带有注释的 Jdbi3 不能工作,@RegisterBeanMapper 不能工作
- crystal-reports - 来自 Web 服务的动态图像的 Crystal Reports 问题
- python - 如何在 Kubernetes 环境中正确终止 celery 任务?
- python - 通过 Selenium 提取帖子,然后在 CSV 文件中打印结果
- flutter - 如何在 Flutter_Redux 中使用多个数据模型(数据类型)?(简而言之,我想返回 2 种不同数据类型的减速器)
- http - 永久重定向不适用于一切