日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视频直播技术详解(3)编码和封装

發布時間:2025/7/25 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频直播技术详解(3)编码和封装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聲明:本文為CSDN原創投稿文章,未經許可,禁止任何形式的轉載。
作者:七牛云
責編:錢曙光,關注架構和算法領域,尋求報道或者投稿請發郵件qianshg@csdn.net,另有「CSDN 高級架構師群」,內有諸多知名互聯網公司的大牛架構師,歡迎架構師加微信qshuguang2008申請入群,備注姓名+公司+職位。


from: http://geek.csdn.net/news/detail/99498

七牛云于6月底發布了一個針對視頻直播的實時流網絡LiveNet和完整的直播云解決方案,很多開發者對這個網絡和解決方案的細節和使用場景非常感興趣。

結合該實時流網絡LiveNet和直播云解決方案的實踐,我們將用七篇文章,更系統化地介紹當下大熱的視頻直播各環節的關鍵技術,幫助視頻直播創業者們更全面、深入地了解視頻直播技術,更好地技術選型。

本系列文章大綱如下:

(一)采集
(二)處理
(三)編碼和封裝
(四)推流和傳輸
(五)現代播放器原理
(六)延遲優化
(七)SDK性能測試模型

在上一期的處理篇中,我們介紹了講解常見視頻處理功能如美顏、視頻水印、濾鏡、連麥等。 本篇是《解密視頻直播技術》系列之三:編碼和封裝。視頻編碼是本系列一個重要的部分,如果把整個流媒體比喻成一個物流系統,那么編解碼就是其中配貨和裝貨的過程,這個過程非常重要,它的速度和壓縮比對物流系統的意義非常大,影響物流系統的整體速度和成本。同樣,對流媒體傳輸來說,編碼也非常重要,它的編碼性能、編碼速度和編碼壓縮比會直接影響整個流媒體傳輸的用戶體驗和傳輸成本。

視頻編碼的意義

  • 原始視頻數據存儲空間大,一個1080P的7s視頻需要817MB
  • 原始視頻數據傳輸占用帶寬大,10Mbps的帶寬傳輸上述7s視頻需要11分鐘

而經過H.264編碼壓縮之后,視頻大小只有708k,10Mbps的帶寬僅僅需要500ms,可以滿足實時傳輸的需求,所以從視頻采集傳感器采集來的原始視頻勢必要經過視頻編碼。

基本原理

那為什么巨大的原始視頻可以編碼成很小的視頻呢?這其中的技術是什么呢?核心思想就是去除冗余信息:

  • 空間冗余:圖像相鄰像素之間有較強的相關性
  • 時間冗余:視頻序列的相鄰圖像之間內容相似
  • 編碼冗余:不同像素值出現的概率不同
  • 視覺冗余:人的視覺系統對某些細節不敏感
  • 知識冗余:規律性的結構可由先驗知識和背景知識得到

視頻本質上講是一系列圖片連續快速的播放,最簡單的壓縮方式就是對每一幀圖片進行壓縮,例如比較古老的MJPEG編碼就是這種編碼方式,這種編碼方式只有幀內編碼,利用空間上的取樣預測來編碼。形象的比喻就是把每幀都作為一張圖片,采用JPEG的編碼格式對圖片進行壓縮,這種編碼只考慮了一張圖片內的冗余信息壓縮,如圖1,綠色的部分就是當前待編碼的區域,灰色就是尚未編碼的區域,綠色區域可以根據已經編碼的部分進行預測(綠色的左邊,下邊,左下等)。

圖 1

但是幀和幀之間因為時間的相關性,后續開發出了一些比較高級的編碼器可以采用幀間編碼,簡單點說就是通過搜索算法選定了幀上的某些區域,然后通過計算當前幀和前后參考幀的向量差進行編碼的一種形式,通過下面兩個圖2連續幀我們可以看到,滑雪的同學是向前位移的,但實際上是雪景在向后位移,P幀通過參考幀(I或其他P幀)就可以進行編碼了,編碼之后的大小非常小,壓縮比非常高。

圖 2

