1. 程式人生 > >ALSA音訊概念介紹

ALSA音訊概念介紹

(1) 取樣位數 : 也就是codec取樣時一個點所佔的bit數,通常有8,16,24bit等.

(2) 通道數[channel] : 是mono還是stereo,對應的是1或者是2通道.

(3) 取樣率 : codec 每秒取樣的點數,如44.1KHZ,就是每秒44100個點.

		PCM在採集音訊資料時採用**frame,periods,channel,及sample bit**來設定引數並按照設定的格式來採集.

還得介紹兩引數:frames和period:

(1) frames : 是由取樣時通道數(channel)和取樣位數(sample bit)來共同決定的,和取樣頻率等其他引數無任何聯絡,記住是無任何聯絡,

它僅僅是表示取樣一次所對應的bit數.eg

[1] : 1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes. (對於取樣率為48KHZ,取樣位數16bit 的立體聲的1frame為4位元組).

[2] : 1 frame of a 5.1 48khz 16bit PCM stream is 2 bytes. (對於取樣率為5.148KHZ,取樣位數16bit的單聲道的1rame為2位元組).

(2) period : ALSA的官方是這樣介紹的 : A period is the number of frames in between each hardware interrupt. 意思就是硬體的每次中斷所對應的frames數為一個period,簡稱一個週期吧.

exmple : 我們讓codec工作在 stereo立體聲,16-bits, 44.1KHZ 的取樣流中,

          [1] 'stereo' = 2;

          [2] 1 analog sample 是16-bits = 2bytes;

          [3]1 frame = (num_channels) * (1 sample in bytes) = (2 channels) * (2 bytes (16 bits) per sample) = 4 bytes (32 bits)

          [4] Bps_rate = (num_channels) * (1 sample in bytes) * (analog_rate) = 2 * 2 * 44100 = 176400 Bytes/sec.

如果 ALSA每秒中斷一次,那麼我們就需要準備176400 bytes的空間.

如果ALSA半秒中斷一次,那麼我們就需要準備 176400/2 = 88200 bytes個大小的空間. 100ms中斷一次的話我們就需要 176400 * 0.1 = 17640 bytes大小空間.

由上面的分析可以看出,我們可以控制PCM中斷每次的產生,通過設定period 的大小,

[1] : 如果我們設定16-bit stereo @ 44.1Khz和period_size to 4410 frames =>(對於16-bit stereo @ 44.1Khz, 1 frame 等於 4 bytes 來說- 4410 frames equal 4410*4 = 17640 bytes) => 每100ms一次的中斷將產生17640 個位元組.

[2] : 相應的buffer_size 應至少為 2 * period_size = 2 * 4410 = 8820frames = 8820 * 4 = 35280bytes.

採集過程中ALSA會將按照我們自己設定的格式將資料按照每period大小存放在迴圈緩衝區中.

下一篇將詳細介紹如何ALSA API程式設計.