互聯(lián)網(wǎng)信息的傳播與娛樂方式經(jīng)歷了從文字到圖片再到音視頻的轉(zhuǎn)變拥知,現(xiàn)如今抖音践惑、快手等短視頻更是如日中天待错,特別是5G時(shí)代的到來拗踢,筆者相信互聯(lián)網(wǎng)對(duì)音視頻開發(fā)者的需求會(huì)迎來更大的增長需求岩臣,何況音視頻開發(fā)者因?yàn)槠湎∪毙孕匠瓯緛砭捅容^高溜嗜。
在學(xué)習(xí)音視頻開發(fā)之前,我們先來了解一下音視頻的基本知識(shí)架谎。
視頻文件播放流程圖:
[站外圖片上傳中...(image-73a772-1582641280682)]
音頻
聲波的三要素:頻率炸宵、振幅和波形。頻率代表音階的高低谷扣,振幅代表響度土全,波形代表音色。
頻率越高,波長就越短裹匙。低頻聲響的波長則較長瑞凑,所以其可以更容易地繞過障礙物,因此能量衰減就小概页,聲音就會(huì)傳得遠(yuǎn)籽御。人的聽力有一個(gè)頻率范圍,大約是20Hz~20kHz惰匙。
音頻數(shù)據(jù)的承載方式最常用的是脈沖編碼調(diào)制篱蝇,即PCM。
數(shù)字信號(hào)
在自然界中徽曲,聲音是連續(xù)不斷的零截,是一種模擬信號(hào),那怎樣才能把聲音保存下來呢秃臣?那就是把聲音數(shù)字化涧衙,即轉(zhuǎn)換為數(shù)字信號(hào)。
將模擬信號(hào)數(shù)字化奥此,要經(jīng)過采樣弧哎、量化和編碼三個(gè)步驟。
音頻數(shù)字化有一個(gè)問題:數(shù)字信號(hào)并不能連續(xù)保存所有時(shí)間點(diǎn)的振幅稚虎。
實(shí)際上撤嫩,音頻數(shù)字化并不需要保存連續(xù)的信號(hào),就可以還原到人耳可接受的聲音蠢终。
采樣率
每一秒鐘所采樣的數(shù)目稱為采樣頻率或采率序攘,單位為HZ(赫茲)。采樣頻率越高所能描述的聲波頻率就越高寻拂。
根據(jù)奈奎斯特定理程奠,按比聲音最高頻率高2倍以上的頻率對(duì)聲音進(jìn)行采樣,經(jīng)過數(shù)字化處理之后祭钉,人耳聽到的聲音質(zhì)量不會(huì)被降低瞄沙。所以采樣頻率一般為44.1kHz。
- 8khz:電話等使用慌核,對(duì)于記錄人聲已經(jīng)足夠使用距境。
- 22.05khz:廣播使用頻率。
- 44.1khz:音頻CD垮卓。
- 48khz:DVD垫桂、數(shù)字電視中使用。
- 96khz-192khz:DVD-Audio扒接、藍(lán)光高清等使用伪货。
量化格式
量化格式也叫采樣大小或采樣精度们衙,指的是一個(gè)采樣使用多少bit存放,一般是16bit碱呼,一個(gè)字節(jié)是8bit蒙挑。
編解碼
描述一段PCM數(shù)據(jù)一般需要以下幾個(gè)概念:量化格式(sampleFormat)、采樣率(sampleRate)愚臀、聲道數(shù)(channel)忆蚀。
量化格式和采樣率上面提到過了,聲道數(shù)是指支持能不同發(fā)聲的音響的個(gè)數(shù)姑裂。不難理解馋袜,立體聲道的聲道數(shù)默認(rèn)為2個(gè)聲道。
數(shù)據(jù)比特率舶斧,即1秒時(shí)間內(nèi)的比特?cái)?shù)目欣鳖。
以CD的音質(zhì)為例,量化格式(位深度)為16比特茴厉,樣率為44100泽台,聲道數(shù)為2。
比特率:
比特率 = 采樣率 × 采樣深度 × 通道數(shù)
44100 * 16 * 2 = 1378.123kbps 注意這里的k表示1024一分鐘音頻數(shù)據(jù)的大蟹骸: 1378.125 * 60 / 8 / 1024 = 10.09MB
注意:1個(gè)字節(jié)等于8位怀酷,也就是8比特
這不對(duì)啊,我們平時(shí)聽的陰影四五分鐘也才四五兆嗜闻,到了你這里怎么一秒鐘就十多兆了呢蜕依?這就是編碼的功勞了。
我們先來看看比特率中的數(shù)字和字母到底是什么意思琉雳?
首先128k的全稱“128kbps”样眠,我們分解一下:128是數(shù)字,k是千位符咐吼,b是單位吹缔,s是秒,ps其實(shí)就是“/s”锯茄。這樣來看,128kbps就是128kb/s茶没。也就是每秒128kb肌幽。請(qǐng)注意,這里的b是小寫的b抓半,也就是位喂急。
知道了這個(gè),我們就能算出來128kb的文件大概占用多少的存儲(chǔ)空間:
128*1000=128000b/s÷8=16000B/s÷1024=15.625KB/s
15.625KB/s*60=937.5KB/分鐘÷1024=0.9155MB/分鐘
所以笛求,128kb的音頻文件廊移,大概每分鐘長度的大小都在0.92M或者916kb左右糕簿。注意b和B是不同的概念
編碼就是一個(gè)壓縮的過程,而壓縮又分為有損壓縮和無損壓縮:
有損壓縮就是去掉冗余信號(hào)狡孔,冗余信號(hào)是指不能被人耳感知到的信號(hào)懂诗,包含人耳聽覺范圍之外的音頻信號(hào)以及被掩蔽掉的音頻信號(hào)等
無損壓縮就是通過優(yōu)化排列方式來達(dá)到壓縮目的。
常見的音頻編碼格式:
- WAV(無損)
WAV編碼就是在PCM數(shù)據(jù)格式的前面加上44字節(jié)苗膝,分別用來描述PCM的采樣率殃恒、聲道數(shù)、數(shù)據(jù)格式等信息辱揭。
特點(diǎn):音質(zhì)非常好离唐,大量軟件都支持。
缺點(diǎn):因?yàn)闆]用經(jīng)過壓縮问窃,所以文件占用的儲(chǔ)存空間會(huì)特別大亥鬓。
適用場合:多媒體開發(fā)的中間文件、保存音樂和音效素材域庇。
- MP3(有損)
MP3具有不錯(cuò)的壓縮比贮竟,使用LAME編碼(MP3編碼格式的一種實(shí)現(xiàn))的中高碼率的MP3文件,聽感上非常接近源WAV文件〗咸辏現(xiàn)如今市面上的音樂大多是這種編碼格式咕别。
特點(diǎn):音質(zhì)在128Kbit/s以上表現(xiàn)還不錯(cuò),壓縮比比較高写穴,大量軟件和硬件都支持惰拱,兼容性好。
缺點(diǎn):由于技術(shù)比較落后啊送,同樣碼率下音質(zhì)會(huì)比AAC偿短、OGG差一些。
- AAC(有損)
AAC是新一代的音頻有損壓縮技術(shù)馋没,它通過一些附加的編碼技術(shù)(比如PS昔逗、SBR等),衍生出了LC-AAC篷朵、HE-AAC勾怒、HE-AAC v2三種主要的編碼格式。
LC-AAC是比較傳統(tǒng)的AAC声旺,相對(duì)而言笔链,其主要應(yīng)用于中高碼率場景的編碼(≥80Kbit/s);
HE-AAC(相當(dāng)于AAC+SBR)主要應(yīng)用于中低碼率場景的編碼(≤80Kbit/s)腮猖;
而新近推出的HE-AAC v2(相當(dāng)于AAC+SBR+PS)主要應(yīng)用于低碼率場景的編碼(≤48Kbit/s)鉴扫。事實(shí)上大部分編碼器都設(shè)置為≤48Kbit/s自動(dòng)啟用PS技術(shù),而>48Kbit/s則不加PS澈缺,相當(dāng)于普通的HE-AAC坪创。
特點(diǎn):在小于128Kbit/s的碼率下表現(xiàn)優(yōu)異炕婶,并且多用于視頻中的音頻編碼。
不足:雖然在低碼率上表現(xiàn)比MP3好一些莱预,但是還沒有達(dá)到全面碾壓的地步柠掂。
適用場合:128Kbit/s以下的音頻編碼,多用于視頻中音頻軌的編碼锁施。
AAC格式主要分為兩種:ADIF陪踩、ADTS。
ADIF:Audio Data Interchange Format悉抵。 音頻數(shù)據(jù)交換格式肩狂。這種格式的特征是可以確定的找到這個(gè)音頻數(shù)據(jù)的開始,不能在音頻數(shù)據(jù)流中間開始的解碼姥饰,即它的解碼必須在明確定義的開始處進(jìn)行傻谁。這種格式常用在磁盤文件中。
ADTS:Audio Data Transport Stream列粪。 音頻數(shù)據(jù)傳輸流审磁。這種格式的特征是它是一個(gè)有同步字的比特流,解碼可以在這個(gè)流中任何位置開始岂座。它的特征類似于mp3數(shù)據(jù)流格式态蒂。
ADTS可以在任意幀解碼,它每一幀都有頭信息费什。ADIF只有一個(gè)統(tǒng)一的頭钾恢,所以必須得到所有的數(shù)據(jù)后解碼。且這兩種的header的格式也是不同的鸳址,目前一般編碼后的都是ADTS格式的音頻流瘩蚪。
- Ogg(有損)
Ogg是一種非常有潛力的編碼,在各種碼率下都有比較優(yōu)秀的表現(xiàn)稿黍,尤其是在中低碼率場景下疹瘦。Ogg除了音質(zhì)好之外,還是完全免費(fèi)的巡球,這為Ogg獲得更多的支持打好了基礎(chǔ)言沐。Ogg有著非常出色的算法,可以用更小的碼率達(dá)到更好的音質(zhì)辕漂,128Kbit/s的Ogg比192Kbit/s甚至更高碼率的MP3還要出色呢灶。但目前因?yàn)檫€沒有媒體服務(wù)軟件的支持,因此基于Ogg的數(shù)字廣播還無法實(shí)現(xiàn)钉嘹。Ogg目前受支持的情況還不夠好,無論是軟件上的還是硬件上的支持鲸阻,都無法和MP3相提并論跋涣。
特點(diǎn):可以用比MP3更小的碼率實(shí)現(xiàn)比MP3更好的音質(zhì)缨睡,高中低碼率下均有良好的表現(xiàn)。
缺點(diǎn):兼容性不夠好陈辱,流媒體特性不支持奖年。
適用場合:語音聊天的音頻消息場景。
- FLAC(無損)
FLAC是一套著名的自由音頻壓縮編碼沛贪,其特點(diǎn)是無損壓縮陋守。不同于其他有損壓縮編碼如MP3 及AAC,它不會(huì)破壞任何原有的音頻資訊利赋,所以可以還原音樂光盤音質(zhì)水评。2012年以來它已被很多軟件及硬件音頻產(chǎn)品(如CD等)所支持.
FLAC與MP3不同,MP3是音頻壓縮編碼媚送,但FLAC是無損壓縮中燥,也就是說音頻以FLAC編碼壓縮后不會(huì)丟失任何信息,將FLAC文件還原為WAV文件后塘偎,與壓縮前的WAV文件內(nèi)容相同疗涉。這種壓縮與ZIP的方式類似,但FLAC的壓縮比率大于ZIP和RAR吟秩,因?yàn)镕LAC是專門針對(duì)PCM音頻的特點(diǎn)設(shè)計(jì)的壓縮方式咱扣。而且可以使用播放器直接播放FLAC壓縮的文件,就象通常播放你的MP3文件一樣.
視頻
所謂視頻其實(shí)就是由很多的靜態(tài)圖片組成的涵防。由于人類眼睛的特殊結(jié)構(gòu)闹伪,畫面快速切換時(shí),畫面會(huì)有殘留武学,所以靜態(tài)圖片快速切換的時(shí)候感覺起來就是連貫的動(dòng)作祭往。這就是視頻的原理。
視頻幀:
既然視頻是由許多靜態(tài)圖片組成的火窒,那么視頻的每一張靜態(tài)圖片就叫一幀硼补。
視頻幀又分為I幀、B幀和P幀:
I幀:幀內(nèi)編碼幀熏矿,大多數(shù)情況下I幀就是關(guān)鍵幀已骇,就是一個(gè)完整幀,無需任何輔助就能獨(dú)立完整顯示的畫面票编。
B幀:幀是雙向預(yù)測(cè)幀褪储。參考前后圖像幀編碼生成。需要前面的 I/P 幀或者后面的 P 幀來協(xié)助形成一個(gè)畫面慧域。
P幀:前向預(yù)測(cè)編碼幀鲤竹。是一個(gè)非完整幀,通過參考前面的I幀或P幀生成畫面昔榴。
所以 I 幀是很關(guān)鍵的存在辛藻,壓縮 I 幀就可以很容易壓制掉空間的大小碘橘,而壓縮P幀和B幀可以壓縮掉時(shí)間上的冗余信息 。所以在視頻 seek 的時(shí)候吱肌,I 幀很關(guān)鍵痘拆,如果視頻 seek 之后發(fā)生往前的跳動(dòng),有可能就是你要seek到的位置沒用關(guān)鍵幀氮墨,這就需要處理了纺蛆。好像Android自帶的播放器就會(huì)有這個(gè)問題,有時(shí)候無法精確地seek到某個(gè)位置规揪。
還有一個(gè)叫 IDR 幀的概念桥氏,IDR都是I幀,可以防止一幀解碼出錯(cuò)粒褒,導(dǎo)致后面所有幀解碼出錯(cuò)的問題识颊。
因?yàn)?H264 采用的是多幀預(yù)測(cè),導(dǎo)致 I 幀不能作為獨(dú)立的觀察條件奕坟,所以多出一個(gè)叫 IDR 幀的特殊 I 幀用于參考祥款,IDR 幀最關(guān)鍵的概念就是:在解碼器過程中一旦收到 IDR 幀,就會(huì)立即清空參考幀緩沖區(qū)月杉,并將IDR幀作為被參考幀刃跛。這樣,即便前面一幀解碼出現(xiàn)重大錯(cuò)誤苛萎,也不會(huì)蔓延到后面的數(shù)據(jù)中桨昙。
注:關(guān)鍵幀都是I幀,但是I幀不一定是關(guān)鍵幀 這是為什么腌歉?求高人指點(diǎn)M芾摇!翘盖!
DTS全稱:Decoding Time Stamp桂塞。標(biāo)示讀入內(nèi)存中數(shù)據(jù)流在什么時(shí)候開始送入解碼器中進(jìn)行解碼。也就是解碼順序的時(shí)間戳馍驯。
PTS全稱:Presentation Time Stamp阁危。用于標(biāo)示解碼后的視頻幀什么時(shí)候被顯示出來。
在沒有B幀的情況下汰瘫,DTS和PTS的輸出順序是一樣的狂打,一旦存在B幀,PTS和DTS則會(huì)不同混弥。 因?yàn)榻獯a的順序和播放的順序可能是不一致的趴乡。
GOP(Group Of Picture)就是兩個(gè) I 幀之間的距離,一般 GOP 設(shè)置得越大,畫面的效果就會(huì)越好浙宜,到那時(shí)需要解碼的時(shí)間就會(huì)越長官辽。 所以如果碼率固定而 GOP 值越大蛹磺,P/B幀 數(shù)量會(huì)越多粟瞬,畫面質(zhì)量就會(huì)越高。
幀率:
幀率萤捆,即單位時(shí)間內(nèi)幀的數(shù)量裙品,單位為:幀/秒 或fps(frames per second)。幀率越高俗或,每秒切換的圖片就越多市怎,畫面越順滑,過渡越自然辛慰。
幀率的一般以下幾個(gè)典型值:
- 24/25 fps:1秒 24/25 幀区匠,一般的電影幀率。
- 30/60 fps:1秒 30/60 幀帅腌,游戲的幀率驰弄,30幀可以接受,60幀會(huì)感覺更加流暢逼真速客。 Android系統(tǒng)的高性能渲染就是以60幀為標(biāo)準(zhǔn)戚篙。
- 85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻里沒有太大意義溺职。
色彩空間:
我們都知道RGB是三原色岔擂,通過RGB三種基礎(chǔ)色,可以混合出所有的顏色浪耘。
還有一張是YUV乱灵,這種色彩空間并不是我們熟悉的日杈。這是一種亮度與色度分離的色彩格式旗们。
早期的電視都是黑白的,即只有亮度值臊诊,即Y癞埠。有了彩色電視以后状原,加入了UV兩種色度,形成現(xiàn)在的YUV苗踪,也叫YCbCr颠区。
Y:亮度,就是灰度值通铲。除了表示亮度信號(hào)外毕莱,還含有較多的綠色通道量。
U:藍(lán)色通道與亮度的差值。
V:紅色通道與亮度的差值朋截。
因?yàn)槿搜蹖?duì)亮度敏感蛹稍,對(duì)色度不敏感,因此減少部分UV的數(shù)據(jù)量部服,人眼卻無法感知出來唆姐,這樣可以通過壓縮UV的分辨率,在不影響觀感的前提下廓八,減小視頻的體積奉芦。大大提高傳輸?shù)男屎凸?jié)省帶寬。
關(guān)于YUV這里我就不多數(shù)了剧蹂,后面我會(huì)專門寫一篇文章介紹声功。比如YUV444,YUV422宠叼,YUV420和YUV420sp以及YUV和RGB是如何轉(zhuǎn)換的等等先巴。
視頻編碼格式:
視頻編碼格式有很多,比如H26x系列和MPEG系列的編碼冒冬,這些編碼格式都是為了適應(yīng)時(shí)代發(fā)展而出現(xiàn)的伸蚯。
其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯(lián)盟主導(dǎo)的窄驹。
MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導(dǎo)朝卒。
H264是目前最主流的視頻編碼標(biāo)準(zhǔn),目前大多數(shù)的視頻和流媒體都是使用這種編碼格式乐埠。
H264編碼算法是十分復(fù)雜抗斤,不是三言兩語能夠講清楚的,也不在我的能力范圍只能丈咐,我們要做到的就是知道怎么使用就好了瑞眼。
編解碼
編碼:編碼就是將原始音頻數(shù)據(jù)也就是PCM壓縮的一個(gè)過程;或者是將原始的視頻數(shù)據(jù)RGB或YUV壓縮的一個(gè)過程棵逊。
解碼:解碼就是編碼一個(gè)逆過程伤疙,比如將編碼后的數(shù)據(jù)AAC解碼成PCM給播放器播放;或者將編碼后的H264數(shù)據(jù)解碼成YUV或RGB給播放器渲染的過程辆影。
編解碼又分為硬件編解碼和軟件編解碼徒像。
軟件編解碼就是指利用CPU的計(jì)算能力來進(jìn)行編解碼碼,通常如果CPU的能力不是很強(qiáng)的時(shí)候蛙讥,一則編解碼速度會(huì)比較慢锯蛀,二則手機(jī)可能出現(xiàn)發(fā)熱現(xiàn)象。但是次慢,由于使用統(tǒng)一的算法旁涤,兼容性會(huì)很好翔曲。
硬件編解碼解碼,指的是利用手機(jī)上專門的解碼芯片來加速解碼劈愚。通常硬解碼的解碼速度會(huì)快很多瞳遍,但是由于硬解碼由各個(gè)廠家實(shí)現(xiàn),質(zhì)量參差不齊菌羽,非常容易出現(xiàn)兼容性問題掠械。
封裝格式
封裝格式業(yè)界也又人稱音視頻容器,比如我們經(jīng)乘阍洌看到的視頻后綴名:mp4份蝴、rmvb、avi氓轰、mkv、mov
等就是音視頻的容器浸卦,它們將音頻和視頻甚至是字幕一起打包進(jìn)去署鸡,封裝成一個(gè)文件。
結(jié)語
對(duì)于音視頻的基礎(chǔ)知識(shí)今天先介紹到這里限嫌,如果你對(duì)音視頻開發(fā)感興趣可關(guān)注公號(hào):思想覺悟靴庆,后續(xù)我們共同探討,共同進(jìn)步怒医。