聲音
聲音是波
,靠物體的振動(dòng)
產(chǎn)生。聲波有三要素:頻率或辖、振幅率挣、波形
浩村。
頻率:頻率越高,波長就會(huì)越短
.而低頻聲響的波長則較長.所以這樣的聲音更容易繞過障礙物,能量衰減就越小.聲音就會(huì)傳播的越遠(yuǎn).
數(shù)字音頻
將模擬
信號(hào)轉(zhuǎn)換為數(shù)字
信號(hào)的過程,分別是
-
采樣
:在時(shí)間軸
上對(duì)信號(hào)進(jìn)行數(shù)字化 -
量化
:在幅度軸
上對(duì)信號(hào)進(jìn)行數(shù)字化 -
編碼
:按照一定格式記錄采樣和量化后的數(shù)據(jù).是為了壓縮編碼喘漏,去除人的肉眼很難察覺的冗余信息以更方便傳輸护蝶。
最常見的音頻編碼格式有AAC、MP3翩迈、WMA
等持灰。
視頻
視頻的構(gòu)成:
-
圖像
:視頻內(nèi)容本身就是一幀一幀的圖片構(gòu)成
.人眼只要1秒鐘連續(xù)播放16張
以上的圖片,就會(huì)認(rèn)為這是一段連貫的視頻.這種物理現(xiàn)象叫視覺暫留
. -
音頻
:視頻一定是由音頻+圖像
內(nèi)容構(gòu)成的.所以音頻在視頻中是單獨(dú)的一個(gè)部分. -
元信息
:用于描述信息的結(jié)構(gòu)\語義\用途\用法等.比如視頻元信息就包含了視頻的具體信息,比如編碼格式,分辨率等等
視頻封裝格式
視頻封裝格式相當(dāng)于一種儲(chǔ)存視頻信息
的容器,包含了封裝視頻文件所需要的視頻信息负饲、音頻信息和相關(guān)的配置信息
等堤魁。
一些公司會(huì)使用私有封裝格式,只有公司內(nèi)部播放器才能播放返十。
常見的視頻文件格式各自特點(diǎn)如下:
QuickTime File Format 格式
:對(duì)應(yīng)的文件格式是.mov
妥泉,是 Apple 公司開發(fā)的一種視頻格式,默認(rèn)的播放器是蘋果的 QuickTime洞坑。這種封裝格式具有較高的壓縮比率和較完美的視頻清晰度等特點(diǎn)盼玄,并可以保存 alpha 通道仰禽。Real Video 格式
:對(duì)應(yīng)的文件格式是.rm叫搁、.rmvb
恬偷,是 Real Networks 公司所制定的音頻視頻壓縮規(guī)范稱為 Real Media。用戶可以使用 RealPlayer 根據(jù)不同的網(wǎng)絡(luò)傳輸速率制定出不同的壓縮比率逢慌,從而實(shí)現(xiàn)在低速率的網(wǎng)絡(luò)上進(jìn)行影像數(shù)據(jù)實(shí)時(shí)傳送和播放悠轩。Audio Video Interleaved 格式
:對(duì)應(yīng)的文件格式為.avi
,是由 Microsoft 公司于 1992 年推出攻泼。這種視頻格式的優(yōu)點(diǎn)是圖像質(zhì)量好火架,無損 AVI 可以保存 alpha 通道。缺點(diǎn)是體積過于龐大忙菠,并且壓縮標(biāo)準(zhǔn)不統(tǒng)一何鸡,存在較多的高低版本兼容問題。Windows Media Video 格式
:對(duì)應(yīng)的文件格式是.wmv
牛欢,是微軟推出的一種采用獨(dú)立編碼方式并且可以直接在網(wǎng)上實(shí)時(shí)觀看視頻節(jié)目的文件壓縮格式骡男。在同等視頻質(zhì)量下,WMV 格式的文件可以邊下載邊播放傍睹,因此很適合在網(wǎng)上播放和傳輸隔盛。Moving Picture Experts Group 格式
:對(duì)應(yīng)的文件格式有.mpg、.mpeg拾稳、.mpe吮炕、.dat、.vob访得、.asf龙亲、.3gp、.mp4
等等,是由運(yùn)動(dòng)圖像專家組制定的視頻格式鳄炉,該專家組于 1988 年組建杜耙,專門負(fù)責(zé)視頻和音頻標(biāo)準(zhǔn)制定,其成員都是視頻迎膜、音頻以及系統(tǒng)領(lǐng)域的技術(shù)專家泥技。MPEG 格式目前有三個(gè)壓縮標(biāo)準(zhǔn)浆兰,分別是 MPEG-1磕仅、MPEG-2、和 MPEG-4簸呈。MPEG-4 是現(xiàn)在用的比較多的視頻封裝格式榕订,它為了播放流式媒體的高質(zhì)量視頻而專門設(shè)計(jì)的,以求使用最少的數(shù)據(jù)獲得最佳的圖像質(zhì)量蜕便。Matroska 格式
:對(duì)應(yīng)的文件格式是.mkv
劫恒,Matroska 是一種新的視頻封裝格式,它可將多種不同編碼的視頻及 16 條以上不同格式的音頻和不同語言的字幕流封裝到一個(gè) Matroska Media 文件當(dāng)中轿腺。Flash Video 格式
:對(duì)應(yīng)的文件格式是.flv
两嘴,是由 Adobe Flash 延伸出來的一種網(wǎng)絡(luò)視頻封裝格式。這種格式被很多視頻網(wǎng)站所采用族壳。
音視頻編解碼
為什么需要編碼呢憔辫?因?yàn)樾枰獕嚎s。視頻編解碼的過程是指對(duì)數(shù)字視頻
進(jìn)行壓縮或解壓縮
的一個(gè)過程.
最常見的視頻編碼格式有
H.264仿荆、H.265贰您、MPEG-4
等.最常見的音頻編碼格式有
AAC、MP3拢操、WMA
等锦亦。硬編碼: 使用GPU計(jì)算,獲取數(shù)據(jù)結(jié)果,優(yōu)點(diǎn)速度快,效率高,延長電量的使用.
軟編碼: 使用CPU來進(jìn)行編碼計(jì)算,簡單令境,直接杠园,性能低
H.264
最大的優(yōu)勢,具有很高的數(shù)據(jù)壓縮比率。H.265性能也很好舔庶,但會(huì)占用更多CPU抛蚁,手機(jī)端可能發(fā)熱,更耗電等栖茉。
AAC
是目前比較熱門的有損壓縮編碼技術(shù),在小于128Kbit/s
的碼率下表現(xiàn)優(yōu)異,并且多用于視頻中的音頻編碼篮绿。
視頻壓縮中的IBP幀
I幀
,也叫關(guān)鍵幀
,視頻的第一幀會(huì)被作為關(guān)鍵幀完整保存下來.而后面的幀會(huì)向前依賴。自身可以通過視頻解碼算法解壓成一張單獨(dú)的完整的視頻畫面.所以I幀去掉的是視頻幀在空間維度上的冗余信息.P幀
,需要參考前面
的一個(gè)I幀或P幀解碼成一個(gè)完整的視頻畫面B幀
,雙向
參考幀吕漂。需要參考前面的一個(gè)I幀或者P幀以及后面的一個(gè)P幀來生成一個(gè)完整的視頻畫面.對(duì)實(shí)時(shí)互動(dòng)的直播,一般不會(huì)使用B幀,因?yàn)樾枰昂髤⒖记着洹?duì)于壓縮比較高,可以接受一定延時(shí)的直播,可以用B幀
如果H264碼流中I幀錯(cuò)誤/丟失,就會(huì)導(dǎo)致錯(cuò)誤傳遞,P/B幀單獨(dú)是完成不了解碼工作
吼虎。
花屏犬钢、卡頓
花屏
是因?yàn)槟銇G了P幀或者I幀
.導(dǎo)致解碼錯(cuò)誤.
卡頓
是因?yàn)闉榱伺禄ㄆ?將整組錯(cuò)誤的GOP
數(shù)據(jù)扔掉了.直達(dá)下一組正確的GOP再重新刷屏.而這中間的時(shí)間差,就是我們所感受的卡頓.
色彩空間
RGB
開發(fā)場景中使用最多的應(yīng)該是RGB
模型。
RGB色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn)思灰,是通過對(duì)紅(R)玷犹、綠(G)、藍(lán)(B)三個(gè)顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的洒疚,RGB即是代表紅歹颓、綠、藍(lán)三個(gè)通道的顏色油湖,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色巍扛,是目前運(yùn)用最廣的顏色系統(tǒng)之一。
YCbCr
還有一種更為廣泛的 YUV
模型,每一個(gè)顏色有一個(gè)亮度信號(hào) Y
乏德,和兩個(gè)色度信號(hào) U 和V
撤奸。亮度信號(hào)是強(qiáng)度的感覺,它和色度信號(hào)斷開喊括,這樣的話強(qiáng)度就可以在不影響顏色的情況下改變胧瓜。
一般所講的YUV大多是指YCbCr.
其中 YCbCr
是在計(jì)算機(jī)系統(tǒng)中應(yīng)用最多的成員,其應(yīng)用領(lǐng)域很廣泛郑什,JPEG府喳、MPEG
均采用此格式。YCbCr其中Y是指亮度分量
蹦误,Cb指藍(lán)色色度分量
劫拢,而Cr指紅色色度分量
。人的肉眼對(duì)視頻的Y分量更敏感强胰,因此在通過對(duì)色度分量進(jìn)行子采樣來減少
色度分量后舱沧,肉眼將察覺不到的圖像質(zhì)量的變化。
YUV(YCbCr)采樣格式:
主要的采樣格式有
YCbCr 4:2:0
偶洋、YCbCr 4:2:2
熟吏、YCbCr 4:1:1
和YCbCr 4:4:4
。其中YCbCr4:1:1 比較
常用
玄窝,其含義為:每個(gè)點(diǎn)
保存一個(gè)8bit
的亮度值(也就是Y值), 每 2 x 2 個(gè)點(diǎn)保存一個(gè)Cr和Cb
值,圖像在肉眼中的感覺不會(huì)起太大的變化牵寺。所以,原來用 RGB(R,G,B 都是 8bit unsigned) 模型, 每個(gè)點(diǎn)需要8x3=24 bits, 而現(xiàn)在僅需要 8+(8/4)+(8/4)=12bits,平均每個(gè)點(diǎn)占12bits恩脂。這樣就把圖像的數(shù)據(jù)壓縮了一半帽氓。
直播
在直播項(xiàng)目中,一般常見有8個(gè)步驟:
- 音視頻采集:
AVFoundation
- 視頻濾鏡:原生
CoreImage
,三方GPUImage
- 音視頻編碼:硬:
VideoToolBox俩块、AudioToolBox
軟:FFmpeg黎休、fdk_aac
- 推流:
流媒體協(xié)議
: RTMP\RTSP\HLS\FLV視頻封裝格式
: TS\FLV音頻封裝格式
: Mp3\AAC - 流媒體服務(wù)器處理: 實(shí)時(shí)轉(zhuǎn)碼等
- 拉流:
協(xié)議
有RTMP\RTSP\HLS\FLV - 音視頻解碼 : 同編碼
- 音視頻播放 :
ijkplayer,kxmovie
都是基于FFmpeg框架封裝的
對(duì)實(shí)時(shí)互動(dòng)的直播,一般不會(huì)使用B幀,因?yàn)樾枰昂髤⒖寂臁?duì)于壓縮比較高,可以接受一定延時(shí)的直播势腮,可以用B幀
直播間里一般不會(huì)用H265
联贩。,因?yàn)樗膲嚎s比更高,它占用的CPU也是非常高的.在直播里,如果用X265的話,CPU就抖然就上去了。
VideoToolBox框架的流程
- 創(chuàng)建session
- 設(shè)置編碼相關(guān)參數(shù)
- 開始編碼
- 循環(huán)獲取采集數(shù)據(jù)
- 獲取編碼后數(shù)據(jù)
- 將數(shù)據(jù)寫入H264文件
開發(fā)者必須將原始圖像
數(shù)據(jù)封裝為CVPixelBuufer
的數(shù)據(jù)結(jié)構(gòu).該數(shù)據(jù)結(jié)構(gòu)是使用VideoToolBox的核心
.
我們使用任何硬件設(shè)備都要使用對(duì)應(yīng)的session
,麥克風(fēng)就要使用AudioSession
,使用Camera就要使用AVCaptureSession
,使用編碼則需要使用VTCompressionSession
.解碼時(shí),要使用VTDecompressionSessionRef
.