摘要:很顯然,一幀的視頻不可能進(jìn)行網(wǎng)絡(luò)傳輸,所以需要對這個文件進(jìn)行有損的壓縮,壓縮成的文件,這塊的壓縮比是。
說在前面的話
視頻對于前端工程師來講,真的是簡單到極點(diǎn),直接給一個視頻地址,然后賦值到video下面,搞定!對于普通的后臺工程師也很簡單,因?yàn)槲覀兙幊潭际菍γ恳粠M(jìn)行編程,不用關(guān)心視頻的怎么編碼、解碼、傳輸?shù)攘鞒蹋悄?,基礎(chǔ)這東西,有一句名言:**基礎(chǔ)就像眼鏡,用到時候才知道有多重要。
現(xiàn)實(shí)世界的原型第一個是30年前的放映機(jī),不知道大家見過沒有,一個非常大一卷的帶子,放到放映機(jī)上面,然后以每秒x張膠片的速度一張一張的播放
第二個是一個創(chuàng)意,在一個空筆記本上,畫上連續(xù)動物奔跑的圖,然后快速的翻閱,就能看到動物在奔跑,感覺像在放動畫片一樣
現(xiàn)實(shí)世界的這兩種視頻的表現(xiàn)形式都是一致的,就是每一幀都采用完整的一張圖,然后按照第秒20張的速度進(jìn)行播放,從而形成視頻
這種表現(xiàn)形式最直觀,但有一個比較嚴(yán)重的問題,就是體積太大了。你看第一種,要放一部電影,得需要非常大的一卷的帶子,非常不利用攜帶;第二種,要展示幾秒種的動畫,你可能得畫整整一本;放到數(shù)字世界里呢,假如我們存放一部無損、1小時、1080P電影,每秒20幀的速度,你需要的存儲空間大約為:6203600=421G
提幾個概念先編碼格式:既然文件那么大,肯定得壓縮,也就是對視頻進(jìn)行編碼和解碼,用哪種方式編解碼,就叫視頻的編碼格式。目前最流行的編碼格式是:H.264,還有其他的格式,如更加先進(jìn)的H.265和比較落后的H.263。
封裝格式:俗稱就是文件的格式,像我們看到.avi/.mp4/.mkv,這些都是封裝格式。因?yàn)槲覀兛吹揭曨l都是由聲音和圖像組成的,封裝格式就是把圖像和聲音組合到一起,比如我們把H.264編碼的視頻和AAC編碼的音頻封裝成.avi格式的視頻文件,也可以把H.265和AAC-3組合到一起,生成.mkv格式的文件等等組合的方式。
比特(bit)和字節(jié)(byte):這兩個概念我們平時經(jīng)常搞混,換算比較簡單:1byte=8bit。有一個比較重要的結(jié)論比特用于傳輸,字節(jié)用來存儲。舉個例子:如果服務(wù)器上存放著一個80M大小的文件,你家的網(wǎng)絡(luò)帶寬是80M,你說理論上是1秒就能把文件下載來你本地嗎?聰明的你,肯定猜到了,不是!因?yàn)橹庇X告訴我們,80M的網(wǎng)張帶寬,下載只有8M左右,所以需要10秒才能下載完,嘿嘿,大體上是這樣的,我們來計(jì)算一下啊。服務(wù)器存放著80Mbyte,注意:這里是byte,而你的帶寬80Mbit,注意:這里是bit,根據(jù)上面的換算公式,80Mbit=10Mbyte,所以,你的實(shí)際傳輸速度是10M/s,所以需要8秒,通過上面的例子,你就能更加深刻的理解那個結(jié)論了吧。
碼率:不太好總結(jié),還是看個例子吧。一個1G的視頻,100分鐘,它的碼率的算法是這樣的:1G=1x1024MBx8bit,100min=100minx60s=6000s,碼率=1024x8/6000~~1.4M/s。
視頻的產(chǎn)生流程攝像機(jī)采集完一幀圖像之后,會生成一個無損的.bmp文件格式的圖片文件,這個圖片是位圖,分8位、24位、32位,用win的話,可以用畫圖軟件隨便畫一個,然后你保存,默認(rèn)就是.bmp的格式,下面就會讓你選位數(shù),我們以1080P的圖像(24位)為例,算一個這個位圖的大?。?4+((1920*1080)x24)/8~~6M。54是圖片的頭信息,24是圖像的位數(shù),除以8是把bit轉(zhuǎn)成byte。很顯然,6M一幀的視頻不可能進(jìn)行網(wǎng)絡(luò)傳輸,所以需要對這個.bmp文件進(jìn)行有損的壓縮,壓縮成200KB的JPEG文件,這塊的壓縮比是1/30。
每一幀是200KB,很顯然也不利于網(wǎng)絡(luò)傳輸,咱們算一下碼率(以每秒20幀):(200x20x8)/ 1024 = 32M,也就是一對一傳輸,你家的網(wǎng)絡(luò)帶寬至少得32M才能勉強(qiáng)播放(一般的視頻的碼率都保持在2M以內(nèi))?,F(xiàn)在我們前面說的編碼格式:H.264就粉墨登場了。
編碼的基本原理拋開其他東西不談,我們也會發(fā)現(xiàn),視頻的連續(xù)幀之間的差別其他非常小,就像上面提的那個動畫書,沒有必要把每一幀都多帶帶生成圖片,只要記錄幀和幀之間的差別其實(shí)就可以了。咱們這么想,H.264編碼也是按這個思路來進(jìn)行壓縮的。這點(diǎn)和SVN比較類似,起初我們得提交一個原始文件,這個原始文件就相當(dāng)是I幀,也就是上面我們看到攝像機(jī)產(chǎn)生的那張200KB大小的JPEG文件,有了I幀之后,下一幀就可以以此幀進(jìn)行對比,生成差異文件,這個差異文件就是P幀,(這個P幀是通過H.264的運(yùn)動補(bǔ)償算法算出來的),依次類推,后面的幀都是前面幀的差異,直到下一個GOP的出現(xiàn)。恩?GOP是個什么鬼?GOP就是單位時間內(nèi)一組I幀和P帖組合,一般的設(shè)置是一個GOP為2秒,也就是在這個GOP中,只有一個I幀,其余都是P幀(其實(shí)還有B幀,這個后面說),那現(xiàn)在們我們得到另外一個結(jié)論:一個GOP中,只有加載出I幀,才能渲染出一段視頻,這個也好理解哈,沒有原始的對比文件,只有差異文件,是啥也渲染不出來的。
還有一種幀叫B幀,P幀我們上面已經(jīng)講清楚了,就和前一幀的差異,那B幀是雙向的差異,就是他即參考前一個幀,也參考后一個幀,這樣就帶來兩個好處:1.更高的壓縮比;2.更加快速的解碼能力。第二點(diǎn)還好理解些,雙向參考,解碼時可以進(jìn)行多線程解碼,而不像P幀一樣,要等待前一幀的結(jié)果。第一點(diǎn)好處,我查了很多資料也沒說清楚,只知其然,不知其所以然。
一些視頻現(xiàn)象的分析有了上面的基礎(chǔ)知識,我們就可以分析幾個我們使用視頻的時候經(jīng)常遇到的問題
馬賽克現(xiàn)象,我們先看這個圖:
從圖中我們能看出一些東西來,不是所有畫面都出馬了,只是一少部分的圖像出現(xiàn)了錯位。我們假設(shè)只有3幀,IPP,如果第一個P幀丟失,第二個P幀參考的是I幀,也就是P幀的運(yùn)動補(bǔ)償補(bǔ)償?shù)絀幀上,是不是就出現(xiàn)這樣的現(xiàn)象了。然后你會發(fā)現(xiàn),過一會這個馬又沒有了,是因?yàn)橐曨l是基于GOP的,一個GOP里(一般2秒),只有丟一幀(P幀或B幀),那么整個2秒的時間都會是馬賽克,再來一個GOP,如果這人GOP幀不丟失的情況,視頻自然就好。
卡頓:為了避免上面的現(xiàn)象,我們一般會設(shè)置,當(dāng)有一幀丟失的時候,我們會放棄整個的GOP,這樣,你的視頻就會出現(xiàn)Loading的狀態(tài),Loading時間決定了你丟的是哪一幀,如果是I幀,那么你得等2秒,如果你丟的是最后一幀,那么你得等1/20秒。
延遲:也許你會發(fā)現(xiàn),有的時候打開個視頻馬上就能看,有時候要等上一小會,這個也很好解釋。一個GOP是從I幀開始的,所以只有加載到第一個I幀時,才會開始播放視頻,我們還假定一個GOP是2秒,如果你運(yùn)氣好,正好取的GOP的I幀,那么就是秒開;如果你運(yùn)氣不好,你的網(wǎng)絡(luò)請求,正好是I幀后面的P幀,那么不好意思,你得2秒,等到下一個GOP來的時候,你才能開始播。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11025.html
摘要:和格式的瀏覽器兼容性移動端因?yàn)樘O果公司對的強(qiáng)烈抵制以及自己定的視頻協(xié)議,所以在端原生支持格式的視頻播放而不支持的播放,而且因?yàn)樘O果在移動端的領(lǐng)頭作用,所以其他移動端包括瀏覽器也都原生支持格式的視頻播放。 因?yàn)檎`打誤撞來到了淘寶直播團(tuán)隊(duì),從開始完全不了解直播技術(shù),現(xiàn)在因?yàn)閘eader暫時的離開,準(zhǔn)備接手h5播放器的迭代,就不得不開始了解相關(guān)的視頻技術(shù),先整理一下在直播技術(shù)中的視頻格式和不...
閱讀 3478·2021-11-18 10:02
閱讀 3725·2021-09-13 10:25
閱讀 1931·2021-07-26 23:38
閱讀 2585·2019-08-30 15:44
閱讀 2294·2019-08-30 13:51
閱讀 1239·2019-08-26 11:35
閱讀 2284·2019-08-26 10:29
閱讀 3457·2019-08-23 14:56