Python打开原始音频数据文件
Posted
技术标签:
【中文标题】Python打开原始音频数据文件【英文标题】:Python open raw audio data file 【发布时间】:2009-06-05 16:05:51 【问题描述】:我有这些扩展名为“.adc”的文件。它们只是原始数据文件。我可以使用 File->Import->Raw data 用编码“Signed 16 bit”和采样率“16000 Khz”打开它们。
我想对 python 做同样的事情。我认为 audioop 模块是我需要的,但我似乎无法找到如何将它用于如此简单的事情的示例。
主要目标是打开文件并播放文件中的某个位置,例如从第二个 10 到第二个 20。有什么东西可以完成我的任务吗?
提前感谢。
【问题讨论】:
【参考方案1】:要打开文件,您只需要file()
。
要查找位置,您不需要 audioop:您只需将秒转换为字节并获取文件所需的字节。例如,如果您的文件是 16 kHz 16 位单声道,则每秒是 32,000 字节的数据。所以第 10 秒是文件的 320kB。只需寻找文件中的适当位置,然后读取适当的字节数。
而且 audioop 无法帮助您完成最困难的部分:即播放音频。执行此操作的正确方法很大程度上取决于您的操作系统。
编辑:抱歉,我刚刚注意到您的用户名是“thelinuxer”。考虑pyAO 在 Linux 上播放来自 Python 的音频。您可能需要更改示例格式来播放音频——audioop 将帮助您解决此问题(请参阅 ratecv、tomono/tostereo、lin2lin 和bias)
【讨论】:
16kHz 16bit 单声道不是 16,000 字节的数据吗? (如果是立体声,还有 32,000 字节?) 啊,nvm,我明白了! 16 位 == 2 个字节。然后,2 字节 * 16 个样本/秒 == 32,000 字节/秒。【参考方案2】:非常感谢我能够做到以下几点:
def play_data(filename, first_sec, second_sec):
import ao
from ao import AudioDevice
dev = AudioDevice(2, bits=16, rate=16000,channels=1)
f = open(filename, 'r')
data_len = (second_sec-first_sec)*32000
f.seek(32000*first_sec)
data = f.read(data_len)
dev.play(data)
f.close()
play_data('AR001_3.adc', 2.5, 5)
【讨论】:
【参考方案3】:您可以使用PySoundFile 将文件作为 NumPy 数组打开并使用python-sounddevice 播放。
import soundfile as sf
import sounddevice as sd
sig, fs = sf.read('myfile.adc', channels=2, samplerate=16000,
format='RAW', subtype='PCM_16')
sd.play(sig, fs)
您可以在 NumPy 数组上使用索引来选择音频数据的某个部分。
【讨论】:
尝试将其与原始音频流一起使用,在级别参数中出现“错误无效文件:bytearray(b'\xd8\x04\xb8\x05h\x06\xc8\x068\x07x\x07\xb8\ x06\xb8\x05\xb8\x05\xc8\x06\xc8\x06h\x06H\x06\xd8\x05\x98\x04\xd8\x03@\x03x\x02\x90\x02p\x030\x04\xf0\x03 \xa0..." 任何想法如何修复它?以上是关于Python打开原始音频数据文件的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中使用 libsndfile 从 WAV 文件中提取原始音频数据
iphone,objective c,如何从音频文件中读取原始数据(未应用编解码器)