流媒體背景
當(dāng)下,音視頻蚀苛、流媒體已經(jīng)無(wú)處不在在验,直播已經(jīng)火了幾年,在后續(xù)的時(shí)間里面堵未,人們聊天已經(jīng)不僅僅滿足與文字腋舌、而是更多的在于“類(lèi)面對(duì)面”交流,能夠?qū)崟r(shí)感知對(duì)方的表情渗蟹、動(dòng)作块饺。為此,有必要跟緊時(shí)代潮流雌芽,好好梳理梳理流媒體這門(mén)功課授艰。
流媒體是什么?流媒體就是指采用流式傳輸技術(shù)在網(wǎng)絡(luò)上連續(xù)實(shí)時(shí)播放的媒體格式世落,如音頻淮腾、視頻或多媒體文件。流媒體技術(shù)也稱流式媒體技術(shù)。那么音視頻就是流媒體的核心谷朝。
音視頻常見(jiàn)術(shù)語(yǔ)定義規(guī)范
音視頻組成
一個(gè)完整的視頻文件篮灼,包括音頻、視頻和基礎(chǔ)元信息徘禁,我們常見(jiàn)的視頻文件如mp4诅诱、mov、flv送朱、avi娘荡、rmvb等視頻文件,就是一個(gè)容器的封裝驶沼,里面包含了音頻和視頻兩部分炮沐,并且都是通過(guò)一些特定的編碼算法,進(jìn)行編碼壓縮過(guò)后的回怜。
H264酿秸、Xvid等就是視頻編碼格式豆胸,MP3、AAC等就是音頻編碼格式。例如:將一個(gè)Xvid視頻編碼文件和一個(gè)MP3音頻編碼文件按AVI封裝標(biāo)準(zhǔn)封裝以后骏融,就得到一個(gè)AVI后綴的視頻文件沾鳄。
因此诸蚕,視頻轉(zhuǎn)換需要設(shè)置的本質(zhì)就是
設(shè)置需要的視頻編碼
設(shè)置需要的音頻編碼
選擇需要的容器封裝
一個(gè)完整的視頻轉(zhuǎn)換設(shè)置都至少包括了上面3個(gè)步驟舀射。
編碼格式
音頻編碼格式
音頻編碼格式有如下
AAC
AMR
PCM
ogg(ogg vorbis音頻)
AC3(DVD 專用音頻編碼)
DTS(DVD 專用音頻編碼)
APE(monkey’s 音頻)
AU(sun 格式)
WMA
音頻編碼方案之間音質(zhì)比較(AAC,MP3驹碍,WMA等)結(jié)果: AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3
目前最常見(jiàn)的音頻格式有 Mp3壁涎、AC-3、ACC志秃,MP3最廣泛的支持最多怔球,AC-3是杜比公司的技術(shù),ACC是MPEG-4中的音頻標(biāo)準(zhǔn)浮还,ACC是目前比較先進(jìn)和具有優(yōu)勢(shì)的技術(shù)竟坛。對(duì)應(yīng)入門(mén),知道有這幾種最常見(jiàn)的音頻格式足以碑定。
視頻編碼格式
視頻編碼標(biāo)準(zhǔn)有兩大系統(tǒng): MPEG 和ITU-T流码,國(guó)際上制定視頻編解碼技術(shù)的組織有兩個(gè),一個(gè)是“國(guó)際電聯(lián)(ITU-T)”延刘,它制定的標(biāo)準(zhǔn)有H.261、H.263六敬、H.263+碘赖、H.264等,另一個(gè)是“國(guó)際標(biāo)準(zhǔn)化組織(ISO)”它制定的標(biāo)準(zhǔn)有MPEG-1、MPEG-2普泡、MPEG-4等播掷。
常見(jiàn)編碼格式有:
Xvid(MPEG4)
H264 (目前最常用編碼格式)
H263
MPEG1,MPEG2
AC-1
RM撼班,RMVB
H.265(目前用的不夠多)
目前最常見(jiàn)的視頻編碼方式的大致性能排序基本是: MPEG-1/-2 < WMV/7/8 < RM/RMVB < Xvid/Divx < AVC/H.264(由低到高歧匈,可能不完全準(zhǔn)確)。
在H.265出來(lái)之前砰嘁,H264是壓縮率最高的視頻壓縮格式件炉,其優(yōu)勢(shì)有:
低碼率(Low Bit Rate):和MPEG2和MPEG4 ASP等壓縮技術(shù)相比,在同等圖像質(zhì)量下矮湘,采用H.264技術(shù)壓縮后的數(shù)據(jù)量只有MPEG2的1/8斟冕,MPEG4的1/3。
高質(zhì)量的圖象 :H.264能提供連續(xù)缅阳、流暢的高質(zhì)量圖象(DVD質(zhì)量)磕蛇。
容錯(cuò)能力強(qiáng) :H.264提供了解決在不穩(wěn)定網(wǎng)絡(luò)環(huán)境下容易發(fā)生的丟包等錯(cuò)誤的必要工具。
網(wǎng)絡(luò)適應(yīng)性強(qiáng) :H.264提供了網(wǎng)絡(luò)抽象層(Network Abstraction Layer)十办,使得H.264的文件能容易地在不同網(wǎng)絡(luò)上傳輸(例如互聯(lián)網(wǎng)秀撇,CDMA,GPRS向族,WCDMA捌袜,CDMA2000等)。
H.264最大的優(yōu)勢(shì)是具有很高的數(shù)據(jù)壓縮比率炸枣,在同等圖像質(zhì)量的條件下虏等,H.264的壓縮比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍适肠。舉個(gè)例子霍衫,原始文件的大小如果為88GB,采用MPEG-2壓縮標(biāo)準(zhǔn)壓縮后變成3.5GB侯养,壓縮比為25∶1敦跌,而采用H.264壓縮標(biāo)準(zhǔn)壓縮后變?yōu)?79MB,從88GB到879MB逛揩,H.264的壓縮比達(dá)到驚人的102∶1柠傍。低碼率(Low Bit Rate)對(duì)H.264的高的壓縮比起到了重要的作用,和MPEG-2和MPEG-4 ASP等壓縮技術(shù)相比辩稽,H.264壓縮技術(shù)將大大節(jié)省用戶的下載時(shí)間和數(shù)據(jù)流量收費(fèi)惧笛。尤其值得一提的是,H.264在具有高壓縮比的同時(shí)還擁有高質(zhì)量流暢的圖像逞泄,正因?yàn)槿绱嘶颊?jīng)過(guò)H.264壓縮的視頻數(shù)據(jù)拜效,在網(wǎng)絡(luò)傳輸過(guò)程中所需要的帶寬更少,也更加經(jīng)濟(jì)各谚。
目前這些常見(jiàn)的視頻編碼格式實(shí)際上都屬于有損壓縮紧憾,包括H264和H265,也是有損編碼昌渤,有損編碼才能在質(zhì)量得以保證的前提下得到更高的壓縮率和更小體積
存儲(chǔ)封裝格式
目前市面常見(jiàn)的存儲(chǔ)封裝格式有如下:
AVI (.avi)
ASF(.asf)
WMV (.wmv)
QuickTime ( .mov)
MPEG (.mpg / .mpeg)
MP4 (.mp4)
m2ts (.m2ts / .mts )
Matroska (.mkv / .mks / .mka )
RM ( .rm / .rmvb)
TS/PS
AVI : 可用MPEG-2, DIVX, XVID, WMV3, WMV4, AC-1, H.264
WMV : 可用WMV3, WMV4, AC-1
RM/RMVB : 可用RV40, RV50, RV60, RM8, RM9, RM10
MOV : 可用MPEG-2, MPEG4-ASP(XVID), H.264
MKV : 所有
視頻碼率赴穗、幀率、分辨率
碼率
碼流(Data Rate)是指視頻文件在單位時(shí)間內(nèi)使用的數(shù)據(jù)流量膀息,也叫碼率或碼流率般眉,通俗一點(diǎn)的理解就是取樣率,是視頻編碼中畫(huà)面質(zhì)量控制中最重要的部分,一般我們用的單位是kb/s或者M(jìn)b/s履婉。一般來(lái)說(shuō)同樣分辨率下煤篙,視頻文件的碼流越大,壓縮比就越小毁腿,畫(huà)面質(zhì)量就越高辑奈。碼流越大,說(shuō)明單位時(shí)間內(nèi)采樣率越大已烤,數(shù)據(jù)流鸠窗,精度就越高,處理出來(lái)的文件就越接近原始文件胯究,圖像質(zhì)量越好稍计,畫(huà)質(zhì)越清晰,要求播放設(shè)備的解碼能力也越高裕循。
當(dāng)然臣嚣,碼率越大,文件體積也越大剥哑,其計(jì)算公式是文件體積=時(shí)間X碼率/8硅则。例如,網(wǎng)絡(luò)上常見(jiàn)的一部90分鐘1Mbps碼率的720P RMVB文件株婴,其體積就=5400秒×1Mbps/8=675MB怎虫。
通常來(lái)說(shuō),一個(gè)視頻文件包括了畫(huà)面(視頻)及聲音(音頻)困介,例如一個(gè)RMVB的視頻文件大审,里面包含了視頻信息和音頻信息,音頻及視頻都有各自不同的采樣方式和比特率座哩,也就是說(shuō)徒扶,同一個(gè)視頻文件音頻和視頻的比特率并不是一樣的。而我們所說(shuō)的一個(gè)視頻文件碼流率大小八回,一般是指視頻文件中音頻及視頻信息碼流率的總和酷愧。
幀率
幀率也稱為FPS(Frames Per Second)- - - 幀/秒驾诈。是指每秒鐘刷新的圖片的幀數(shù)缠诅,也可以理解為圖形處理器每秒鐘能夠刷新幾次溶浴。越高的幀速率可以得到更流暢、更逼真的動(dòng)畫(huà)管引。每秒鐘幀數(shù)(FPS)越多士败,所顯示的動(dòng)作就會(huì)越流暢。
關(guān)于幀率有如下幾個(gè)基礎(chǔ)數(shù)據(jù):
幀率越高褥伴,cpu消耗就高
秀場(chǎng)視頻直播谅将,一般幀率20fps
普通視頻直播,一般幀率15fps
分辨率
視頻分辨率是指視頻成像產(chǎn)品所成圖像的大小或尺寸重慢。常見(jiàn)的視像分辨率有352×288饥臂,176×144,640×480似踱,1024×768隅熙。在成像的兩組數(shù)字中,前者為圖片長(zhǎng)度核芽,后者為圖片的寬度囚戚,兩者相乘得出的是圖片的像素,長(zhǎng)寬比一般為4:3.
480P : 640 x 480 個(gè)像素點(diǎn)
720P : 1280 x 720 個(gè)像素點(diǎn)
1080P : 1920 x 1080 個(gè)像素點(diǎn)
然后還需要關(guān)注每個(gè)像素點(diǎn)的存儲(chǔ)格式轧简,每個(gè)像素點(diǎn)占用的字節(jié)大小驰坊。
圖像存儲(chǔ)格式y(tǒng)uv
一幅彩色圖像的基本要素是什么?
1哮独、寬:一行有多少個(gè)像素點(diǎn)拳芙。
2、高:一列有多少個(gè)像素點(diǎn)皮璧,一幀有多少行
3舟扎、YUV格式還是RGB格式?
4恶导、一行多少個(gè)字節(jié)浆竭??
5惨寿、圖像大小是多少邦泄?
6、圖像的分辨率多少裂垦?
說(shuō)白了顺囊,一幅圖像包括的基本東西就是二進(jìn)制數(shù)據(jù),其容量大小實(shí)質(zhì)即為二進(jìn)制數(shù)據(jù)的多少蕉拢。一幅1920x1080像素的YUV422的圖像特碳,大小是1920X1080X2=4147200(十進(jìn)制)诚亚,也就是3.95M大小。這個(gè)大小跟多少個(gè)像素點(diǎn)和數(shù)據(jù)的存儲(chǔ)格式有關(guān)午乓。
YUV與像素的關(guān)系:
YUV格式站宗,與我們熟知的RGB類(lèi)似,YUV也是一種顏色編碼方法益愈,主要用于電視系統(tǒng)以及模擬視頻領(lǐng)域梢灭,它將亮度信息(Y)與色彩信息(UV)分離,沒(méi)有UV信息一樣可以顯示完整的圖像蒸其,只不過(guò)是黑白的敏释,這樣的設(shè)計(jì)很好地解決了彩色電視機(jī)與黑白電視的兼容問(wèn)題。并且摸袁,YUV不像RGB那樣要求三個(gè)獨(dú)立的視頻信號(hào)同時(shí)傳輸钥顽,所以用YUV方式傳送占用極少的頻寬。
YUV格式有兩大類(lèi):planar和packed靠汁。對(duì)于planar的YUV格式蜂大,先連續(xù)存儲(chǔ)所有像素點(diǎn)的Y,緊接著存儲(chǔ)所有像素點(diǎn)的U膀曾,隨后是所有像素點(diǎn)的V县爬。對(duì)于packed的YUV格式,每個(gè)像素點(diǎn)的Y,U,V是連續(xù)交替存儲(chǔ)的添谊。
YUV财喳,分為三個(gè)分量,“Y”表示明亮度(Luminance或Luma)斩狱,也就是灰度值耳高;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度所踊,用于指定像素的顏色泌枪。
YUV是利用一個(gè)亮度(Y)、兩個(gè)色差(U,V)來(lái)代替?zhèn)鹘y(tǒng)的RGB三原色來(lái)壓縮圖像秕岛。傳統(tǒng)的RGB三原色使用紅綠藍(lán)三原色表示一個(gè)像素碌燕,每種原色占用一個(gè)字節(jié)(8bit),因此一個(gè)像素用RGB表示則需要8 * 3=24bit继薛。
如果使用YUV表示這個(gè)像素修壕,假設(shè)YUV的采樣率為:4:2:0,即每一個(gè)像素對(duì)于亮度Y的采樣頻率為1遏考,對(duì)于色差U和V慈鸠,則是每相鄰的兩個(gè)像素各取一個(gè)U和V。對(duì)于單個(gè)的像素來(lái)說(shuō)灌具,色差U和V的采樣頻率為亮度的一半青团。如有三個(gè)相鄰的像素譬巫,如果用RGB三原色表示,則共需要占用:8 * 3 * 3 = 72bits督笆;如果采用YUV(4:2:0)表示芦昔,則只需要占用:8 * 3(Y)+ 8* 3 * 0.5(U)+ 8 * 3 * 0.5(V)= 36bits。只需原來(lái)一半的空間胖腾,就可以表示原來(lái)的圖像烟零,數(shù)據(jù)率壓縮了一倍瘪松,而圖像的效果基本沒(méi)發(fā)生變化咸作。
那么,具體yuv格式所占用的字節(jié)數(shù)要怎么算呢 宵睦?
YUV圖像格式的內(nèi)存大小
4:4:4 表示色度值(UV)沒(méi)有減少采樣记罚。即Y,U,V各占一個(gè)字節(jié),加上Alpha通道一個(gè)字節(jié)壳嚎,總共占4字節(jié).這個(gè)格式其實(shí)就是24bpp的RGB格式了桐智。
4:2:2 表示UV分量采樣減半,比如第一個(gè)像素采樣Y,U,第二個(gè)像素采樣Y,V,依次類(lèi)推,這樣每個(gè)點(diǎn)占用2個(gè)字節(jié).二個(gè)像素組成一個(gè)宏像素.
需要占用的內(nèi)存:w * h * 2
4:2:0 這種采樣并不意味著只有Y,Cb而沒(méi)有Cr分量烟馅,這里的0說(shuō)的U说庭,V分量隔行才采樣一次。比如第一行采樣 4:2:0 ,第二行采樣 4:0:2 ,依次類(lèi)推...在這種采樣方式下郑趁,每一個(gè)像素占用16bits或10bits空間.
內(nèi)存則是:yyyyyyyyuuvv
需要占用的內(nèi)存:w * h * 3 / 2
4:1:1 可以參考4:2:2分量刊驴,是進(jìn)一步壓縮,每隔四個(gè)點(diǎn)才采一次U和V分量寡润。一般是第1點(diǎn)采Y,U,第2點(diǎn)采Y,第3點(diǎn)采YV,第4點(diǎn)采Y,依次類(lèi)推捆憎。
幀率、碼率與分辨率之間關(guān)系
碼率和幀率沒(méi)有半毛錢(qián)關(guān)系
碼率關(guān)系著帶寬梭纹、文件體積
幀率關(guān)系著畫(huà)面流暢度和cpu消耗
分辨率關(guān)系著圖像尺寸和清晰度
一個(gè)視頻文件的大小為5.86M,播放時(shí)長(zhǎng)為3分7秒
1躲惰,該文件對(duì)應(yīng)的碼率就是5.86 * 1024 * 1024 * 8 / (3 * 60 + 7) = 262872.95657754bps
2,10M獨(dú)享帶寬能支撐的同時(shí)在線人數(shù)10 * 1024 * 1024 / 262872.95657754 = 39.889078498294
3变抽, 支撐1000人同時(shí)在線的系統(tǒng)最少需要的帶寬數(shù)為
10min础拨,流量消耗41587KB
41587/10*60 = 69KB/s = 69 * 8 Kb/s = 532Kb/s
那么得到碼率就是 532Kb/s
輸出文件大小公式
一個(gè)音頻編碼率為128Kbps,視頻編碼率為800Kbps的文件绍载,其總編碼率為928Kbps诡宗,意思是經(jīng)過(guò)編碼后的數(shù)據(jù)每秒鐘需要用928K比特來(lái)表示。
文件大小公式:
(音頻編碼率(KBit為單位)/8 + 視頻編碼率(KBit為單位)/8)× 影片總長(zhǎng)度(秒為單位)= 文件大泄渥辍(MB為單位)
一幀圖像大小
一幀圖像原始大小 = 寬像素 * 長(zhǎng)像素 僚焦,當(dāng)然要考慮數(shù)據(jù)格式,因?yàn)閿?shù)據(jù)格式不一樣曙痘,大小寫(xiě)也不相同芳悲,一般數(shù)據(jù)采用rgb立肘、yuv格式,如rgb32名扛、yuv420谅年、yuv422等。最常用的應(yīng)當(dāng)屬于yuv420肮韧。 因此融蹂,計(jì)算公式為:
文件的字節(jié)數(shù) = 圖像分辨率 * 圖像量化位數(shù)/8
圖像分辨率 = X方向的像素?cái)?shù) * Y方向的像素?cái)?shù)
圖像量化數(shù) = 二進(jìn)制顏色位數(shù)
RGB24每幀的大小是
size=width×heigth×3 Bit
RGB32每幀的大小是
size=width×heigth×4
YUV420每幀的大小是
size=width×heigth×1.5 Bit
舉例說(shuō)明,對(duì)于一個(gè)1024*768的圖像實(shí)際的YUV422數(shù)據(jù)流大小就為:1024 *768 * 2 = 1572864bit
音頻采樣率弄企、位數(shù)
1超燃、聲道數(shù):聲道數(shù)是音頻傳輸?shù)闹匾笜?biāo),現(xiàn)在主要有單聲道和雙聲道之分拘领。雙聲道又稱為立體聲意乓,在硬件中要占兩條線路,音質(zhì)约素、音色好届良, 但立體聲數(shù)字化后所占空間比單聲道多一倍。
2圣猎、量化位數(shù): 量化位是對(duì)模擬音頻信號(hào)的幅度軸進(jìn)行數(shù)字化士葫,它決定了模擬信號(hào)數(shù)字化以后的動(dòng)態(tài)范圍。由于計(jì)算機(jī)按字節(jié)運(yùn)算送悔,一般的量化位數(shù)為 8位和16位慢显。量化位越高,信號(hào)的動(dòng)態(tài)范圍越大放祟,數(shù)字化后的音頻信號(hào)就越可能接近原始信號(hào)鳍怨,但所需要的存儲(chǔ)空間也越大。
3跪妥、采樣率:也稱為采樣速度或者采樣頻率鞋喇,定義了每秒從連續(xù)信號(hào)中提取并組成離散信號(hào)的采樣個(gè)數(shù),它用赫茲(Hz)來(lái)表示眉撵。采樣率是指將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)時(shí)的采樣頻率侦香,也就是單位時(shí)間內(nèi)采樣多少點(diǎn)。一個(gè)采樣點(diǎn)數(shù)據(jù)有多少個(gè)比特纽疟。比特率是指每秒傳送的比特(bit)數(shù)罐韩。單位為 bps(Bit Per Second),比特率越高污朽,傳送的數(shù)據(jù)越大散吵,音質(zhì)越好.
采樣率的選擇應(yīng)該遵循奈奎斯特(Harry Nyquist)采樣理論( 如果對(duì)某一模擬信號(hào)進(jìn)行采樣,則采樣后可還原的最高信號(hào)頻率只有采樣頻率的一半,或者說(shuō)只要采樣頻率高于輸入信號(hào)最高頻率的兩倍矾睦,就能從采樣信號(hào)系列重構(gòu)原始信號(hào) )晦款。根據(jù)該采樣理論, CD激光唱盤(pán)采樣頻率為 44kHz枚冗,可記錄的最高音頻為 22kHz缓溅,這樣的音質(zhì)與原始聲音相差無(wú)幾,也就是我們常說(shuō)的超級(jí)高保真音質(zhì)赁温。通信系統(tǒng)中數(shù)字電話的采用頻率通常為 8kHz坛怪,與原 4k帶寬聲音一致的。
比特率(音頻) = 采樣率 x 采用位數(shù) x 聲道數(shù).
以電話為例股囊,每秒3000次取樣袜匿,每個(gè)取樣是7比特,那么電話的比特率是21000毁涉。 而CD是每秒 44100次取樣沉帮,兩個(gè)聲道,每個(gè)取樣是13位PCM編碼贫堰,所以CD的比特率是44100213=1146600,也就是說(shuō)CD每秒的數(shù)據(jù)量大約是 144KB待牵,而一張CD的容量是74分等于4440秒其屏,就是639360KB=640MB。
I幀缨该、P幀偎行、B幀、IDR幀
I幀:幀內(nèi)編碼幀
I幀特點(diǎn):
它是一個(gè)全幀壓縮編碼幀贰拿。它將全幀圖像信息進(jìn)行JPEG壓縮編碼及傳輸;
解碼時(shí)僅用I幀的數(shù)據(jù)就可重構(gòu)完整圖像;
I幀描述了圖像背景和運(yùn)動(dòng)主體的詳情;
I幀不需要參考其他畫(huà)面而生成;
I幀是P幀和B幀的參考幀(其質(zhì)量直接影響到同組中以后各幀的質(zhì)量);
I幀是幀組GOP的基礎(chǔ)幀(第一幀),在一組中只有一個(gè)I幀;
I幀不需要考慮運(yùn)動(dòng)矢量;
I幀所占數(shù)據(jù)的信息量比較大蛤袒。
P幀:前向預(yù)測(cè)編碼幀
P幀的預(yù)測(cè)與重構(gòu):P幀是以I幀為參考幀,在I幀中找出P幀“某點(diǎn)”的預(yù)測(cè)值和運(yùn)動(dòng)矢量,取預(yù)測(cè)差值和運(yùn)動(dòng)矢量一起傳送。在接收端根據(jù)運(yùn)動(dòng)矢量從I幀中找出P幀“某點(diǎn)”的預(yù)測(cè)值并與差值相加以得到P幀“某點(diǎn)”樣值,從而可得到完整的P幀膨更。又稱predictive-frame妙真,通過(guò)充分將低于圖像序列中前面已編碼幀的時(shí)間冗余信息來(lái)壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預(yù)測(cè)幀
P幀特點(diǎn):
P幀是I幀后面相隔1~2幀的編碼幀;
P幀采用運(yùn)動(dòng)補(bǔ)償?shù)姆椒▊魉退c前面的I或P幀的差值及運(yùn)動(dòng)矢量(預(yù)測(cè)誤差);
解碼時(shí)必須將I幀中的預(yù)測(cè)值與預(yù)測(cè)誤差求和后才能重構(gòu)完整的P幀圖像;
P幀屬于前向預(yù)測(cè)的幀間編碼荚守。它只參考前面最靠近它的I幀或P幀;
P幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀;
由于P幀是參考幀,它可能造成解碼錯(cuò)誤的擴(kuò)散;
由于是差值傳送,P幀的壓縮比較高珍德。
B幀:雙向預(yù)測(cè)內(nèi)插編碼幀。
B幀的預(yù)測(cè)與重構(gòu):B幀以前面的I或P幀和后面的P幀為參考幀,“找出”B幀“某點(diǎn)”的預(yù)測(cè)值和兩個(gè)運(yùn)動(dòng)矢量,并取預(yù)測(cè)差值和運(yùn)動(dòng)矢量傳送矗漾。接收端根據(jù)運(yùn)動(dòng)矢量在兩個(gè)參考幀中“找出(算出)”預(yù)測(cè)值并與差值求和,得到B幀“某點(diǎn)”樣值,從而可得到完整的B幀锈候。 又稱bi-directional interpolated prediction frame,既考慮與源圖像序列前面已編碼幀敞贡,也顧及源圖像序列后面已編碼幀之間的時(shí)間冗余信息來(lái)壓縮傳輸數(shù)據(jù)量的編碼圖像泵琳,也叫雙向預(yù)測(cè)幀
B幀特點(diǎn):
B幀是由前面的I或P幀和后面的P幀來(lái)進(jìn)行預(yù)測(cè)的;
B幀傳送的是它與前面的I或P幀和后面的P幀之間的預(yù)測(cè)誤差及運(yùn)動(dòng)矢量;
B幀是雙向預(yù)測(cè)編碼幀;
B幀壓縮比最高,因?yàn)樗环从潮麉⒖紟g運(yùn)動(dòng)主體的變化情況,預(yù)測(cè)比較準(zhǔn)確;
B幀不是參考幀,不會(huì)造成解碼錯(cuò)誤的擴(kuò)散。
IDR 幀
IDR(Instantaneous Decoding Refresh)--即時(shí)解碼刷新。
I和IDR幀都是使用幀內(nèi)預(yù)測(cè)的获列。它們都是同一個(gè)東西而已,在編碼和解碼中為了方便琳钉,要首個(gè)I幀和其他I幀區(qū)別開(kāi),所以才把第一個(gè)首個(gè)I幀叫IDR蛛倦,這樣就方便控制編碼和解碼流程歌懒。IDR幀的作用是立刻刷新,使錯(cuò)誤不致傳播,從IDR幀開(kāi)始,重新算一個(gè)新的序列開(kāi)始編碼。而I幀不具有隨機(jī)訪問(wèn)的能力溯壶,這個(gè)功能是由IDR承擔(dān)及皂。IDR會(huì)導(dǎo)致DPB(DecodedPictureBuffer參考幀列表——這是關(guān)鍵所在)清空,而I不會(huì)且改。IDR圖像一定是I圖像验烧,但I(xiàn)圖像不一定是IDR圖像。一個(gè)序列中可以有很多的I圖像又跛,I圖像之后的圖像可以引用I圖像之間的圖像做運(yùn)動(dòng)參考碍拆。一個(gè)序列中可以有很多的I圖像,I圖像之后的圖象可以引用I圖像之間的圖像做運(yùn)動(dòng)參考慨蓝。
對(duì)于IDR幀來(lái)說(shuō)感混,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內(nèi)容,與此相反礼烈,對(duì)于普通的I-幀來(lái)說(shuō)弧满,位于其之后的B-和P-幀可以引用位于普通I-幀之前的I-幀。從隨機(jī)存取的視頻流中此熬,播放器永遠(yuǎn)可以從一個(gè)IDR幀播放庭呜,因?yàn)樵谒鬀](méi)有任何幀引用之前的幀。但是犀忱,不能在一個(gè)沒(méi)有IDR幀的視頻中從任意點(diǎn)開(kāi)始播放募谎,因?yàn)楹竺娴膸偸菚?huì)引用前面的幀。
小結(jié)
I幀表示關(guān)鍵幀阴汇,你可以理解為這一幀畫(huà)面的完整保留数冬;解碼時(shí)只需要本幀數(shù)據(jù)就可以完成(因?yàn)榘暾?huà)面).
P幀表示的是這一幀跟之前的一個(gè)關(guān)鍵幀(或P幀)的差別,解碼時(shí)需要用之前緩存的畫(huà)面疊加上本幀定義的差別鲫寄,生成最終畫(huà)面吉执。(也就是差別幀,P幀沒(méi)有完整畫(huà)面數(shù)據(jù)地来,只有與前一幀的畫(huà)面差別的數(shù)據(jù)).
B幀是雙向差別幀戳玫,也就是B幀記錄的是本幀與前后幀的差別,換言之未斑,要解碼B幀咕宿,不僅要取得之前的緩存畫(huà)面,還要解碼之后的畫(huà)面,通過(guò)前后畫(huà)面的與本幀數(shù)據(jù)的疊加取得最終的畫(huà)面府阀。B幀壓縮率高缆镣,但是解碼時(shí)CPU會(huì)比較累~。
PTS:Presentation Time Stamp试浙。PTS主要用于度量解碼后的視頻幀什么時(shí)候被顯示出來(lái)
DTS:Decode Time Stamp董瞻。DTS主要是標(biāo)識(shí)讀入內(nèi)存中的bit流在什么時(shí)候開(kāi)始送入解碼器中進(jìn)行解碼。
DTS主要用于視頻的解碼,在解碼階段使用.PTS主要用于視頻的同步和輸出.在display的時(shí)候使用.在沒(méi)有B frame的情況下.DTS和PTS的輸出順序是一樣的.
GOP
兩個(gè)I frame之間形成一個(gè)GOP田巴,在x264中同時(shí)可以通過(guò)參數(shù)來(lái)設(shè)定bf的大小钠糊,即:I 和p或者兩個(gè)P之間B的數(shù)量。如果有B frame 存在的情況下一個(gè)GOP的最后一個(gè)frame一定是P.
一般平均來(lái)說(shuō)壹哺,I的壓縮率是7(跟JPG差不多)抄伍,P是20,B可以達(dá)到50管宵,可見(jiàn)使用B幀能節(jié)省大量空間截珍,節(jié)省出來(lái)的空間可以用來(lái)保存多一些I幀,這樣在相同碼率下箩朴,可以提供更好的畫(huà)質(zhì)岗喉。在碼率不變的前提下,GOP值越大隧饼,P沈堡、B幀的數(shù)量會(huì)越多,平均每個(gè)I燕雁、P、B幀所占用的字節(jié)數(shù)就越多鲸拥,也就更容易獲取較好的圖像質(zhì)量拐格;Reference越大,B幀的數(shù)量越多刑赶,同理也更容易獲得較好的圖像質(zhì)量捏浊。
如果一個(gè)GOP里面丟了I幀,那么后面的P幀撞叨、B幀也將會(huì)無(wú)用武之地金踪,因此必須丟掉,但是一般策略會(huì)保證I幀不丟(如通過(guò)tcp協(xié)議保證) 牵敷,如果采用UDP胡岔,那么也會(huì)有更多的策略來(lái)保證I幀正確傳輸。
編解碼
硬編解碼
通過(guò)硬件實(shí)現(xiàn)編解碼枷餐,減輕CPU計(jì)算的負(fù)擔(dān)靶瘸,如GPU等
軟編解碼
如 H264、H265、MPEG-4等編解碼算法怨咪,更消耗CPU
數(shù)據(jù)優(yōu)化
數(shù)據(jù)優(yōu)化和編解碼算法息息相關(guān)屋剑,一般而言
視頻幀大小
一般I 幀的壓縮率是7,P 幀是20诗眨,B 幀可以達(dá)到50 (數(shù)據(jù)不精確)
P幀大概是3~4KB (480P, 1200k碼率, baseline profile)
音頻幀大小
(采樣頻率(Hz)* 采樣位數(shù)(bit)* 聲道數(shù))/ 8
48000hz大概經(jīng)過(guò)AAC壓縮后唉匾,應(yīng)該是12KB/s左右
流媒體傳輸協(xié)議
常用的流媒體協(xié)議主要有 HTTP 漸進(jìn)下載和基于 RTSP/RTP 的實(shí)時(shí)流媒體協(xié)議,這二種基本是完全不同的東西
CDN直播中常用的流媒體協(xié)議包括RTMP匠楚,HLS巍膘,HTTP FLV
RTP,RTCP
實(shí)時(shí)傳輸協(xié)議(Real-time Transport Protocol)油啤,RTP協(xié)議常用于流媒體系統(tǒng)(配合RTCP協(xié)議)典徘,視頻會(huì)議和一鍵通系統(tǒng)(配合H.323或SIP),使它成為IP電話產(chǎn)業(yè)的技術(shù)基礎(chǔ)益咬。RTP協(xié)議和RTP控制協(xié)議RTCP一起使用逮诲,而且它是建立在UDP協(xié)議上的。
實(shí)時(shí)傳輸控制協(xié)議(Real-time Transport Control Protocol或RTP Control Protocol或簡(jiǎn)寫(xiě)RTCP)是實(shí)時(shí)傳輸協(xié)議的一個(gè)姐妹協(xié)議幽告。RTCP為RTP媒體流提供信道外控制梅鹦。RTCP本身并不傳輸數(shù)據(jù),但和RTP一起協(xié)作將多媒體數(shù)據(jù)打包和發(fā)送冗锁。RTCP定期在流多媒體會(huì)話參加者之間傳輸控制數(shù)據(jù)齐唆。RTCP的主要功能是為RTP所提供的服務(wù)質(zhì)量提供反饋。
RTSP+RTP經(jīng)常用于IPTV領(lǐng)域冻河。因?yàn)槠洳捎肬DP傳輸視音頻箍邮,支持組播,效率較高叨叙。但其缺點(diǎn)是網(wǎng)絡(luò)不好的情況下可能會(huì)丟包锭弊,影響視頻觀看質(zhì)量。
小結(jié)
RTMP
RTMP(Real Time Messaging Protocol)實(shí)時(shí)消息傳送協(xié)議是Adobe Systems公司為Flash播放器和服務(wù)器之間音頻擂错、視頻和數(shù)據(jù)傳輸 開(kāi)發(fā)的開(kāi)放協(xié)議味滞。
它有三種變種:
工作在TCP之上的明文協(xié)議,使用端口1935钮呀;
RTMPT封裝在HTTP請(qǐng)求之中剑鞍,可穿越防火墻;
RTMPS類(lèi)似RTMPT爽醋,但使用的是HTTPS連接蚁署;
總結(jié): RTMP協(xié)議基于TCP來(lái)實(shí)現(xiàn),每個(gè)時(shí)刻的數(shù)據(jù)子房,收到后立刻轉(zhuǎn)發(fā)形用,一般延遲在1-3s左右
HLS
HTTP Live Streaming(HLS)是蘋(píng)果公司(Apple Inc.)實(shí)現(xiàn)的基于HTTP的流媒體傳輸協(xié)議就轧,可實(shí)現(xiàn)流媒體的直播和點(diǎn)播。HLS點(diǎn)播田度,基本上就是常見(jiàn)的分段HTTP點(diǎn)播妒御,不同在于,它的分段非常小镇饺『趵颍基本原理就是將視頻或流切分成小片(TS), 并建立索引(M3U8).
相對(duì)于常見(jiàn)的流媒體直播協(xié)議奸笤,例如RTMP協(xié)議惋啃、RTSP協(xié)議、MMS協(xié)議等监右,HLS直播最大的不同在于边灭,直播客戶端獲取到的,并不是一個(gè)完整的數(shù)據(jù)流健盒。HLS協(xié)議在服務(wù)器端將直播數(shù)據(jù)流存儲(chǔ)為連續(xù)的绒瘦、很短時(shí)長(zhǎng)的媒體文件(MPEG-TS格式),而客戶端則不斷的下載并播放這些小文件扣癣,因?yàn)榉?wù)器端總是會(huì)將最新的直播數(shù)據(jù)生成新的小文件惰帽,這樣客戶端只要不停的按順序播放從服務(wù)器獲取到的文件,就實(shí)現(xiàn)了直播父虑。由此可見(jiàn)该酗,基本上可以認(rèn)為,HLS是以點(diǎn)播的技術(shù)方式來(lái)實(shí)現(xiàn)直播士嚎。由于數(shù)據(jù)通過(guò)HTTP協(xié)議傳輸呜魄,所以完全不用考慮防火墻或者代理的問(wèn)題,而且分段文件的時(shí)長(zhǎng)很短莱衩,客戶端可以很快的選擇和切換碼率耕赘,以適應(yīng)不同帶寬條件下的播放。不過(guò)HLS的這種技術(shù)特點(diǎn)膳殷,決定了它的延遲一般總是會(huì)高于普通的流媒體直播協(xié)議。
總結(jié): HLS協(xié)議基于HTTP短連接來(lái)實(shí)現(xiàn)九火,集合一段時(shí)間數(shù)據(jù)赚窃,生成ts切片文件,然后更新m3u8(HTTP Live Streaming直播的索引文件)岔激,一般延遲會(huì)大于10s
HTTP-FLV
HTTP-FLV基于HTTP長(zhǎng)連接勒极,通RTMP一樣,每個(gè)時(shí)刻的數(shù)據(jù)虑鼎,收到后立刻轉(zhuǎn)發(fā)辱匿,只不過(guò)使用的是HTTP協(xié)議键痛,一般延遲在1-3s
CDN
CDN架構(gòu)設(shè)計(jì)比較復(fù)雜。不同的CDN廠商匾七,也在對(duì)其架構(gòu)進(jìn)行不斷的優(yōu)化絮短,所以架構(gòu)不能統(tǒng)一而論。這里只是對(duì)一些基本的架構(gòu)進(jìn)行簡(jiǎn)單的剖析昨忆。
CDN主要包含:源站丁频、緩存服務(wù)器、智能DNS邑贴、客戶端等幾個(gè)主要組成部分席里。
源站:是指發(fā)布內(nèi)容的原始站點(diǎn)。添加拢驾、刪除和更改網(wǎng)站的文件奖磁,都是在源站上進(jìn)行的;另外緩存服務(wù)器所抓取的對(duì)象也全部來(lái)自于源站繁疤。對(duì)于直播來(lái)說(shuō)咖为,源站為主播客戶端。
緩存服務(wù)器:是直接提供給用戶訪問(wèn)的站點(diǎn)資源嵌洼,由一臺(tái)或數(shù)臺(tái)服務(wù)器組成案疲;當(dāng)用戶發(fā)起訪問(wèn)時(shí),他的訪問(wèn)請(qǐng)求被智能DNS定位到離他較近的緩存服務(wù)器麻养。如果用戶所請(qǐng)求的內(nèi)容剛好在緩存里面褐啡,則直接把內(nèi)容返還給用戶;如果訪問(wèn)所需的內(nèi)容沒(méi)有被緩存鳖昌,則緩存服務(wù)器向鄰近的緩存服務(wù)器或直接向源站抓取內(nèi)容备畦,然后再返還給用戶。
智能DNS:是整個(gè)CDN技術(shù)的核心许昨,它主要根據(jù)用戶的來(lái)源懂盐,以及當(dāng)前緩存服務(wù)器的負(fù)載情況等,將其訪問(wèn)請(qǐng)求指向離用戶比較近且負(fù)載較小的緩存服務(wù)器糕档。通過(guò)智能DNS解析莉恼,讓用戶訪問(wèn)同服務(wù)商下、負(fù)載較小的服務(wù)器速那,可以消除網(wǎng)絡(luò)訪問(wèn)慢的問(wèn)題俐银,達(dá)到加速作用。
客戶端:即發(fā)起訪問(wèn)的普通用戶端仰。對(duì)于直播來(lái)說(shuō)捶惜,就是觀眾客戶端。
弱網(wǎng)優(yōu)化
弱網(wǎng)優(yōu)化的策略包括如下:
播放器Buffer
丟幀策略 (優(yōu)先丟P幀荔烧,其次I幀吱七,最后音頻)
自適應(yīng)碼率算法
雙向鏈路優(yōu)化
音頻FEC冗余算法(20%丟包率)
丟幀
在弱網(wǎng)情況下汽久,為了達(dá)到更好的體驗(yàn),可能會(huì)采取丟幀的策略踊餐,但是丟幀景醇,怎么丟呢?丟音頻幀還是視頻幀呢 市袖? 因?yàn)橐曨l幀比較大啡直,并且視頻幀前后是有關(guān)聯(lián)的;音頻幀很小苍碟,關(guān)鍵是音頻幀是連續(xù)采樣的酒觅,丟了音頻幀,那聲音就會(huì)明顯出現(xiàn)瑕疵微峰。為此舷丹,一般的丟幀策略是丟視頻幀
自適應(yīng)碼率
在弱網(wǎng)情況下,另外一種靠譜的策略是自適應(yīng)碼率算法蜓肆,通過(guò)設(shè)置碼率降級(jí)為多個(gè)檔次颜凯,這樣,當(dāng)網(wǎng)絡(luò)不好的情況下仗扬,通過(guò)降低碼率進(jìn)行預(yù)測(cè)症概,如果碼率降低后,還不夠buffer緩沖早芭,那么繼續(xù)降低一個(gè)檔次彼城,是一個(gè)循環(huán)探測(cè)的過(guò)程,如果再次降級(jí)一個(gè)檔次后退个,發(fā)現(xiàn)buffer緩沖足夠了募壕,那么說(shuō)明當(dāng)前網(wǎng)絡(luò)能夠適應(yīng)這個(gè)碼率,因此就會(huì)采取當(dāng)前碼率语盈。同理舱馅,升檔也是一樣的。但是這個(gè)屬于廠商的核心算法刀荒,
實(shí)時(shí)聊天的挑戰(zhàn)
簡(jiǎn)單估算一下大概的網(wǎng)絡(luò)延時(shí)代嗤。眾所周知,光在真空中的速度約為300,000km/s缠借,而在其他介質(zhì)中光 速會(huì)大大降低资溃,所以在普通光纖中,工程上一般認(rèn)為傳輸速度是200,000km/s烈炭。從現(xiàn)實(shí)上來(lái)說(shuō),可以參考如下:
實(shí)時(shí)聊天的挑戰(zhàn)主要在于以下幾點(diǎn):
實(shí)時(shí)性: 600ms以內(nèi)
網(wǎng)絡(luò)的不對(duì)稱性
距離
常見(jiàn)問(wèn)題和解決方案
出現(xiàn)花屏宝恶、綠屏問(wèn)題
采集問(wèn)題符隙、編解碼問(wèn)題趴捅、聲網(wǎng)傳輸丟幀問(wèn)題
聲畫(huà)不同步
采集問(wèn)題,或者公有云SDK問(wèn)題
畫(huà)面有時(shí)候有點(diǎn)糊
弱網(wǎng)霹疫,碼率的自適應(yīng)
有聲音沒(méi)有畫(huà)面
弱網(wǎng)拱绑,觸發(fā)了丟幀策略
畫(huà)面播放有時(shí)候卡頓
CPU消耗過(guò)高導(dǎo)致卡頓,比如AR模塊
弱網(wǎng)
網(wǎng)絡(luò)連接不上
弱網(wǎng)
或者代碼有Bug丽蝎,或者公有云SDK有Bug
出現(xiàn)馬賽克現(xiàn)象猎拨?
是否類(lèi)似花屏 ?
TODO
其他常見(jiàn)指標(biāo) 和 問(wèn)題解決方案