1. 程式人生 > >Android Multimedia框架總結(十七)音訊開發基礎知識

Android Multimedia框架總結(十七)音訊開發基礎知識

近年來,唱吧,全民K歌,QQ音樂,等成為音頻軟體的主流力量,音訊開發一直是多媒體開發中不可或缺的部分,如為什麼這個聲音這麼不清楚,為什麼耳機裡有電流聲,為什麼錄音時,有時會碰到奇怪的回聲,先看下今天的Agenda:

  • 音訊開發的主要應用

  • 音訊開發基礎概念

  • 音訊開發的具體內容

  • 常見的音訊編碼(壓縮)方式

  • 音訊演算法處理的開源庫

  • Android提供了哪些音訊開發相關的API

  • Android音訊開發

1音訊開發的主要應用
  • 音訊播放器 :(QQ音樂,網易雲音樂)

  • 錄音機 :(全民K歌)

  • 語音電話:(QQ電話,微信電話)

  • 音視訊監控應用:(攝像頭,錄音筆)

  • 音視訊直播應用:(午夜直播,心靈之聲電臺)

  • 音訊編輯/處理軟體:(ktv音效、變聲, 鈴聲轉換)

  • 藍芽耳機/音箱 :(耳機、KBOX)  等等。

2音訊開發基礎概念


(1)取樣率(samplerate)

是指錄音裝置在一秒鐘內對聲音訊號的取樣次數
取樣頻率越高聲音的還原就越真實越自然。單位用赫茲(Hz)

取樣定理: (奈奎斯特定理)
在進行模擬/數字訊號的轉換過程中,當取樣頻率fs.max大於訊號中最高頻率fmax的2倍時(fs.max>2fmax),取樣之後的數字訊號完整地保留了原始訊號中的資訊,一般實際應用中保證取樣頻率為訊號最高頻率的2.56~4倍;

人耳能聽到的聲波的頻率範圍通常?    20~20000Hz

為了保證聲音不失真,取樣頻率應在40kHz以上.
但是,常用的音訊取樣頻率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

例如:電話是標準的8khz取樣率!
話音訊號頻率在0.3~3.4kHz範圍內,用8kHz的抽樣頻率,就可獲得能取代原來連續話音訊號的抽樣訊號。
而一般CD採集取樣頻率為44.1kHz。
目前,一般情況下的錄音都是採用44100Hz的。

(2)量化精度(位寬)

就是把取樣得到的聲音訊號幅度轉換成數字值,
用於表示訊號強度。

量化精度:用多少個二進位來表示每一個取樣值,也稱為量化位數。
聲音訊號的量化位數一般是 4,6,8,12或16 bits 。

這個數值的資料型別大小可以是:4bit、8bit、16bit、32bit等等,位數越多,表示得就越精細,聲音質量自然就越好。
當然,資料量也會成倍增大。
 一般採用的是16bit。

(3)聲道數(channels)

由於音訊的採集和播放是可以疊加的.
因此,可以同時從多個音訊源採集聲音,並分別輸出到不同的揚聲器,故聲道數一般表示聲音錄製時的音源數量或回放時相應的揚聲器數量。
單聲道(Mono)和雙聲道(Stereo)比較常見,顧名思義,前者的聲道數為1,後者為2。

(4)音訊幀(frame)

音訊跟視訊很不一樣,視訊每一幀就是一張影象,而從上面的正弦波可以看出,音訊資料是流式的,本身沒有明確的一幀幀的概念。

在實際的應用中,為了音訊演算法處理/傳輸的方便,一般約定俗成取2.5ms~60ms為單位的資料量為一幀音訊。

這個時間被稱之為“取樣時間”,其長度沒有特別的標準,它是根據編解碼器和具體應用的需求來決定的,我們可以計算一下一幀音訊幀的大小:

AAC: 一個AAC幀對應的取樣點個數1024, 取樣率(samplerate)為 44100Hz
當前一幀的播放時間 = 1024 * 1000000/44100= 22.32ms(單位為ms)
mp3: 每幀均為1152個位元組
當前一幀的播放時間 = 1152* 1000000/44100= 26.122ms(單位為ms)

