使用 Python (aifc) 读取和写入 AIFF 和 AIFC 文件


aifc 模块中的各种函数提供了对读取和写入 AIFF(音频交换文件格式)和 AIFF-C 文件的支持。AIFF 格式用于将数字音频样本存储在文件中。其更新版本 AIFF-C 能够压缩音频数据。

音频文件包含许多描述音频数据的参数。

  • 采样率或帧率:每秒钟对声音进行采样的次数。

  • 声道数:指示音频是单声道、立体声还是四声道。

  • 帧:每个声道包含一个样本。

  • 样本大小:每个样本的字节大小。

因此,一个帧包含声道 * 样本大小字节。1 秒的音频数据为声道 * 样本大小 * 帧率字节。

aifc 模块中定义了以下函数

aifc.open()

此函数打开一个 AIFF 或 AIFF-C 文件,并返回一个对象实例,用于根据模式读取/写入音频数据。如果必须打开文件以进行读取,则它必须是“r”或“rb”。如果必须打开文件以进行写入,则它应该是“w”或“wb”。

使用写入模式的对象使用以下函数

aiff()
创建 AIFF 文件。
aifc()
创建 AIFF-C 文件。
setnchannels()
指定音频文件中的声道数。
setsampwidth()
指定音频样本的字节大小。
setframerate()
指定每秒的采样频率(以帧为单位)。
setnframes()
指定要写入音频文件的帧数。
setcomptype()
指定压缩类型。AIFF 文件不支持压缩。支持的压缩类型 - b'NONE'、b'ULAW'、b'ALAW'、b'G722'。
setparams()
一次设置所有上述参数。参数是一个元组,包含各种参数。
writeframes()
将数据写入输出文件。
writeframesraw()
类似于 writeframes(),但不会更新音频文件的头部。

以下程序创建了一个 AIFF 文件

import aifc, struct
sampleRate = 44100.0 # hertz
duration = 1.0 # seconds
frequency = 440.0 # hertz
obj = aifc.open('sound.aiff','w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(99999):
value = random.randint(-32767, 32767)
data = struct.pack('<h', value)
obj.writeframesraw( data )
obj.close()

aiff 或 aiff-c 读取对象使用以下函数

getnchannels()
返回音频通道数(单声道为 1,立体声为 2)。
getsampwidth()
返回单个样本的字节大小。
getframerate()
返回采样率(每秒的音频帧数)。
getnframes()
返回文件中的音频帧数。
getcomptype()
返回一个长度为 4 的字节数组,描述音频文件中使用的压缩类型。
getparams()
返回一个 namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname
readframes()
读取并返回音频文件中的下一个 nframes 帧。
setpos(pos)
跳转到指定的帧号。

这些函数可用于可读和可写的 aiff 对象

rewind()
倒回读取指针。下一个 readframes() 将从开头开始。
tell()
返回当前帧号。
close()
关闭 AIFF 文件。调用此方法后,该对象将无法再使用。

示例

以下程序读取 aiff 文件的属性

import aifc
obj = aifc.open('sound.aiff','r')
print( "Number of channels",obj.getnchannels())
print ( "Sample width",obj.getsampwidth())
print ( "Frame rate.",obj.getframerate())
print ("Number of frames",obj.getnframes())
print ( "parameters:",obj.getparams())
obj.close()

输出

Number of channels 1
Sample width 2
Frame rate. 44100
Number of frames 99999
parameters: _aifc_params(nchannels=1, sampwidth=2, framerate=44100, nframes=99999, comptype=b'NONE', compname=b'not compressed')

更新于: 2020年6月30日

716 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.