《視頻直播技術(shù)詳解》系列課程:編碼和封裝
視頻編碼的意義
原始視頻數(shù)據(jù)存儲空間大,一個 1080P 的 7 s 視頻需要 817 MB
原始視頻數(shù)據(jù)傳輸占用帶寬大,10 Mbps 的帶寬傳輸上述 7 s 視頻需要 11 分鐘
而經(jīng)過 H.264 編碼壓縮之后,視頻大小只有 708 k ,10 Mbps?的帶寬僅僅需要 500 ms ,可以滿足實時傳輸?shù)男枨螅詮囊曨l采集傳感器采集來的原始視頻勢必要經(jīng)過視頻編碼。
基本原理
那為什么巨大的原始視頻可以編碼成很小的視頻呢?這其中的技術(shù)是什么呢?核心思想就是去除冗余信息:
空間冗余:圖像相鄰像素之間有較強的相關(guān)性
時間冗余:視頻序列的相鄰圖像之間內(nèi)容相似
編碼冗余:不同像素值出現(xiàn)的概率不同
視覺冗余:人的視覺系統(tǒng)對某些細(xì)節(jié)不敏感
知識冗余:規(guī)律性的結(jié)構(gòu)可由先驗知識和背景知識得到
視頻本質(zhì)上講是一系列圖片連續(xù)快速的播放,最簡單的壓縮方式就是對每一幀圖片進行壓縮,例如比較古老的 MJPEG 編碼就是這種編碼方式,這種編碼方式只有幀內(nèi)編碼,利用空間上的取樣預(yù)測來編碼。形象的比喻就是把每幀都作為一張圖片,采用 JPEG 的編碼格式對圖片進行壓縮,這種編碼只考慮了一張圖片內(nèi)的冗余信息壓縮,如圖 1,綠色的部分就是當(dāng)前待編碼的區(qū)域,灰色就是尚未編碼的區(qū)域,綠色區(qū)域可以根據(jù)已經(jīng)編碼的部分進行預(yù)測(綠色的左邊,下邊,左下等)。
但是幀和幀之間因為時間的相關(guān)性,后續(xù)開發(fā)出了一些比較高級的編碼器可以采用幀間編碼,簡單點說就是通過搜索算法選定了幀上的某些區(qū)域,然后通過計算當(dāng)前幀和前后參考幀的向量差進行編碼的一種形式,通過下面兩個圖 2 連續(xù)幀我們可以看到,滑雪的同學(xué)是向前位移的,但實際上是雪景在向后位移,P 幀通過參考幀(I 或其他 P 幀)就可以進行編碼了,編碼之后的大小非常小,壓縮比非常高。
可能有同學(xué)對這兩張圖片怎么來的感興趣,這里用了 FFmpeg 的兩行命令來實現(xiàn),具體 FFmpeg 的更多內(nèi)容請看后續(xù)章節(jié):
第一行生成帶有移動矢量的視頻
第二行把每一幀都輸出成圖片
ffmpeg??-flags2?+export_mvs?-i?tutu.mp4?-vf?codecview=mv=pf+bf+bb?tutudebug2.mp4 ffmpeg?-i?tutudebug2.mp4?'tutunormal-%03d.bmp'
除了空間冗余和時間冗余的壓縮,主要還有編碼壓縮和視覺壓縮,下面是一個編碼器主要的流程圖:
圖 3、圖 4 兩個流程,圖 3 是幀內(nèi)編碼,圖 4 是幀間編碼,從圖上看到的主要區(qū)別就是第一步不相同,其實這兩個流程也是結(jié)合在一起的,我們通常說的 I 幀和 P 幀就是分別采用了幀內(nèi)編碼和幀間編碼。
編碼器的選擇
前面梳理了一下編碼器的原理和基本流程,編碼器經(jīng)歷了數(shù)十年的發(fā)展,已經(jīng)從開始的只支持幀內(nèi)編碼演進到現(xiàn)如今的 H.265 和 VP9 為代表的新一代編碼器,就目前一些常見的編碼器進行分析,帶大家探索一下編碼器的世界。
1) H.264 簡介
H.264/AVC 項目意圖創(chuàng)建一種視頻標(biāo)準(zhǔn)。與舊標(biāo)準(zhǔn)相比,它能夠在更低帶寬下提供優(yōu)質(zhì)視頻(換言之,只有 MPEG-2,H.263 或 MPEG-4 第 2 部分的一半帶寬或更少),也不增加太多設(shè)計復(fù)雜度使得無法實現(xiàn)或?qū)崿F(xiàn)成本過高。另一目的是提供足夠的靈活性以在各種應(yīng)用、網(wǎng)絡(luò)及系統(tǒng)中使用,包括高、低帶寬,高、低視頻分辨率,廣播,DVD 存儲,RTP/IP 網(wǎng)絡(luò),以及 ITU-T 多媒體電話系統(tǒng)。
H.264/AVC 包含了一系列新的特征,使得它比起以前的編解碼器不但能夠更有效的進行編碼,還能在各種網(wǎng)絡(luò)環(huán)境下的應(yīng)用中使用。這樣的技術(shù)基礎(chǔ)讓 H.264 成為包括 YouTube 在內(nèi)的在線視頻公司采用它作為主要的編解碼器,但是使用它并不是一件很輕松的事情,理論上講使用 H.264 需要交納不菲的專利費用。
專利許可
和 MPEG-2 第一部分、第二部分,MPEG-4 第二部分一樣,使用 H.264/AVC 的產(chǎn)品制造商和服務(wù)提供商需要向他們的產(chǎn)品所使用的專利的持有者支付專利許可費用。這些專利許可的主要來源是一家稱為 MPEG-LA LLC 的私有組織,該組織和 MPEG 標(biāo)準(zhǔn)化組織沒有任何關(guān)系,但是該組織也管理著 MPEG-2 第一部分系統(tǒng)、第二部分視頻、MPEG-4 第二部分視頻和其它一些技術(shù)的專利許可。
其他的專利許可則需要向另一家稱為 VIA Licensing 的私有組織申請,這家公司另外也管理偏向音頻壓縮的標(biāo)準(zhǔn)如 MPEG-2 AAC 及 MPEG-4 Audio 的專利許可。
H.264 的開源實現(xiàn):OpenH264、x264
OpenH264 是思科實現(xiàn)的開源 H.264 編碼,雖然 H.264 需要交納不菲的專利費用,但是專利費有一個年度上限,思科把 OpenH264 實現(xiàn)的年度專利費交滿后,OpenH264 事實上就可以免費自由的使用了。
x264 是一個采用 GPL 授權(quán)的視頻編碼自由軟件。x264 的主要功能在于進行 H.264/MPEG-4 AVC 的視頻編碼,而不是作為解碼器(decoder)之用。
除去費用問題比較來看:
OpenH264 CPU 的占用相對 x264低很多
OpenH264 只支持 baseline profile,x264 支持更多 profile
2) HEVC/H.265 簡介
高效率視頻編碼(High Efficiency Video Coding,簡稱 HEVC)是一種視頻壓縮標(biāo)準(zhǔn),被視為是 ITU-T H.264/MPEG-4 AVC 標(biāo)準(zhǔn)的繼任者。2004 年開始由 ISO/IEC Moving Picture Experts Group(MPEG)和 ITU-T Video Coding Experts Group(VCEG)作為 ISO/IEC 23008-2 MPEG-H Part 2 或稱作 ITU-T H.265 開始制定。第一版的 HEVC/H.265 視頻壓縮標(biāo)準(zhǔn)在 2013 年 4 月 13 日被接受為國際電信聯(lián)盟(ITU-T)的正式標(biāo)準(zhǔn)。HEVC 被認(rèn)為不僅提升視頻質(zhì)量,同時也能達到 H.264/MPEG-4 AVC 兩倍之壓縮率(等同于同樣畫面質(zhì)量下比特率減少了 50%),可支持 4K 分辨率甚至到超高清電視(UHDTV),最高分辨率可達到 8192×4320(8K 分辨率)。
專利許可
HEVC Advance 要求所有包括蘋果、YouTube、Netflix、Facebook、亞馬遜等使用 H.265 技術(shù)的內(nèi)容制造商上繳內(nèi)容收入的 0.5%作為技術(shù)使用費,而整個流媒體市場每年達到約 1000 億美元的規(guī)模,且不斷增長中,征收 0.5%絕對是一筆龐大的費用。而且他們還沒有放過設(shè)備制造商,其中電視廠商需要支付每臺 1.5 美元、移動設(shè)備廠商每臺 0.8 美元的專利費。他們甚至沒有放過藍(lán)光設(shè)備播放器、游戲機、錄像機這樣的廠商,這些廠商必須支付每臺 1.1 美元的費用。最無法令人接受的是,HEVC Advance 的專利使用權(quán)追溯到了廠商的「」”,意思是之前已經(jīng)發(fā)售的產(chǎn)品依然要追繳費用。
H.265 的開源實現(xiàn):libde265、x265
libde265?HEVC 由 struktur 公司以開源許可證 GNU LesserGeneral Public License (LGPL) 提供,觀眾可以較慢的網(wǎng)速下欣賞到最高品質(zhì)的影像。跟以前基于H.264標(biāo)準(zhǔn)的解碼器相比,libde265 HEVC 解碼器可以將您的全高清內(nèi)容帶給多達兩倍的受眾,或者,減少 50%流媒體播放所需要的帶寬。高清或者 4K/8K 超高清流媒體播放,低延遲/低帶寬視頻會議,以及完整的移動設(shè)備覆蓋。具有「擁塞感知」視頻編碼的穩(wěn)定性,十分適合應(yīng)用在 3/4G 和 LTE 網(wǎng)絡(luò)。
x265?是由 MulticoreWare 開發(fā),并開源。采用 GPL 協(xié)議,但是資助這個項目的幾個公司組成了聯(lián)盟可以在非 GPL 協(xié)議下使用這個軟件。
3) VP8 簡介
VP8 是一個開放的視頻壓縮格式,最早由 On2 Technologies 開發(fā),隨后由 Google 發(fā)布。同時 Google 也發(fā)布了 VP8 編碼的實做庫:libvpx,以 BSD 授權(quán)條款的方式發(fā)行,隨后也附加了專利使用權(quán)。而在經(jīng)過一些爭論之后,最終 VP8 的授權(quán)確認(rèn)為一個開放源代碼授權(quán)。
目前支持 VP8 的網(wǎng)頁瀏覽器有 Opera、Firefox 和 Chrome。
專利許可
2013 年三月,Google 與 MPEG LA 及 11 個專利持有者達成協(xié)議,讓 Google 獲取 VP8 以及其之前的 VPx 等編碼所可能侵犯的專利授權(quán),同時 Google 也可以無償再次授權(quán)相關(guān)專利給 VP8 的用戶,此協(xié)議同時適用于下一代 VPx 編碼。至此 MPEG LA 放棄成立 VP8 專利集中授權(quán)聯(lián)盟,VP8 的用戶將可確定無償使用此編碼而無須擔(dān)心可能的專利侵權(quán)授權(quán)金的問題。
VP8 的開源實現(xiàn):libvpx
libvpx?是 VP8 的唯一開源實現(xiàn),由 On2 Technologies 開發(fā),Google 收購后將其開放源碼,License 非常寬松可以自由使用。
4) VP9 簡介
VP9 的開發(fā)從 2011 年第三季開始,目標(biāo)是在同畫質(zhì)下,比 VP8 編碼減少 50% 的文件大小,另一個目標(biāo)則是要在編碼效率上超越 HEVC 編碼。
2012 年 12 月 13 日,Chromium 瀏覽器加入了 VP9 編碼的支持。Chrome 瀏覽器則是在 2013 年 2 月 21 日開始支持 VP9 編碼的視頻播放。
Google 宣布會在 2013 年 6 月 17 日完成 VP9 編碼的制定工作,屆時 Chrome 瀏覽器將會把 VP9 編碼默認(rèn)引導(dǎo)。2014 年 3 月 18 日,Mozilla 在 Firefox 瀏覽器中加入了 VP9 的支持。
2015 年 4 月 3 日,谷歌發(fā)布了libvpx1.4.0 增加了對 10 位和 12 位的比特深度支持、4:2:2 和 4:4:4 色度抽樣,并 VP9 多核心編/解碼。
專利許可
VP9 是一個開放格式、無權(quán)利金的視頻編碼格式。
VP9 的開源實現(xiàn):ibvpx
libvpx?是 VP9 的唯一開源實現(xiàn),由 Google 開發(fā)維護,里面有部分代碼是 VP8 和 VP9 公用的,其余分別是 VP8 和 VP9 的編解碼實現(xiàn)。
VP9 和 H.264 和 HEVC 比較
HEVC 和 H.264 在不同分辨率下的比較
跟 H.264/MPEG-4 相比,HEVC 的平均比特率減低值為:
可見碼率下降了 60% 以上。
HEVC (H.265) 對 VP9 和 H.264 在碼率節(jié)省上有較大的優(yōu)勢,在相同 PSNR 下分別節(jié)省了 48.3% 和 75.8%。
H.264 在編碼時間上有巨大優(yōu)勢,對比 VP9 和 HEVC(H.265) ,HEVC 是 VP9 的 6 倍,VP9 是 H.264 的將近 40 倍
5) FFmpeg
談到視頻編碼相關(guān)內(nèi)容就不得不提一個偉大的軟件包 - FFmpeg。
FFmpeg 是一個自由軟件,可以運行音頻和視頻多種格式的錄影、轉(zhuǎn)換、流功能,包含了 libavcodec -這是一個用于多個項目中音頻和視頻的解碼器庫,以及 libavformat -一個音頻與視頻格式轉(zhuǎn)換庫。
FFmpeg 這個單詞中的 FF 指的是 Fast Forward。有些新手寫信給?FFmpeg?的項目負(fù)責(zé)人,詢問 FF 是不是代表 Fast Free 或者 Fast Fourier 等意思,F(xiàn)Fmpeg??的項目負(fù)責(zé)人回信說:「Just for the record, the original meaning of FF in FFmpeg is Fast Forward.」
這個項目最初是由 Fabrice Bellard 發(fā)起的,而現(xiàn)在是由 Michael Niedermayer 在進行維護。許多 FFmpeg 的開發(fā)者同時也是 MPlayer 項目的成員,F(xiàn)Fmpeg 在 MPlayer 項目中是被設(shè)計為服務(wù)器版本進行開發(fā)。
FFmpeg 下載地址是 :?https://ffmpeg.org/download.html
可以瀏覽器輸入下載,目前支持 Linux ,Mac OS,Windows 三個主流的平臺,也可以自己編譯到 Android 或者 iOS 平臺。
如果是 Mac OS ,可以通過 brew 安裝
?brew install ffmpeg --with-libvpx --with-libvorbis --with-ffplay
我們可以用 FFmpeg 來做哪些有用有好玩的事情呢?通過一系列小實驗來帶大家領(lǐng)略 FFmpeg 的神奇和強大。
FFmpeg 錄屏
通過一個小例子看一下怎么在 Mac OS 下面使用 FFmpeg 進行錄屏:
輸入:
ffmpeg?-f?avfoundation?-list_devices?true?-i?""
輸出:
[AVFoundation?input?device?@?0x7fbec0c10940]?AVFoundation?video?devices: [AVFoundation?input?device?@?0x7fbec0c10940]?[0]?FaceTime?HD?Camera [AVFoundation?input?device?@?0x7fbec0c10940]?[1]?Capture?screen?0 [AVFoundation?input?device?@?0x7fbec0c10940]?[2]?Capture?screen?1 [AVFoundation?input?device?@?0x7fbec0c10940]?AVFoundation?audio?devices: [AVFoundation?input?device?@?0x7fbec0c10940]?[0]?Built-in?Microphone
給出了當(dāng)前設(shè)備支持的所有輸入設(shè)備的列表和編號,我本地有兩塊顯示器,所以 1 和 2 都是我屏幕,可以選擇一塊進行錄屏。
查看當(dāng)前的 H.264 編解碼器:
輸入:
ffmpeg?-codecs?|?grep?264
輸出:
?DEV.LS?h264?????????????????H.264?/?AVC?/?MPEG-4?AVC?/?MPEG-4?part?10?(decoders:?h264?h264_vda?)?(encoders:?libx264?libx264rgb?)
查看當(dāng)前的 VP8 編解碼器:
輸入:
ffmpeg?-codecs?|?grep?vp8
輸出:
??DEV.L.?vp8??????????????????On2?VP8?(decoders:?vp8?libvpx?)?(encoders:?libvpx?)
可以選擇用 VP8 或者 H264 做編碼器
ffmpeg?-r?30?-f?avfoundation?-i?1?-vcodec?vp8?-quality?realtime?screen2.webm #?-quality?realtime?用來優(yōu)化編碼器,如果不加在我的?Air?上幀率只能達到?2
or
ffmpeg?-r?30?-f?avfoundation?-i?1?-vcodec?h264?screen.mp4
然后用 ffplay 播放就可以了
ffplay?screen.mp4
or
ffplay?screen2.webp
FFmpeg 視頻轉(zhuǎn)換成 gif
有一個特別有用的需求,在網(wǎng)上發(fā)現(xiàn)了一個特別有趣的視頻想把它轉(zhuǎn)換成一個動態(tài)表情,作為一個 IT 從業(yè)者,我第一個想到的不是下載一個轉(zhuǎn)碼器,也不是去找一個在線轉(zhuǎn)換網(wǎng)站,直接利用手邊的工具 FFmpeg,瞬間就完成了轉(zhuǎn)碼:
ffmpeg?-ss?10?-t?10??-i?tutu.mp4??-s?80x60??tutu.gif ##?-ss?指從?10s?開始轉(zhuǎn)碼,-t?指轉(zhuǎn)換?10s?的視頻?-s
FFmpeg 錄制屏幕并直播
可以繼續(xù)擴展例子1,直播當(dāng)前屏幕的內(nèi)容,向大家介紹一下怎么通過幾行命令搭建一個測試用的直播服務(wù):
Step 1:首先安裝 docker: 訪問?https://www.docker.com/products/docker?,按操作系統(tǒng)下載安裝。
<p style="clear:both;min-height:1em;color:rgb(62,62,62);font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, s