可能有同學對這兩張圖片怎么來的感興趣,這里用了FFmpeg的兩行命令來實現,具體FFmpeg的更多內容請看后續章節:

  • 第一行生成帶有移動矢量的視頻
  • 第二行把每一幀都輸出成圖片
ffmpeg -flags2 +export_mvs -i tutu.mp4 -vf codecview=mv=pf+bf+bb tutudebug2.mp4 ffmpeg -i tutudebug2.mp4 'tutunormal-d.bmp'

除了空間冗余和時間冗余的壓縮,主要還有編碼壓縮和視覺壓縮,下面是一個編碼器主要的流程圖:


?

圖 3

圖 4

圖3、圖4兩個流程,圖3是幀內編碼,圖4是幀間編碼,從圖上看到的主要區別就是第一步不相同,其實這兩個流程也是結合在一起的,我們通常說的I幀和P幀就是分別采用了幀內編碼和幀間編碼。

編碼器的選擇

前面梳理了一下編碼器的原理和基本流程,編碼器經歷了數十年的發展,已經從開始的只支持幀內編碼演進到現如今的H.265和VP9為代表的新一代編碼器,就目前一些常見的編碼器進行分析,帶大家探索一下編碼器的世界。

1) H.264簡介

H.264/AVC項目意圖創建一種視頻標準。與舊標準相比,它能夠在更低帶寬下提供優質視頻(換言之,只有MPEG-2,H.263或MPEG-4第2部分的一半帶寬或更少),也不增加太多設計復雜度使得無法實現或實現成本過高。另一目的是提供足夠的靈活性以在各種應用、網絡及系統中使用,包括高、低帶寬,高、低視頻分辨率,廣播,DVD存儲,RTP/IP網絡,以及ITU-T多媒體電話系統。

H.264/AVC包含了一系列新的特征,使得它比起以前的編解碼器不但能夠更有效的進行編碼,還能在各種網絡環境下的應用中使用。這樣的技術基礎讓H.264成為包括YouTube在內的在線視頻公司采用它作為主要的編解碼器,但是使用它并不是一件很輕松的事情,理論上講使用H.264需要交納不菲的專利費用。

專利許可

和MPEG-2第一部分、第二部分,MPEG-4第二部分一樣,使用H.264/AVC的產品制造商和服務提供商需要向他們的產品所使用的專利的持有者支付專利許可費用。這些專利許可的主要來源是一家稱為MPEG-LA LLC的私有組織,該組織和MPEG標準化組織沒有任何關系,但是該組織也管理著MPEG-2第一部分系統、第二部分視頻、MPEG-4第二部分視頻和其它一些技術的專利許可。

其他的專利許可則需要向另一家稱為VIA Licensing的私有組織申請,這家公司另外也管理偏向音頻壓縮的標準如MPEG-2 AAC及MPEG-4 Audio的專利許可。

H.264的開源實現

  • OpenH264
  • x264

OpenH264是思科實現的開源H.264編碼,雖然H.264需要交納不菲的專利費用,但是專利費有一個年度上限,思科把OpenH264實現的年度專利費交滿后,OpenH264事實上就可以免費自由地使用了。

x264是一個采用GPL授權的視頻編碼自由軟件。x264的主要功能在于進行H.264/MPEG-4 AVC的視頻編碼,而不是作為解碼器(decoder)之用。

除去費用問題比較來看:

  • OpenH264CPU的占用相對x264低很多
  • OpenH264只支持baseline profile,x264支持更多profile

2) HEVC/H.265簡介

高效率視頻編碼(High Efficiency Video Coding,簡稱HEVC)是一種視頻壓縮標準,被視為是ITU-T H.264/MPEG-4 AVC標準的繼任者。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視頻壓縮標準在2013年4月13日被接受為國際電信聯盟(ITU-T)的正式標準。HEVC被認為不僅提升視頻質量,同時也能達到H.264/MPEG-4 AVC兩倍之壓縮率(等同于同樣畫面質量下比特率減少了50%),可支持4K分辨率甚至到超高清電視(UHDTV),最高分辨率可達到8192×4320(8K分辨率)。

H.265的開源實現

  • libde265
  • x265

