Android 音頻入門之理論知識

簡介

音頻是個專業(yè)術語,音頻一詞已用作一般性描述音頻范圍內和聲音有關的設備及其作用。人類能夠聽到的所有聲音都稱之為音頻,它可能包括噪音等。聲音被錄制下來以后,無論是說話聲、歌聲、樂器都可以通過數(shù)字音樂軟件處理,把它制作成音頻文件。而音頻只是儲存在計算機里的聲音。

簡單講,其實就是將采集到的音頻模擬信號,經過一定的轉換,變成方便在信道中傳輸?shù)臄?shù)字信號。在不同的使用場景,也許會使用不同的編碼方式,那么音頻質量、碼率、安全系數(shù)等都不一樣。

音頻基礎知識

采樣和采樣頻率:
一秒鐘內采樣的次數(shù)稱為采樣頻率。采樣頻率越高,越接近原始信號,但是也加大了運算處理的復雜度。根據(jù)Nyquist采樣定理,要想重建原始信號,采樣頻率必須大于信號中最高頻率的兩倍。人能感受到的頻率范圍為20HZ--20kHZ, 一般音樂的采樣頻率為44.1kHZ, 更高的可以是48kHZ和96kHZ,不過一般人用耳聽感覺不出差別了。語音主要是以溝通為主,不需要像音樂那樣清晰,用16k采樣的語音就稱為高清語音了?,F(xiàn)在主流的語音采樣頻率為16kHz。

采樣位數(shù):
數(shù)字信號是用0和1來表示的。采樣位數(shù)就是采樣值用多少位0和1來表示,也叫采樣精度,用的位數(shù)越多就越接近真實聲音。如用8位表示,采樣值取值范圍就是-128--127,如用16位表示,采樣值取值范圍就是-32768--32767。現(xiàn)在一般都用16位采樣位數(shù)。

聲道:
聲道是指處理的聲音是單聲道還是立體聲。Android支持雙聲道立體聲和單聲道。CHANNEL_IN_MONO單聲道,CHANNEL_IN_STEREO立體聲。單聲道在聲音處理過程中只有單數(shù)據(jù)流,而立體聲則需要左、右聲道的兩個數(shù)據(jù)流。顯然,立體聲的效果要好,但相應的數(shù)據(jù)量要比單聲道的數(shù)據(jù)量加倍。

碼率:
就是比特率。比特率是指每秒傳送的比特(bit)數(shù)。碼率=采樣率X采樣位數(shù)X聲道數(shù)。

音頻采集和播放:
一般用專門的芯片(通常叫codec芯片)采集音頻,做AD轉換,然后把數(shù)字信號通過I2S總線(主流用I2S總線,也可以用其他總線,比如PCM總線)送給CPU處理(也有的會把codec芯片與CPU芯片集成在一塊芯片中)。當要播放時CPU會把音頻數(shù)字信號通過I2S總線送給codec芯片,然后做DA轉換得到模擬信號再播放出來。

音頻編碼過程

image

時域轉頻域變化
時域是描述數(shù)學函數(shù)或物理信號對時間的關系。
在研究時域的信號時,常會用示波器將信號轉換為其時域的波形
頻域是指在對函數(shù)或信號進行分析時,分析其和頻率有關部份,而不是和時間有關的部份
有興趣的可以去了解一下傅里葉變換

心理聲學原理
心理聲學原理是指用功能強大的算法將我們聽不到的音頻信息去掉。
20hz-20000hz之間的,才是人能聽到的。之外的可以稱為冗余數(shù)據(jù)。
冗余數(shù)據(jù)還有被遮蔽掉的數(shù)據(jù),分為頻域遮蔽和時域遮蔽。

量化編碼
通常也把音頻采樣過程叫脈沖編碼調制編碼,即PCM(Pulse Code Modulation)編碼,采樣值也叫PCM值。
PCM通過抽樣、量化、編碼三個步驟將連續(xù)變化的模擬信號轉換為數(shù)字編碼。

image

如圖,我們首先對一段音頻片段進行10次抽樣。
每次采樣,都存在不同的振幅。為了實現(xiàn)以數(shù)字碼表示樣值,必須采用“四舍五入”的方法把樣值分級“取整”,使一定取值范圍內的樣值由無限多個值變?yōu)橛邢迋€值。這一過程稱為量化。
然后我們將不同的樣值進行編碼,將十進制的值轉化為計算機認識的二進制的值。
最后根據(jù)二進制的值,我們轉化為數(shù)字信號。就是所形成的方波。

音頻壓縮

音頻壓縮類型
1.有損壓縮,就是消除冗余數(shù)據(jù)。音頻采集過程中采集到各種各樣的聲音,只有一部分是人能識別出來的。其他的聲音,我們直接刪除掉。恢復回來的時候沒有了,所以稱為有損壓縮。
2.哈夫曼無損壓縮,利用數(shù)據(jù)的統(tǒng)計冗余進行壓縮,可完全恢復原始數(shù)據(jù)而不引起任何數(shù)據(jù)丟失的,稱為無損壓縮。

