本文梳理了音視頻編程開發者須要瞭解的基本概念
訪問 個人博客瞭解更多
本文梳理了音視頻編程開發者須要瞭解的基本概念,固然,有的人一開始看着乾巴巴的理論,感到睏乏,倒是一個喜歡動手實踐的開發者,那麼先實踐 ffmpeg的C語言編程入門,而後再來看理論篇更好了。算法
音頻技術是爲了採樣、存儲、播放"聲學現象"而存在的,詳細一點,是模擬信號與數字信號轉換;在人耳可聽的時域與頻域的範圍內,進行壓縮、轉碼,在數據大小與音質的取捨中存儲音頻文件;播放時解讀文件的音頻參數,進行轉碼。編程
聲音是有物體振動而產生的,是一種壓力波。網絡
聲音的振動會引發空氣有節奏的振動,是周圍的空氣發生疏密變化,造成疏密相間的縱波
經過上一句話,容易理解聲波三要素:工具
回聲的區分:兩道聲音傳入人耳的時差小於 80 毫秒,人耳便沒法區分這兩道聲音。性能
人耳可接收的頻率範圍:20Hz~20kHz測試
數字音頻的三個要素: 採樣、量化、編碼優化
音頻文件的原始格式,PCM, WAV編碼
PCM + WAV header (44 bit) = WAVspa
PCM 全稱 Pulse Code Modulation,脈衝編碼調製,是音頻的裸數據,PCM 文件缺乏描述參數,通常須要 WAV header 來描述,如:量化格式(sampleFormat)、採樣率(sampleRate)、聲道數(channel)。設計
描述音頻文件的大小、質量
計算比特率的公式: 採樣率 × 採樣格式 × 聲道數 = 比特率
聲音的大小單位——分貝
什麼是分貝,爲何使用分貝做單位?
若以聲壓值來表示聲音大小,變化範圍太大,能夠達到六個數量級以上,另外,人耳對聲音信號的強弱刺激的反應不是線性的,而是呈對數比例關係,因而採用分貝的概念:
分貝是指兩個物理量之比除以 10 爲底的對數並乘以 10,中文描述有點繞,看簡潔的公式
N = 10 * lg(A1/A0)
分貝符號:dB, 它是無量綱的,式中 A0 是基準量,A1是"被量度"量
CD 音質的格式是 WAV,完整地存儲採樣數據。可是存儲空間較大,計算一下,CD的音質參數:量化格式16 bit,採樣率 44100,聲道數 2,計算一秒的比特數:
44100 16 2 = 1378.125 kbps (千比特每秒) = 176400 字節每秒
一分鐘的 CD 音質的存儲空間約爲 10.09 MB。存儲空間太大,不適合在 4G 如下的網絡中在線播放音頻。
在實際應用中,須要對數據進行壓縮,有效的壓縮方法是從兩個維度上進行壓縮,分別是頻域與時域。
提供給人類播放的音頻,只需保存人耳聽覺範圍內的信號,因而音頻壓縮編碼的原理其實是壓縮掉冗餘信號,冗餘信號包括人耳聽覺範圍以外的音頻信號以及被掩蔽掉的音頻信號等,被掩蔽掉的音頻信號主要是由於人耳的掩蔽效應,主要表現爲頻域掩蔽效應與時域掩蔽效應,不管是時域上仍是頻域上,被掩蔽掉的聲音信號都被認爲是冗餘信息,不進行編碼處理。
介紹常見的音頻格式:
常見兩種表示方式爲: RGB, YUV
RGB的概念,不少人都瞭解,三種原色來描述一個像素點,還有 RGBA 格式,A 是透明度。
像素的取值範圍有幾種:
一張圖片的裸數據是 bitmap,內存很大,也浪費空間,因而有壓縮算法:
JPEG 是靜態圖像壓縮標準,有良好的壓縮性能,然而,對於視頻來講還不夠,視頻還須要在時域上進行壓縮,後面講到。
若是你未理解過 YUV 概念,來看這一張熟悉的圖片:
90年代彩色電視或黑白電視,測試畫面使用的圖片,圖片的色塊直接地反映了 YUV 的色彩空間,再來看下一張端口圖:
以上端口中,老式的黑白電視使用 Y C 端口,彩色電視採用 YUV 端口,之前在家接過電視盒、DVD端口的童鞋是否是很熟悉。其中 Y 表明明亮度/灰階值 (Luma);U 和 V 表明色度(chroma),指定像素的顏色。
歸納而言,YUV 主要應用於優化彩色視頻信號的傳輸,使其向後兼容老式黑白電視。
與直觀的 RGB 不一樣,YUV 的表示方式是差分的:
看下一張圖片反映 YUV 與 RGB 的差別
YUV 最多見的採樣格式是 4:2:0,其中 0 不表明其中一個輸入爲0,而是交錯的 4:2:0 與 4:0:2,左右兩列的色度是共享的,以下圖片
不考慮時域壓縮,YUV的一幀圖片比RGB的一幀圖片的比特量化要大,好比 RGB 用 8 bit 表示一個像素,YUV 須要用 12 bit 表示一個像素。
瞭解 YUV 的概念,對於音視頻編程中的客戶端開發,是必要的。在IOS或安卓,攝像頭採集到的裸數據格式是 YUV,而後須要調用相關API使其轉換成 RGB 格式,詳細暫且打住。
音視頻的編碼一般是去除冗餘信息,從而實現數據量的壓縮。對於視頻,能夠從空間與時間維度上進行壓縮,並且,視頻數據有極強的相關性,有着大量的冗餘信息。
從時間維度上去除冗餘信息的方法:
從空間維度上,運用幀內編碼技術,例如,靜態圖像編碼標準 JPEG,在視頻上,ISO 制定了 Motion JPEG,即 MPEG,MPEG算法是適用於動態視頻的壓縮算法,除了對單幅圖像進行編碼外,還利用圖像序列中相關原則去除冗餘,大大提升壓縮比。MPEG版本一直在不斷更新,如:Mpeg1(用於VCD),Mpeg2(用於DVD),Mpeg4 AVC(流媒體的主力算法)
獨立於 ISO 制定的 MPEG 視頻壓縮標準,ITU-T制定了 H.261~H.264一系列視頻標準,其中 H.264吸收了衆多標準的經驗,採起簡約設計,比起 Mpeg4更容易推廣。
H.264使用了新的壓縮技術,例如:多參考幀,多塊類型,整數變換,幀內預測等,使用了更精細的分像素運動矢量(1/4,1/8)和新一代的環路濾波器。
IPB 幀,是最多見的幀間編碼技術類型,在GOP(Group Of Pictures)中有如下三種幀:
gop_size,表明兩個 I 幀之間的幀數目。理論上,在存儲空間固定的條件下,gop_size越大,畫面質量越好,由於能夠留下更多的空間存儲畫質更高的 I 幀。
壓縮比,通常而言,I幀的壓縮率是 7 (與 JPG 差很少),P幀是20,B幀是50
PTS 與 DTS
通常來講,若是視頻的各幀編碼是按輸入順序依次進行的,那麼解碼時間與顯示時間應該一致,然而事實上,大多數編解碼標準(如H.264),編碼順序與顯示順序並不一致,因而須要 PTS 與 DTS 兩種時間戳。
Tip: 在 FFmpeg 工具中,AVPacket結構體是描述解碼前或編碼後的壓縮數據,AVFrame是描述視頻的一幀圖像,而 DTS 是 AVPacket 結構體的一個成員屬性,PTS 是 AVFrame 的一個成員屬性。另外,FFmpeg 中還有一個屬性,基準時間 time_base ,即每 1 pts 的時間間隔,單位秒
本文的文字摘抄於《音視頻開發進階指南》,便是我閱讀後將知識內化的再輸出
圖片均來自互聯網