3音訊開發的具體內容
  • 音訊採集/播放

  • 音訊演算法處理(去噪、靜音檢測、回聲消除、音效處理、功放/增強、混音/分離,等等)

  • 音訊的編解碼和格式轉換

  • 音訊傳輸協議的開發(SIP,A2DP、AVRCP,等等)         

             SIP:會話初始協議(Session Initiation Protocol)是一種信令協議,用於初始、管理和終止網路中的語音和視訊會話
            A2DP全名是Advanced Audio Distribution Profile 藍芽音訊傳輸模型協定!A2DP是能夠採用耳機內的晶片來堆疊資料,達到聲音的高清晰度。
            AVRCP(Audio/Video Remote Control Profile),即音訊/視訊遠端控制規範。

4音訊開發的具體內容

什麼是音訊編碼?

是將音訊取樣資料(PCM等)壓縮成為音訊碼流,從而降低音訊的資料量。

為什麼要音訊編碼?

儲存一秒鐘取樣率為44.1KHz,位深為16bit,雙聲道的PCM編碼的音訊訊號,需要
44100*16bit*2 / 8/1024 = 172.2KB的空間,那麼1分鐘則約為10.09M。
這對大部分使用者是不可接受的。
只有2種方法,降低取樣指標或者壓縮。
降低取樣是不可取的,因此就有了各種各樣的壓縮方式。

有兩類主要的音訊檔案格式:

有損和無損。

有損檔案格式: 是基於聲學心理學的模型,除去人類很難或根本聽不到的聲音。
無損格式,例如PCM,WAV,ALS,ALAC,TAK,FLAC,APE,WavPack(WV)
有損格式,例如MP3,AAC,WMA,Ogg

根據取樣率和取樣大小可以得知,相對自然界的訊號,音訊編碼最多隻能做到無限接近,至少目前的技術只能這樣了,相對自然界的訊號,任何數字音訊編碼方案都是有損的,因為無法完全還原。在計算機應用中,能夠達到最高保真水平的就是PCM編碼,被廣泛用於素材儲存及音樂欣賞,CD、DVD以及我們常見的WAV檔案中均有應用。因此,PCM約定俗成了無損編碼,因為PCM代表了數字音訊中最佳的保真水準,並不意味著PCM就能夠確保訊號絕對保真,PCM也只能做到最大程度的無限接近。
我們而習慣性的把MP3列入有損音訊編碼範疇,是相對PCM編碼的
就像用數字去表達圓周率,不管精度多高,也只是無限接近,而不是真正等於圓周率的值。




5音訊演算法處理的開源庫


FFmpeg: Fast Forward  MPEG
Moving Picture Experts Group 先進視訊編碼標準


FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。
採用LGPL或GPL許可證。
它提供了錄製、轉換以及流化音視訊的完整解決方案。
它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量。

不僅可以採集視訊採集卡或USB攝像頭的影象,還可以進行螢幕錄製,同時還支援以RTP方式將視訊流傳送給支援RTSP的流媒體伺服器,支援直播應用。

FFmpeg在Linux平臺下開發,但它同樣也可以在其它作業系統環境中編譯執行,包括Windows、Mac OS X等。

FFmpeg組成元件


6Android中音訊開發相關的API
  • 音訊採集:  MediaRecoder,AudioRecord

  • 音訊播放:  SoundPool,MediaPlayer,AudioTrack 

  • 音訊編解碼: MediaCodec

  • NDK API:     OpenSL ES

7Android音訊的開發

播放流程: 獲取流–>解碼–>播放

錄製播放路程: 錄製音訊視訊–>剪輯–>編碼–>上傳伺服器 別人播放.

直播過程 : 錄製音視訊–>編碼–>流媒體傳輸–>伺服器—>流媒體傳輸到其他app–>解碼–>播放