libde265 HEVC由struktur公司以開源許可證GNU LesserGeneral Public License(LGPL)提供,觀眾可以較慢的網速下欣賞到最高品質的影像。跟以前基于H.264標準的解碼器相比,libde265 HEVC解碼器可以將您的全高清內容帶給多達兩倍的受眾,或者,減少50%流媒體播放所需要的帶寬。高清或者4K/8K超高清流媒體播放,低延遲/低帶寬視頻會議,以及完整的移動設備覆蓋。具有「擁塞感知」視頻編碼的穩定性,十分適合應用在3/4G和LTE網絡。

x265是由MulticoreWare開發,并開源。采用GPL協議,但是資助這個項目的幾個公司組成了聯盟可以在非GPL協議下使用這個軟件。

3) VP8簡介

VP8是一個開放的視頻壓縮格式,最早由On2 Technologies開發,隨后由Google發布。同時Google也發布了VP8編碼的實做庫:libvpx,以BSD授權條款的方式發行,隨后也附加了專利使用權。而在經過一些爭論之后,最終VP8的授權確認為一個開放源代碼授權。

目前支持VP8的網頁瀏覽器有Opera、Firefox和Chrome。

專利許可

2013年三月,Google與MPEG LA及11個專利持有者達成協議,讓Google獲取VP8以及其之前的VPx等編碼所可能侵犯的專利授權,同時Google也可以無償再次授權相關專利給VP8的用戶,此協議同時適用于下一代VPx編碼。至此MPEG LA放棄成立VP8專利集中授權聯盟,VP8的用戶將可確定無償使用此編碼而無須擔心可能的專利侵權授權金的問題。

VP8 的開源實現

  • libvpx

libvpx是VP8的唯一開源實現,由On2 Technologies開發,Google收購后將其開放源碼,License非常寬松可以自由使用。

4) VP9簡介

VP9的開發從2011年第三季開始,目標是在同畫質下,比VP8編碼減少50%的文件大小,另一個目標則是要在編碼效率上超越HEVC編碼。

2012年12月13日,Chromium瀏覽器加入了VP9編碼的支持。Chrome瀏覽器則是在2013年2月21日開始支持VP9編碼的視頻播放。

Google宣布會在2013年6月17日完成VP9編碼的制定工作,屆時Chrome瀏覽器將會把VP9編碼默認引導。2014年3月18日,Mozilla在Firefox瀏覽器中加入了VP9的支持。

2015年4月3日,谷歌發布了libvpx1.4.0增加了對10位和12位的比特深度支持、4:2:2和4:4:4色度抽樣,并VP9多核心編/解碼。

專利許可

VP9是一個開放格式、無權利金的視頻編碼格式。

VP9的開源實現

  • libvpx

libvpx是VP9的唯一開源實現,由Google開發維護,里面有部分代碼是VP8和VP9公用的,其余分別是VP8和VP9的編解碼實現。

VP9和H.264和HEVC比較

HEVC和H.264在不同分辨率下的比較

跟H.264/MPEG-4相比,HEVC的平均比特率減低值為:

可見碼率下降了60%以上。

  • HEVC(H.265)對VP9和H.264在碼率節省上有較大的優勢,在相同PSNR下分別節省了48.3%和75.8%。
  • H.264在編碼時間上有巨大優勢,對比VP9和HEVC(H.265),HEVC是VP9的6倍,VP9是H.264的將近40倍

5) FFmpeg

談到視頻編碼相關內容就不得不提一個偉大的軟件包——FFmpeg。

FFmpeg是一個自由軟件,可以運行音頻和視頻多種格式的錄影、轉換、流功能,包含了libavcodec——這是一個用于多個項目中音頻和視頻的解碼器庫,以及libavformat——一個音頻與視頻格式轉換庫。

FFmpeg這個單詞中的FF指的是Fast Forward。有些新手寫信給FFmpeg的項目負責人,詢問FF是不是代表Fast Free或者Fast Fourier等意思,FFmpeg的項目負責人回信說:「Just for the record, the original meaning of FF in FFmpeg is Fast Forward.」

這個項目最初是由Fabrice Bellard發起的,而現在是由Michael Niedermayer在進行維護。許多FFmpeg的開發者同時也是MPlayer項目的成員,FFmpeg在MPlayer項目中是被設計為服務器版本進行開發。

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來做哪些有用有好玩的事情呢?通過一系列小實驗來帶大家領略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

