音視頻:錄製和播放 PCM 音頻

昨天學習了圖片的繪製,今天輪到了音頻的採集和播放。java

Android 在音頻的採集上有提供相應的 API,就是 AudioRecord。git

錄音部分

AudioRecord 是什麼?

AudioRecord 是爲 Java 應用程序提供管理音頻資源功能的類,使應用程序可能經過此類可以獲取聲音相關硬件所收集的聲音。github

錄音是 Input 行爲,因此這個功能的實現就是經過讀取硬件的數據來完成錄音的過程。緩存

實現錄音的流程

  1. 構造一個 AudioRecord 對象,並指定須要的最小的緩存 buffer 大小。微信

    這個緩存是用來存儲未讀取的聲音數據的,他代表聲音數據沒有被讀取前,能錄多久的音(即一次能夠錄製的聲音容量)。markdown

  2. 初始化一個 buffer,這個 buffer 和 上一步指定的 buffer 不一樣,這是用來表示每次讀取聲音數據讀取多少的。oop

  3. 開始錄音。學習

  4. 建立一個數據流,將從 AudioRecord 讀取到聲音數據存儲在數據流中。spa

  5. 關閉數據流。code

  6. 中止錄音。

從上面的步驟就能夠看出錄音其實和普通的文件 I/O 的思想是一致的。說到這裏,其實計算機裏就是計算和 I/O,掌握這個模型後,大部分的邏輯都能理通。

AudioRecord 參數詳解

AudioRecord 須要的參數有如下幾個:

  • audioSource //音頻源
  • frequency //採樣率
  • channelConfiguration //聲道
  • encodingBitRate //採樣位數
  • bufferSizeInBytes //採集數據緩衝區大小

接下來對各個參數進行詳細說明:

音頻源

音頻源指的是從哪裏採集音頻,也就是指定硬件設備。下面是 Android 所支持的音頻源,在 MediaRecorder.AudioSource 中定義:

/**默認聲音**/
public static final int DEFAULT = 0;

/**麥克風聲音*/
public static final int MIC = 1;

/**通話上行聲音*/
public static final int VOICE_UPLINK = 2;

/**通話下行聲音*/
public static final int VOICE_DOWNLINK = 3;

/**通話上下行聲音*/
public static final int VOICE_CALL = 4;

/**根據攝像頭轉向選擇麥克風*/
public static final int CAMCORDER = 5;

/**對麥克風聲音進行聲音識別,而後進行錄製*/
public static final int VOICE_RECOGNITION = 6;

/**對麥克風中相似ip通話的交流聲音進行識別,默認會開啓回聲消除和自動增益*/
public static final int VOICE_COMMUNICATION = 7;

/**錄製系統內置聲音*/
public static final int REMOTE_SUBMIX = 8;
複製代碼

採樣率

採樣率指的是音頻的採樣率,每秒鐘可以採樣的次數,採樣率越高,音質越高。此處推薦的採樣率是 44100、22050、11025,可是並不侷限於這幾個。

聲道

Android 支持雙聲道立體聲單聲道,這部分在 AudioFormat 中定義

public static final int CHANNEL_IN_MONO = CHANNEL_IN_FRONT;
public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
複製代碼

採樣位數

經過 AudioRecoder 採集到的聲音數據是 PCM 格式的,在計算機中採樣位數通常有 8 位和 16 位之分。這個參數是用來衡量聲音波動變化的一個參數,相似於分辨率的概念,他的數值越大,錄製的顆粒度越細,聲音就更精細。

須要注意的是: 8 位不是說將縱軸分割成 8 份,而是分紅 2 的 8 次方,即 256 份。同理,16 位是把縱軸分割成 2 的 16 次方 65536 份。

存儲量

在錄製的時候並不須要存儲量這個參數,可是已經知道了這些參數,就能夠計算出錄製文件的存儲大小了。聲音最重要的三個參數就是:聲道、採樣位數、採樣頻率,因此由如下公式能夠計算出錄製文件的大小:

存儲量= (採樣頻率 · 採樣位數 · 聲道 · 時間)/8 (單位:字節數)

播放部分

上半部分講了怎麼錄製聲音,下半部分聊一下怎麼把錄製的聲音播放出來。

播放錄製的聲音須要用到 AudioTrack 這個類。

AudioTrack

其實和錄製幾乎同樣,只是流程是相反的。畢竟一個是 input,一個是 output。仍是標準的 I/O 思路,參數也一致。

最後

最後確定要放代碼的,代碼太長了,就不在文章中貼出來了。感興趣的能夠去 GitHub 倉庫看看。

倉庫地址:github.com/T-Oner/Medi…


最新更新請關注微信公衆號

相關文章
相關標籤/搜索