幾個重要的環節

  • 錄製音訊 AudioRecord

  • 視訊剪輯 ffmpeg

  • 音訊編碼 aac

  • 上傳流檔案 網路框架,進度監聽,斷點續傳

  • 流媒體傳輸 流媒體傳輸協議rtmp rtsp hls

  • 音訊解碼 aac

  • 渲染播放 MediaPlayer

第一時間獲得部落格更新提醒,以及更多**android乾貨,原始碼分析**,歡迎關注我的微信公眾號,掃一掃下方二維碼或者長按識別二維碼,即可關注。
如果你覺得好,隨手點贊,也是對筆者的肯定,也可以分享此公眾號給你更多的人,原創不易

相關推薦

Android Multimedia框架總結音訊開發基礎知識

近年來,唱吧,全民K歌,QQ音樂,等成為音頻軟體的主流力量,音訊開發一直是多媒體開發中不可或缺的部分,如為什麼這個聲音這麼不清楚,為什麼耳機裡有電流聲,為什麼錄音時,有時會碰到奇怪的回聲,先看下今天的A

Android Multimedia框架總結CodeC部分之OMXCodec與OMX事件回撥流程

前言:上篇文中分析到AwesomePlayer到OMX服務,曾介紹到,OMX服務主要完成三個任務: NodeInstance列表的管理,NodeInstance的操作, 事件的處理。最後這個事件處理就是今天放大看的內容。要一步一步一Codec,事件傳遞必不可

Android Multimedia框架總結Camera2框架之openCamera及session過程

前言:前一篇介紹了Camera2相關類作用及功能,並未對原始碼部分了解,今天瞭解了在Camera2框架中openCamera及session過程,Agenda如下: CameraManager的openCamera方法 openCameraDeviceU

Android Multimedia框架總結CodeC部分之AwesomePlayer到OMX服務

前言:上篇文《Android Multimedia框架總結(十)》總結了音視訊的輸出過程,從今天開始分析Codec部分,今天分析的是AwesomePlayer到OMX服務過程,也就是開啟OpenMax準備相關。 先看下今天的Agenda: 一張圖看清O

Android Multimedia框架總結C++中MediaPlayer的C/S架構補充及MediaService介紹

前面一篇主要介紹c++中MediaPlayer的C/S架構中和Client相關部分,並中間穿插了mediaplayerservice的部分。但是對於這塊C/S部分,沒有放大去分析。《Android Multimedia框架總結(四)MediaPlayer中從

Android Multimedia框架總結MediaPlayer框架及播放網路視訊案例

前言:前面我們介紹MediaPlayer相關方法,有人說,沒有實際例子,看得不是很明白,今天在分析MediaPlayer時,順帶一個播放網路視訊例子。可以自行試試。同樣先看下今天的Agenda: Android中的MediaPlayer框架MediaPlayer播放視訊

Android Multimedia框架總結Stagefright框架之AwesomePlayer及資料解析器

前言:前面一篇分析了mediaplayerservice及MediaPlayer中的CS模型,但是對於如何能把資料解析出來,渲染到最終的SurfaceView上顯示,並且播放起來,我們依然還不得而知,從今天開始,就開始介紹多媒體框架中資料解析->解碼-

lucene總結——

文件的 程序 分詞 analyzer 搜索 ocs 硬盤 row top (01)rownum和rowid有何區別? rownum在表結構中是看不見的,只能在select中明確寫出rownum方可顯示 rownum與不同的表綁定在一起,每張表都有自已的r

Linux學習總結-shell 基礎知識

shell基礎 變量 特殊符號 該篇內容很雜,但還是不難理解,就不逐個貼圖舉例。 一 先介紹幾種常用字符: 1 * 匹配任意個任意字符2 ?匹配一個任意字符3 # 註釋符號,符號後的語句不被執行4 \脫意字符,後面跟帶含義字符時,照原字符輸出5 []匹配包含在[]之中的任意一個字符:例如[bc]

Java學習總結——MySQL數據庫3存儲過程,觸發器,數據庫權限,數據庫設計三大範式