給出了當前設備支持的所有輸入設備的列表和編號,我本地有兩塊顯示器,所以1和2都是我屏幕,可以選擇一塊進行錄屏。

查看當前的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 )

查看當前的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 用來優化編碼器,如果不加在我的 Air 上幀率只能達到 2

or

ffmpeg -r 30 -f avfoundation -i 1 -vcodec h264 screen.mp4

然后用ffplay播放就可以了

ffplay screen.mp4

or

ffplay screen2.webp

FFmpeg視頻轉換成gif

有一個特別有用的需求,在網上發現了一個特別有趣的視頻想把她轉換成一個動態表情,作為一個IT從業者,我第一個想到的不是下載一個轉碼器,也不是去找一個在線轉換網站,直接利用手邊的工具FFmpeg,瞬間就完成了轉碼:

ffmpeg -ss 10 -t 10 -i tutu.mp4 -s 80x60 tutu.gif ## -ss 指從 10s 開始轉碼,-t 指轉換 10s 的視頻 -s

FFmpeg錄制屏幕并直播

可以繼續擴展例子1,直播當前屏幕的內容,向大家介紹一下怎么通過幾行命令搭建一個測試用的直播服務:

Step 1:首先安裝docker:訪問https://www.docker.com/products/docker,按操作系統下載安裝。

Step 2:下載nginx-rtmp鏡像:

docker pull chakkritte/docker-nginx-rtmp

Step 3:創建nginx html路徑,啟動docker-nginx-rtmp:

mkdir ~/rtmp docker run -d -p 80:80 -p 1935:1935 -v ~/rtmp:/usr/local/nginx/html chakkritte/docker-nginx-rtmp

Step 4:推送屏幕錄制到nignx-rtmp:

ffmpeg -y -loglevel warning -f avfoundation -i 2 -r 30 -s 480x320 -threads 2 -vcodec libx264 -f flv rtmp://127.0.0.1/live/test

Step 5:用FFplay播放:

ffplay rtmp://127.0.0.1/live/test

總結一下,FFmpeg是個優秀的工具,可以通過它完成很多日常的工作和實驗,但是距離提供真正可用的流媒體服務、直播服務還有非常多的工作要做,這方面可以參考七牛云發布的七牛直播云服務。

封裝

介紹完了視頻編碼后,再來介紹一些封裝。沿用前面的比喻,封裝可以理解為采用哪種貨車去運輸,也就是媒體的容器。

所謂容器,就是把編碼器生成的多媒體內容(視頻,音頻,字幕,章節信息等)混合封裝在一起的標準。容器使得不同多媒體內容同步播放變得很簡單,而容器的另一個作用就是為多媒體內容提供索引,也就是說如果沒有容器存在的話一部影片你只能從一開始看到最后,不能拖動進度條(當然這種情況下有的播放器會話比較長的時間臨時創建索引),而且如果你不自己去手動另外載入音頻就沒有聲音,下面介紹幾種常見的封裝格式和優缺點:

1)AVI格式(后綴為.avi):它的英文全稱為Audio Video Interleaved,即音頻視頻交錯格式。它于1992年被Microsoft公司推出。這種視頻格式的優點是圖像質量好。由于無損AVI可以保存alpha通道,經常被我們使用。缺點太多,體積過于龐大,而且更加糟糕的是壓縮標準不統一,最普遍的現象就是高版本Windows媒體播放器播放不了采用早期編碼編輯的AVI格式視頻,而低版本Windows媒體播放器又播放不了采用最新編碼編輯的AVI格式視頻,所以我們在進行一些AVI格式的視頻播放時常會出現由于視頻編碼問題而造成的視頻不能播放或即使能夠播放,但存在不能調節播放進度和播放時只有聲音沒有圖像等一些莫名其妙的問題。

2)DV-AVI格式(后綴為.avi):DV的英文全稱是Digital Video Format,是由索尼、松下、JVC等多家廠商聯合提出的一種家用數字視頻格式。數字攝像機就是使用這種格式記錄視頻數據的。它可以通過電腦的IEEE 1394端口傳輸視頻數據到電腦,也可以將電腦中編輯好的的視頻數據回錄到數碼攝像機中。這種視頻格式的文件擴展名也是AVI。電視臺采用錄像帶記錄模擬信號,通過EDIUS由IEEE 1394端口采集卡從錄像帶中采集出來的視頻就是這種格式。

