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 文件中提取原始音频数据

如何在播放时处理 ipod 库音频文件原始数据

iphone,objective c,如何从音频文件中读取原始数据(未应用编解码器)

播放 mp3 原始音频数据而不写入文件

使用 (Python) Gstreamer 解码音频(到 PCM 数据)

如何从 iOS 中的十六进制/二进制(原始数据)值生成音频文件?