MySQL數據庫 存儲過程 觸發器 MySQL數據庫權限 數據庫設計三大範式 一.MySQL存儲過程1.概念:帶有邏輯的sql語句,之前的sql語句中沒有條件判斷,沒有循環,存儲過程中帶上流程控制語句。 2.特點:(1)執行效率非常快,存儲過程是在 數據庫的服務端執行的;(2)移植性很差,

java基礎學習總結:Java Socket

一、 什麼是Socket          Socket的概念很簡單,它是網路上執行的兩個程式間雙向通訊的一端,既可以接收請求,也可以傳送請求,利用它可以較為方便地編寫網路上資料的傳遞。 所以簡而言之,Socket就是程序通訊的端點

作業系統知識點總結檔案系統知識點總結

磁碟結構 引導控制塊(Boot Control Block)包括系統從該分割槽引導作業系統所需要的資訊。如果 磁碟沒有作業系統,那麼這塊的內容為空。它通常為分割槽的第一塊。UFS稱之為引導塊(Boot Block); NTFS 稱之為分割槽引導扇區(Partition B

黑馬程式設計師 總結——I/O流

------- android培訓、java培訓、期待與您交流! ---------- I/O流 程式在執行時通常要和外部進行互動,從外部讀取資料或向外部裝置傳送資料,這就是所謂的I/O。Java使用抽象概念——流(stream)來描述程式與資料傳送或者接收的通道。I/O流

ROS探索總結——構建完整的機器人應用系統

       當然,該系統對多機器人的支援也是很好的,由於時間有限,我們只做了一個簡單的機器人跟隨實驗。該實驗使用了兩個機器人,除HRMRP機器人之外,還使用樹莓派製作了一個簡單的小型機器人。在實驗中,HRMRP機器人在地圖上自主導航前進,伺服器負責應用的處理與顯示,同時將HRMRP的位置資訊轉發給樹莓派機器

使用O2OA二次開發搭建企業辦公平臺資訊開發篇:資訊釋出的審批功能

本部落格為O2OA系列教程、O2OA使用手冊,教程目錄和各章節天梯將在連載完後更新。 使用O2OA二次開發搭建企業辦公平臺(一)平臺部署篇:平臺下載和部署 使用O2OA二次開發搭建企業辦公平臺(二)平臺部署篇:埠衝突和伺服器埠配置 使用O2OA二次開發搭建企業辦公平臺(三)平臺部署篇:使用外部資料庫

Android開發系列:讀取assets文件夾下的數據庫文件

pack 取數 code ada tracking 編寫 數據庫 sdn where 在做Android應用的時候,不可避免要用到數據庫。可是當我們把應用的apk部署到真機上的時候,已經創建好的數據庫及其裏邊的數據是不能隨著apk一起安裝到真機上的。 (PS:這篇

Hadoop學習之路MapReduce框架Partitoner分區

div get() 劃分 mapreduce ride 作用 程序 輸出 lin Partitioner分區類的作用是什麽? 在進行MapReduce計算時,有時候需要把最終的輸出數據分到不同的文件中,比如按照省份劃分的話,需要把同一省份的數據放到一個文件中;按照性別劃分

Spring MVC 學習總結——IDEA+Maven+多模組實現SSM框架整合

一、SSM概要 與SSH(Struts/Spring/Hibernate/)一樣,Spring+SpringMVC+MyBatis也有一個簡稱SSM,Spring實現業務物件管理,Spring MVC負責請求的轉發和檢視管理, MyBatis作為資料物件持久化引擎。這樣搭配的優點是:輕量、自由度高、Spri

python學習之網站的編寫HTML,CSS,JS----------示例,構造一個網頁的框架,上部標題,登入,logo,左側選單,右側內容,原始碼

結果: 顏色為了明顯,所以較為難看,可以根據自己的需要進行更改 原始碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title

Android問題集錦- Error running 'app': Please select Android SDK

在AS中執行專案,提示報錯如下: Error running 'app': Please select Android SDK 其實這個問題之前遇到一次,也解決了,解決方案如下: 開啟Android Studio報錯“Error running ***: Please sel