Alsa 音頻編程小結(一)

本文主要記錄我在完成實現基本錄音與播放的過程中遇到的問題。
首先,介紹完成程序,我參考過的博文:
http://blog.csdn.net/u013494117/article/details/52269463
http://blog.csdn.net/keepingstudying/article/details/50674284

一、瞭解一下各個參數的含義以及一些基本概念
樣本長度(sample):樣本是記錄音頻數據最基本的單位,計算機對每個通道採樣量化時數字比特位數,常見的有8位和16位。

通道數(channel):該參數爲1表示單聲道,2則是立體聲。

幀(frame):幀記錄了一個聲音單元,其長度爲樣本長度與通道數的乘積,一段音頻數據就是由苦幹幀組成的。

採樣率(rate):每秒鐘採樣次數,該次數是針對幀而言,常用的採樣率如8KHz的人聲, 44.1KHz的mp3音樂, 96Khz的藍光音頻。

週期(period):音頻設備一次處理所需要的楨數,對於音頻設備的數據訪問以及音頻數據的存儲,都是以此爲單位。

交錯模式(interleaved):是一種音頻數據的記錄方式 在交錯模式下,數據以連續楨的形式存放,即首先記錄完楨1的左聲道樣本和右聲道樣本(假設爲立體聲格式),再開始楨2的記錄。 而在非交錯模式下,首先記錄的是一個週期內所有楨的左聲道樣本,再記錄右聲道樣本,數據是以連續通道的方式存儲。不過多數情況下,我們只需要使用交錯模式就可以了。

period(週期): 硬件中中斷間的間隔時間。它表示輸入延時。

比特率(Bits Per Second):比特率表示每秒的比特數,比特率=採樣率×通道數×樣本長度
二、ALSA介紹
1、設備命名

  API庫使用邏輯設備名而不是設備文件。設備名字可以是真實的硬件名字也可以是插件名字。硬件名字使用hw:i,j這樣的格式。其中i是卡號,j是這塊聲卡上的設備號。

  第一個聲音設備是hw:0,0.這個別名默認引用第一塊聲音設備並且在本文示例中一真會被用到。

  插件使用另外的唯一名字,比如 plughw:,表示一個插件,這個插件不提供對硬件設備的訪問,而是提供像採樣率轉換這樣的軟件特性,硬件本身並不支持這樣的特性。
  我用的是主機的本地聲卡,所以聲卡設備要使用“default”或“hw:0,0”。否則在設置參數的時候
  

 rc = snd_pcm_hw_params(handle, params);
  if (rc < 0) {
    fprintf(stderr,
            "unable to set hw parameters: %s\n",
            snd_strerror(rc));
    exit(1);
  }

會出現invalid arguments 。無效參數。

在前面提到的參考博文中,錄音和播放程序裏面會出現下面的語句。

 /* We want to loop for 5 seconds */
  snd_pcm_hw_params_get_period_time(params,&val, &dir);
  /* 5 seconds in microseconds divided by
   * period time */
  loops = 5000000 / val;

這裏的val變量和前面程序裏用到的採樣率參數val=44100是同一個變量。但是這裏我們要的到的是週期,執行完上面一條語句後,val的值不在是採樣率的值了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章