使用音頻壓縮技術的原因
要計算一個PCM音頻流的碼率是一件很輕松的事情,采樣率值×采樣大小值×聲道數(shù)。一個采樣率為44.1KHz,采樣大小為16bit,雙聲道的PCM編碼的音頻文件,它的碼率則為 44.1K×16×2 =1411.2 Kbps。注意這邊的單位是小b,單位是位。如果我們將單位轉換為字節(jié),則需要將碼率除以8,就可以得到這個WAV的數(shù)據(jù)速率,即176.4KB/s。這表示存儲一秒鐘采樣率為44.1KHz,采樣大小為16bit,雙聲道的PCM編碼的音頻信號,需要176.4KB的空間,1分鐘則約為10.34M,這對大部分用戶是不可接受的,尤其是喜歡在電腦上聽音樂的朋友,要降低磁盤占用,只有2種方法,降低采樣指標或者壓縮。降低指標是不可取的,因此專家們研發(fā)了各種壓縮方案。
MP3發(fā)展已經有10個年頭了,MP3作為前幾年最為普及的音頻壓縮格式,他是MPEG(MPEG:Moving Picture Experts Group) Audio Layer-3的簡稱,是MPEG1的衍生編碼方案,1993年由德國Fraunhofer IIS研究院和湯姆生公司合作發(fā)展成功。MP3可以做到12:1的驚人壓縮比并保持基本可聽的音質,在當年硬盤天價的日子里,MP3迅速被用戶接受,為大家所大量接受。

常見音頻的壓縮編碼
目前主要有三大技術標準組織制定壓縮標準:
a)ITU,主要制定有線語音的壓縮標準(g系列),有g711/g722/g726/g729等。
b)3GPP,主要制定無線語音的壓縮標準(amr系列等), 有amr-nb/amr-wb。后來ITU吸納了amr-wb,形成了g722.2。
c)MPEG,主要制定音樂的壓縮標準,有11172-3,13818-3/7,14496-3等。
一些大公司或者組織也制定壓縮標準,比如iLBC,OPUS。

目前市場編解碼器性能比較OPUS > Vorbis > AAC ,其他的已經隨時間慢慢退出市場了

在android中使用最多的音頻文件莫屬于mp3文件。如果讀取一些mp3文件的一些格式信息呢。在代碼中可以這樣實現(xiàn)。

通過一個MP3文件地址,解析文件信息。
假設現(xiàn)在有一個地址

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "莫文蔚-外面的世界.mp3";


通過MediaMetadataRetriever來解析MP3文件信息
代碼如下

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
        mmr.setDataSource(path);
Log.d(TAG, "parseMp3File名稱: " + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
Log.d(TAG, "parseMp3File專輯: " + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
Log.d(TAG, "parseMp3File歌手: " + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
Log.d(TAG, "parseMp3File碼率: " + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE));
Log.d(TAG, "parseMp3File時長: " + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
Log.d(TAG, "parseMp3File類型: " + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));

MediaMetadataRetriever類可以解析出媒體文件的基本信息,例如音頻和視頻文件。視頻文件可以解析出,視頻的寬、高等信息。具體可以解析出哪些信息,可以自行查看該類。

獲取MP3專輯圖片也是通過MediaMetadataRetriever類獲取,只是跟普通字符信息獲取方式不同,代碼如下:

 byte[] data = mmr.getEmbeddedPicture();
 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
 imageView.setImageBitmap(bitmap);

類用完,要記得釋放:

 mmr.release();


獲得mp3文件的頻率,通過MediaFormat類,代碼如下:

MediaExtractor mex = new MediaExtractor();
try {
      mex.setDataSource(path);
  } catch (IOException e) {
      e.printStackTrace();
 }
MediaFormat mf = mex.getTrackFormat(0);
int sampleRate = mf.getInteger(MediaFormat.KEY_SAMPLE_RATE);
mex.release();
Log.d(TAG, "parseMp3File頻率: " + sampleRate);

下篇,將詳細講解mp3音頻的拓展使用。

參考于:
http://www.itdecent.cn/p/916813e847d3
http://www.itdecent.cn/p/e38178f008ab

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前言: 記載資料多為網絡搜集,侵刪。 根據(jù)最近接觸的整機項目做了一些整機音頻相關基礎知識的總結,如有不足或表述問題...
    Gawain_Knowknow閱讀 8,732評論 0 4
  • 前言 本篇開始講解在Android平臺上進行的音頻編輯開發(fā),首先需要對音頻相關概念有基礎的認識。所以本篇要講解以下...
    Ihesong閱讀 8,057評論 2 18
  • 概述 本片文章主要介紹音頻基礎,在做音頻開發(fā)之前首先必須要對音頻的相關概念了解。以下是具體內容概述: 常見的音頻格...
    iosmedia閱讀 2,972評論 0 1
  • 有陣子沒出文章,接下來爭取這段時間持續(xù)更新,將沉淀的東西記錄下來,廢話不多說剛接觸了音視頻方面,趁熱乎記錄一下,歡...
    vvengzt閱讀 5,629評論 0 20
  • 一、音頻編碼調制技術 根據(jù)編碼方式的不同,音頻編碼技術分為三種:波形編碼、參數(shù)編碼和混合編碼。一般來說,波形編碼的...
    konishi5202閱讀 1,186評論 2 6

友情鏈接更多精彩內容