Android音視頻開發(一)學習規劃

序言

公司的項目有涉及到音視頻的開發,但都是已經開發完的,想去看懂代碼,但卻無從下手,因爲自己對音視頻只有一個模糊的概念,所以從這個文章開始,從零入門,要把音視頻弄懂,然後自己寫一個demo。

學習規劃

目前的確沒有比較系統的教程或者書籍,網上的博客文章也都是比較零散的,查找了很多資料,制定了一個學習路線。(Android音視頻開發的學習系列文章主要是參考了Jhuster前輩的博客)
在這裏插入圖片描述

音視頻內容

核心:
音視頻技術=封裝技術+視頻壓縮編碼技術+音頻壓縮編碼技術+流媒體協議技術

播放流程: 獲取流–>解碼–>播放
錄製播放流程: 錄製音頻視頻–>剪輯–>編碼–>上傳服務器
直播流程: 錄製音視頻–>編碼–>流媒體傳輸–>服務器—>流媒體傳輸到其他app–>解碼–>播放

幾個重要的環節:
錄製音視頻 AudioRecord/MediaRecord
音視頻編輯 mp4parser或ffmpeg
音視頻編碼 aac&h264
上傳大文件 網絡框架,進度監聽,斷點續傳
流媒體傳輸 流媒體傳輸協議rtmp rtsp hls
音視頻解碼 aac&h264(MPEG-4Part10,h264的功能分爲兩層:視頻編解碼層(VCL)和網絡提取層(NAL))
渲染播放 MediaPlayer
視頻編輯可行性開源方案
ffmpeg(功能強大,包含libavcodec(音視頻解碼庫)和libavformat(音視頻格式轉換庫))
MediaCodec (android自帶)
ijkplayer (bilibili開源的)
mp4parser (軟解軟編音視頻混合)
Vitamio

具體實現
在這裏插入圖片描述
採集

採集,在音視頻開發中主要針對的是數據從哪裏來的問題。圖像、視頻的可視化數據來自攝像頭這毫無疑問,而音頻數據則是來自麥克風,關於採集的知識點涉及到如下內容:

系統的攝像頭採集接口是什麼,怎麼用 ?
如:Windows:DirectShow,Linux:V4L2,Android:Camera

系統的攝像頭採集的參數怎麼配置,都是什麼含義 ?
如:分辨率、幀率、預覽方向、對焦、閃光燈 等

系統的攝像頭輸出的圖像/視頻數據,是什麼格式,不同格式有什麼區別 ?
如:圖片:JPEG,視頻數據:NV21,NV12,I420 等

系統的麥克風採集接口是什麼,怎麼用 ?
如:Windows:DirectShow,Linux:ALSA & OSS,Android:AudioRecord,iOS:Audio Unit 等

系統的麥克風採集參數怎麼配置,都是什麼含義 ?
如:採樣率,通道號,位寬 等

系統的麥克風輸出的音頻數據,是什麼格式?
如:PCM

渲染:

渲染,在音視頻開發中主要針對的是數據展現的問題。我們知道,圖像、視頻最終都是要繪製到視圖(View層)上面,而音頻最終都是要輸出到揚聲器,因此,做音視頻渲染,就要掌握如下的技術知識:

系統提供了哪些 API 可以繪製一張圖片或者一幀 YUV 圖像數據的 ?
如:
Windows:DirectDraw, Direct3D, GDI,OpenGL 等
Linux: GDI, OpenGL 等
Android:ImageView,SurfaceView,TextureView,OpenGL 等
系統提供了哪些 API 可以播放一個 mp3 或者 pcm 數據 ?
如:
Windows:DirectSound 等
Linux:ALSA & OSS 等
Android:AudioTrack 等

處理:
在這裏插入圖片描述

針對圖像和音視頻的處理,實現方式除了使用系統的 API,大多數也會使用一些優秀的第三方庫,通過掌握這些第三方庫的原理和使用方法,基本上就可以滿足日常音視頻處理工作了,這些庫包括但不限於:
圖像處理:OpenGL,OpenCV,libyuv,ffmpeg 等
視頻編解碼:x264,OpenH264,ffmpeg 等
音頻處理:speexdsp,ffmpeg 等
音頻編解碼:libfaac,opus,speex,ffmpeg 等

傳輸:

傳輸,在音視頻開發中主要針對的是數據共享的問題,採集完並處理數據以後,我們如何快速傳輸數據這一難題又擺在了面前,試想如果一個以音視頻爲主導業務的APP如果在播放過程中非常卡頓的話,用戶體驗那會是非常糟糕的。因此,解決傳輸的問題也就擺在了我們的面前。那麼,數據究竟如何實現傳輸共享呢 ?共享,實現細則最重要的一點,就是協議,因此需要具體掌握的協議如下:

打包,音視頻在傳輸前怎麼打包,如:FLV,ts,mpeg4 等
直播推流,有哪些常見的協議,如:RTMP,RTSP 等
直播拉流,有哪些常見的協議,如:RTMP,HLS,HDL,RTSP 等
基於 UDP 的協議有哪些?如:RTP/RTCP,QUIC 等

補充
編碼格式
H.264:低碼率,高質量,高容錯
開源實現:openh264、x264

H.265:能達到H.264兩倍之壓縮率,可支持4k分辨率,最高到8k。
開源實現:libde265、x265、vp9

對比:
H.265對H.264在碼率節省上有較大的優勢,在相同RSNR下分別節省了48.3%和75.8%。
H.264在編碼時間上有聚到優勢,對比VP9和H.265,H.265是vp9的6倍,vp9是H.264的將近40倍。

推送協議
1.RTMP
Real Time Messaging Protocol(實時消息傳輸協議),基於 TCP,設計用來進行實時數據通信。
RTMP是目前主流的流媒體傳輸協議,廣泛用於直播領域,市面上絕大多數直播產品都採用了這個協議。

2.HLS
http live streaming是由Apple公司定義的基於http的流媒體實時傳輸協議,可實現流媒體的直播和點播,主要用於ios系統。
原理是將整個流分爲多個小的文件來下載,每次只下載 個。客戶端只要不停的按順序播放從服務器獲取到的 件,就實現了直播。
分段推送的特點,決定了HLS的延遲一般會高於普通的流媒體直播協議。

3.WebRTC
web real time communication(網頁即時通信),是一個支持網頁瀏覽器進行實時語音或者視頻對話的API。

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