使用 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.