入门启发:音视频的简单理解
算機技術領域中,『音視頻技術』應該說算是較復雜的小門類。較復雜的東西有個簡單的入門指引,或者有前輩帶路是很重要的。
前陣子,因為項目中急需音視頻技術,雖然網上資料看似很豐富,但對初學者來說,很多資料都是『硬入門』,一上來就擺弄一大堆具體的技術概念點(SPS,PPS,H264,HEAV…),讓初學者一直處于半懂不懂的摸索懷疑狀態。
更好的方式,假設稱為『軟入門』,應該是先簡單理解到音視頻的根本組成原理(即動畫原理),再把具體而龐雜的技術點往上拼建,讓新同學明白循序漸進,明白枝干的主次,對于他們未來的深入學習將是事半功倍的。
A、簡單理解,音視頻原理
很多人小時候,應該玩過個小游戲,在筆記本上連續幾頁繪制一只動物前后邁腳,然后快速翻頁,就有了如下圖 pic-0的效果。這個過程就蘊含著,(視頻)動畫原理。音視頻原理也是基于此。如再在翻頁的時候,你學一聲馬叫”嘶…..”。不用懷疑,這個聲音就是一段音頻中采樣的PCM了。至于為啥叫PCM,下面這幾張圖,結合幾句說明應該足夠解惑了。
圖. pic-0
音視頻的簡單原理,就是一段序列播放的圖片,再同步播放相應的序列音頻采樣片。如同 圖pic-0到pic-3中所揭示的,里面就包含三個關鍵元素。
- 1、YUV圖片:從H264、HEAV等編碼的二進制數據中,解碼出來的序列圖片叫YUV圖片,本質上跟常見的jpg、png一樣。因為視頻中的序列圖片實在太多了,考慮到效率和歷史原因等,視頻中解碼出來的圖片幀為YUV。顯卡的主要工作內容就是處理這些圖形數據。
- 2、PCM音頻:從mp3、aac等編碼的二進制數據中,解碼出來的序列音頻采樣點叫PCM音頻數據,可以理解每一片PCM音頻波形就是一個單位的聲音。了解PCM格式的信息可以見PCM百科。
- 3、音畫同步:將序列圖片幀連續渲染到計算機圖層,同時根據同步參數DTS、PTS來同步播放音頻幀,這就是視頻的播放過程了。請堅信,那些你未來接觸到的奇怪音視頻術語都是圍繞這個簡單過程的。
圖. pic-1
圖. pic-2
圖. pic-3(動畫能實現,基于兩點基礎,a、人眼和人腦的視覺緩存效應,b、計算機帶來的圖畫運算速度)
B、音視頻技術,常見的概念
音視頻技術中一些專業的概念,跟我們平時交流中用到的一些詞匯有一定區分。
- 1、視頻格式:我們經常看到的視頻格式mp4、avi、mkv。在技術概念中,叫『視頻封裝格式』,簡稱視頻格式,里面包含了封裝視頻文件所需要的視頻信息、音頻信息和相關的配置信息(比如:視頻和音頻的關聯信息、如何解碼等等)。
- 2、編解碼方式(視頻):視頻編解碼的過程是指對數字視頻進行壓縮或解壓縮的一個過程。常見的視頻編解碼方式有,H.26X(H.264,H.265等),MPEG等。這里需要留意到,不同的視頻封裝格式,其實里面使用的編解碼方式很多是可能一樣的,封裝格式是不同廠家的包裝。這就好比,多個雪糕廠家生產一個口味的雪糕,外面的包裝都是不一樣的。
- 3、編解碼方式(視頻):常用的音頻編解碼方式有 AAC、MP3、WMA等。
圖. pic-4
以下的概念就慢慢專業一些,可以逐步消化,用百科詞條等來輔助理解。
C、視頻解碼:實現“H.264->YUV”
視頻解碼的過程,就是將以某種編碼方式(H264)進行編碼的二進制數據,解碼成YUV圖片的過程,即“H.264->YUV”。 最廣泛使用的莫過于FFmpeg這個開源的編解碼套件,里面廣泛涵蓋了常見的編解碼方式,還有封裝格式(視頻格式)。
針對到常用的H264編碼方式,里面就涉及到一些具體的編碼技術。
-  1、一幀圖像、顏色模型:具體就涉及幀編碼,場編碼,RGB三原色顏色模型,YUV顏色模型,常用的有 YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4 這些YUV子分類顏色模型。 詳細的介紹參考針對性的資料,這里就只做入門簡述了。?《幀和場的概念》?《視頻幀的類型》 
-  2、H264碼流格式: 碼流里面就是裝載著編碼后的視頻數據的結構載體。其它編碼方式的碼流格式也是類似 圖pic-5的結構,里面就包括了一些編解碼的參數集等關鍵信息。 詳細的介紹可以了解。?《H.264碼流結構解析》?《IDR、CRA、BLA、RASL、RADL、Gop》 圖. pic-5(碼流格式,即碼流內數據組織方式) 
-  3、幀內預測和幀間預測:因為視頻的圖像序列很有連續性,所以為了最大可能提高編碼壓縮效率,就有了『幀內預測和幀間預測』這種技術思路。簡單來說幀內預測就是壓縮單幀的大小,幀間預測就是根據A幀來預測B幀的變化,從而壓縮了B幀。詳細資料再多可自己參考,《幀內預測和幀間預測的比較》 圖. pic-6(直觀看出哪類幀柱形圖比較高,幀預測關鍵標記在在動畫『變動』區域) 
-  4、流媒體協議:除了本地視頻的播放,我們經常用到的就是視頻的在線播放(點播、直播)。需要在線播放就需要使用到流媒體協議的支持,常見的流媒體協議有RTMP、HLS、Http-flv、RTSP等?!读髅襟w協議綜述》 
D、音頻解碼:實現“AAC->PCM”
音頻幀和視頻幀處理的工藝都是類似的,差異之處就是音頻采用的編碼方式為AAC、MP3等,處理出來的基礎單元為PCM(視頻的基礎單元YUV)。 需了解詳細的同學,可以從百度百科詞條『音頻編碼』開始。
圖. pic-7(上手過Adobe Audition之后就會更直觀明白音頻文件的大致構成了)
E、移動播放器繞不開的—–>ijkPlayer架構簡述
ijkPlayer播放器是一個包括iOS、Android兩個平臺的播放器,是Bilibili網址基于FFmpeg的簡易ffplay播放器來進行開發的。相比于更有名的VLC播放器,ijkPlayer更精簡,代碼量更小,更方便改造。
如果你是從事手機移動播放相關的工作,你會發現,當探索過VLC的龐雜模塊還有各類繁多的基于ffmpeg的小開源播放器之后,ijkPlayer可能還是繞不開的開源方案。
ijjPlayer播放流程跟ffplay使用ffmpeg播放流程一樣,區別就是ijkPlayer會根據具體的iOS、Android平臺來使用該平臺的硬解碼工具,效率要比ffmpeg的軟解碼高出很多。 其實ijkPlayer架構很精簡,可以從這些系列資料開始,然后閱讀它的代碼。?《ijkplayer系列(二) —— ijkplayer初始化流程》
圖. pic-8
F、直播化特性,來改造ijkPlayer播放器
如果播放器是移動類的直播需求,其實很多國內的云直播解決方案sdk,比如七牛云直播,金山云直播,都是基于ijkPlayer進行修改的,比如iOS可以通過obj-c runtime特性剖開封裝類中是不是含有IJKMediaPlayer這個類。2016年大熱起來各種視頻直播App,所以各種直播云服務也豐富了起來,這一類直播播放一般會比較重視的特性有,a、直播的秒開,b、避免花屏和弱網卡頓,c、直播的超低延遲以保證互動效率。撿有特點的來簡單說明一些。
- 1、直播秒開。一方面需要服務器做Gop緩存(為了客戶端能最快得到第一幀完整圖畫),一方面需要客戶端預置格式信息,避免avformat_find_stream_info等這類耗時函數,還有優先解碼出第一幀圖像進行渲染。
- 2、直播低延遲。服務器和客戶端同時優化多級緩存中的默認時長。
- 3、直播緊追(追蹤)。金山云稱之為直播追蹤,實際上『直播緊追』更能代表這個技術的目的。實現的過程是,將網絡累計等因素造成的過大緩沖快速播放掉,緊跟直播源時間戳,保證客戶端播放進度最大程度接近視頻真實發生的時間。
參考:
- a、《關于視頻的一些概念》
- b、(推薦!)《FFMPEG詳解》
- c、雷霄驊, 視音頻編解碼技術
- d、雷霄驊,《基于 FFmpeg + SDL 的視頻播放器的制作》課程的視頻
- e、《ijkplayer視頻播放器源碼分析》。等…
- f、原文在這里?
轉自:http://www.ruoxu.me/yin-shi-pin-qi-fa
總結
以上是生活随笔為你收集整理的入门启发:音视频的简单理解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: HttpDns 原理是什么
- 下一篇: 基于HLS流媒体协议的视频加密方案