3)QuickTime File Format格式(后綴為.mov):美國Apple公司開發的一種視頻格式,默認的播放器是蘋果的QuickTime。具有較高的壓縮比率和較完美的視頻清晰度等特點,并可以保存alpha通道。

4)MPEG格式(文件后綴可以是.mpg、.mpeg、.mpe、.dat、.vob、.asf、.3gp、.mp4等):它的英文全稱為Moving Picture Experts Group,即運動圖像專家組格式,該專家組建于1988年,專門負責為CD建立視頻和音頻標準,而成員都是為視頻、音頻及系統領域的技術專家。MPEG文件格式是運動圖像壓縮算法的國際標準。MPEG格式目前有三個壓縮標準,分別是MPEG-1、MPEG-2、和MPEG-4。MPEG-1、MPEG-2目前已經使用較少,著重介紹MPEG-4,其制定于1998年,MPEG-4是為了播放流式媒體的高質量視頻而專門設計的,以求使用最少的數據獲得最佳的圖像質量。目前MPEG-4最有吸引力的地方在于它能夠保存接近于DVD畫質的小體積視頻文件。

5)WMV格式(后綴為.wmv、.asf):它的英文全稱為Windows Media Video,也是微軟推出的一種采用獨立編碼方式并且可以直接在網上實時觀看視頻節目的文件壓縮格式。WMV格式的主要優點包括:本地或網絡回放,豐富的流間關系以及擴展性等。WMV格式需要在網站上播放,需要安裝Windows Media Player(簡稱WMP),很不方便,現在已經幾乎沒有網站采用了。

6)Real Video格式(后綴為.rm、.rmvb):Real Networks公司所制定的音頻視頻壓縮規范稱為Real Media。用戶可以使用RealPlayer根據不同的網絡傳輸速率制定出不同的壓縮比率,從而實現在低速率的網絡上進行影像數據實時傳送和播放。RMVB格式:這是一種由RM視頻格式升級延伸出的新視頻格式,當然性能上有很大的提升。RMVB視頻也是有著較明顯的優勢,一部大小為700 MB左右的DVD影片,如果將其轉錄成同樣品質的RMVB格式,其個頭最多也就400 MB左右。大家可能注意到了,以前在網絡上下載電影和視頻的時候,經常接觸到RMVB格式,但是隨著時代的發展這種格式被越來越多的更優秀的格式替代,著名的人人影視字幕組在2013年已經宣布不再壓制RMVB格式視頻。

7)Flash Video格式(后綴為.flv):由Adobe Flash延伸出來的的一種流行網絡視頻封裝格式。隨著視頻網站的豐富,這個格式已經非常普及。

8)Matroska格式(后綴為.mkv):是一種新的多媒體封裝格式,這個封裝格式可把多種不同編碼的視頻及16條或以上不同格式的音頻和語言不同的字幕封裝到一個Matroska Media檔內。它也是其中一種開放源代碼的多媒體封裝格式。Matroska同時還可以提供非常好的交互功能,而且比MPEG的方便、強大。

9)MPEG2-TS格式(后綴為.ts)(Transport Stream「傳輸流」;又稱MTS、TS)是一種傳輸和存儲包含音效、視頻與通信協議各種數據的標準格式,用于數字電視廣播系統,如DVB、ATSC、IPTV等。MPEG2-TS定義于MPEG-2第一部分,系統(即原來之ISO/IEC標準13818-1或ITU-T Rec. H.222.0)。Media Player Classic、VLC多媒體播放器等軟件可以直接播放MPEG-TS文件。

目前,我們在流媒體傳輸,尤其是直播中主要采用的就是FLV和MPEG2-TS格式,分別用于RTMP/HTTP-FLV和HLS協議。

在下一篇連載中,我們將詳細介紹推流和傳輸,敬請期待!

總結

以上是生活随笔為你收集整理的视频直播技术详解(3)编码和封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。