實時音視頻開發理論必備:如何省流量?視頻高度壓縮背後的預測技術

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文引用了“拍樂雲Pano”的“深入淺出理解視頻編解碼技術”和“揭祕視頻千倍壓縮背後的技術原理之預測技術”文章部分內容,感謝原作者的分享。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"1、引言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從 20 世紀 90 年代以來,數字音視頻編解碼技術迅速發展,一直是國內外研究的熱點領域。隨着5G的成熟和廣泛商用,帶寬已經越來越高,傳輸音視頻變得更加容易。視頻直播、視頻聊天,已經完全融入了每個人的生活。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"視頻爲何如此普及呢?是因爲通過視頻能方便快捷地獲取到大量信息。但視頻數據量非常巨大,視頻的網絡傳輸也面臨着巨大的挑戰。於是視頻編解碼技術就出場了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"具體到實時視頻場景,不僅僅是數據量的問題,實時通信對時延要求、設備適配、帶寬適應的要求也非常高,要解決這些問題,始終離不開視頻編解碼技術的範疇。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文將從視頻編解碼技術的基礎知識入手,引出視頻編解碼技術中非常基礎且重要的預測技術,學習幀內預測和幀間預測的技術原理。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"2、相關文章","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"如果你是音視頻技術初學者,以下3篇入門級乾貨非常推薦一讀:","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-2840-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"零基礎,史上最通俗視頻編碼技術入門","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-3079-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"零基礎入門:實時音視頻技術基礎知識全面盤點","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-3194-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"實時音視頻面視必備:快速掌握11個視頻技術相關的基礎概念","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"3、爲什麼需要視頻編解碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,來複習一下視頻編解碼方面的理論常識。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"視頻是由一系列圖片按照時間順序排列而成:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)每一張圖片爲一幀;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)每一幀可以理解爲一個二維矩陣;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3)矩陣的每個元素爲一個像素。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個像素通常由三個顏色進行表達,例如用RGB顏色空間表示時,每一個像素由三個顏色分量組成。每一個顏色分量用1個字節來表達,其取值範圍就是0~255。編碼中常用的YUV格式與之類似,這裏不作展開。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7b/7b43136fad4e66920e5d09f3293d8592.png","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以1280x720@60fps的視頻序列爲例,十秒鐘的視頻有:1280*720*3*60*10 = 1.6GB。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如此大量的數據,無論是存儲還是傳輸,都面臨巨大的挑戰。視頻壓縮或者編碼的目的,也是爲了保證視頻質量的前提下,將視頻減小,以利於傳輸和存儲。同時,爲了能正確還原視頻,需要將其解碼。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"PS:","attrs":{}},{"type":"text","text":"限於篇幅,視頻編解碼方面的技術原理就不在此展開,有興趣強烈推薦從這篇深入學習:《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-2840-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十九):零基礎,史上最通俗視頻編碼技術入門","attrs":{}}]},{"type":"text","text":"》。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"總之,視頻編解碼技術的主要作用就是:在可用的計算資源內,追求儘可能高的視頻重建質量和儘可能高的壓縮比,以達到帶寬和存儲容量的要求。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲何突出“重建質量”?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲視頻編碼是個有損的過程,用戶只能從收到的視頻流中解析出“重建”畫面,它與原始的畫面已經不同,例如觀看低質量視頻時經常會碰到的“塊”效應。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如何在一定的帶寬佔用下,儘可能地保持視頻的質量,或者在保持質量情況下,儘可能地減少帶寬利用率,是視頻編碼的基本目標。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"用專業術語來說,即視頻編解碼標準的“率失真”性能:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)“率”是指碼率或者帶寬佔用;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)“失真”是用來描述重建視頻的質量。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"與編碼相對應的是解碼或者解壓縮過程,是將接收到的或者已經存儲在介質上的壓縮碼流重建成視頻信號,然後在各種設備上進行顯示。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"4、什麼是視頻編解碼標準","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"視頻編解碼標準,通常只定義上述的解碼過程。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如 H.264 / AVC 標準,它定義了什麼是符合標準的視頻流,對每一個比特的順序和意義都進行了嚴格地定義,對如何使用每個比特或者幾個比特表達的信息也有精確的定義。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正是這樣的嚴格和精確,保證了不同廠商的視頻相關服務,可以很方便地兼容在一起,例如用 iPhone、Android Phone 或者 windows PC 都可以觀看同一在線視頻網站的同一視頻。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"世界上有多個組織進行視頻編碼標準的制定工作,國際標準組織 ISO 的 MPEG 小組、國際電信聯盟 ITU-T 的 VCEG 小組、中國的 AVS 工作組、Google 及各大廠商組成的開放媒體聯盟等。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"視頻編碼標準及發展歷史:","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/64/641e270fd7bf780f8852f409f0924915.png","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"自 VCEG 制定 H.120標準開始,視頻編碼技術不斷髮展,先後成功地制定了一系列滿足不同應用場景的視頻編碼標準。VCEG 組織先後制定了H.120、H.261、H.262(MPEG-2 Part 2)、H.263、H.263+、H.263++。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"MPEG也先後制定了MPEG-1、MPEG-2、MPEG-4 Part 2。以及兩個國際組織合作制定的H.264/AVC、H.265/HEVC、H.266/VVC。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"中國自主知識產權的 AVS、AVS2、AVS3 視頻編碼標準;Google 制定的 VP8、VP9。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Google、思科、微軟、蘋果等公司組成的開放媒體聯盟(AOM)制定的 AV1。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"這裏特別提一下H.264/AVC:","attrs":{}},{"type":"text","text":"H.264/AVC雖有近20年曆史,但它優秀的壓縮性能、適當的運算複雜度、優秀的開源社區支持、友好的專利政策、強大的生態圈等多個方面的因素,依舊讓它保持着強大的生命力,特別是在實時通信領域。像 ZOOM、思科 Webex 等視頻會議產品和基於 WebRTC SDK 的視頻服務,大多數主流場景都採用 H.264/AVC。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"有關視頻編解碼標準,這裏就不深入展開。更多詳細資料,可以讀一下下面這些精選文章:","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-237-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(五):認識主流視頻編碼技術H.264","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-266-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十三):實時視頻編碼H.264的特點與優勢","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-274-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十七):視頻編碼H.264、VP8的前世今生","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-3028-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"愛奇藝技術分享:輕鬆詼諧,講解視頻編解碼技術的過去、現在和將來","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"5、混和編碼框架","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"縱觀視頻編解碼標準歷史,每一代視頻標準都在率失真性能上有着顯著的提升,他們都有一個核心的框架,就是基於塊的混合編碼框架(如下圖所示)。它是由J. R. Jain 和A. K. Jain在1979年的國際圖像編碼學會(PCS 1979)上提出了基於塊運動補償和變換編碼的混合編碼框架。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e4/e4e89e76883d806e924bb9479912f105.jpeg","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們一起來對該框架進行拆解和分析。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"從攝像頭採集到的一幀視頻:","attrs":{}},{"type":"text","text":"通常是 YUV 格式的原始數據,我們將它劃分成多個方形的像素塊依次進行處理(例如 H.264/AVC 中以16x16像素爲基本單元),進行幀內/幀間預測、正變換、量化、反量化、反變換、環路濾波、熵編碼,最後得到視頻碼流。從視頻第一幀的第一個塊開始進行空間預測,因當前正在進行編碼處理的圖像塊和其周圍的圖像塊有相似性,我們可以用周圍的像素來預測當前的像素。我們將原始像素減去預測像素得到預測殘差,再將預測殘差進行變換、量化,得到變換系數,然後將其進行熵編碼後得到視頻碼流。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"接下來:","attrs":{}},{"type":"text","text":"爲了可以使後續的圖像塊可以使用已經編碼過的塊進行預測,我們還要對變換系統進行反量化、反變換,得到重建殘差,再與預測值進行求合,得到重建圖像。最後我們對重建圖像進行環路濾波、去除塊效應等,這樣得到的重建圖像,就可以用來對後續圖像塊進行預測了。按照以上步驟,我們依次對後續圖像塊進行處理。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"對於視頻而言:","attrs":{}},{"type":"text","text":"視頻幀與幀的間隔大約只有十到幾十毫秒,通常拍攝的內容不會發生劇烈變化,它們之間存在非常強的相關性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如下圖所示,將視頻圖像分割成塊,在時間相鄰的圖像之間進行匹配,然後將匹配之後的殘差部分進行編碼,這樣可以較好地去除視頻信號中的視頻幀與幀之間的冗餘,達到視頻壓縮的目的。這就是運動補償技術,直到今天它仍然是視頻編解碼的核心技術之一。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"運動估計和運動補償:","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b0/b0fa5aaf1e61dafb9e08208cfba182b5.jpeg","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"變換編碼的核心思想:","attrs":{}},{"type":"text","text":"是把視頻數據分割成塊,利用正交變換將數據的能量集中到較少幾個變換系數上。結合量化和熵編碼,我們可以獲得更有效的壓縮。視頻編碼中信息的損失和壓縮比的獲得,很大程度上來源於量化模塊,就是將源信號中的單一樣本映射到某一固定值,形成多到少的映射,從而達到壓縮的目的,當然在壓縮的過程中就引入了損失。量化後的信號再進行無損的熵編碼,消除信號中的統計冗餘。熵編碼的研究最早可以追溯到 20 世紀 50 年代,經過幾十年的發展,熵編碼在視頻編碼中的應用更加成熟、更加精巧,充分利用視頻數據中的上下文信息,將概率模型估計得更加準確,從而提高了熵編碼的效率。例如H.264/AVC中的Cavlc(基於上下文的變長編碼)、Cabac(基於上下文的二進制算術編碼)。算術編碼技術在後續的視頻編碼標準,如AV1、HEVC/H.265、VVC/H.266 中也有應用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"視頻編碼發展至今,VVC/H.266 作爲最新制定的標準,採納了一系列先進的技術,對混合編碼框架的各個部分都進行了優化和改進,使得其率失真性能相比前一代標準,又提高了一倍。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"例如:","attrs":{}},{"type":"text","text":"VVC/H.266 採用了128x128大小的基本編碼單元,並且可以繼續進行四叉樹劃分,支持對一個劃分進行二分、三分;色度分量獨立於亮度分量,支持單獨進行劃分;更多更精細的幀內預測方向、幀間預測模式;支持多種尺寸和形式的變換、環內濾波等。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"VVC/H.266 的制定,目標是對多種視頻內容有更好支持,例如屏幕共享內容、遊戲、動漫、虛擬現實內容(VR、AR)等。其中也有特定的技術被採納進標準,例如調色板模式、幀內運動補償、仿射變換、跳過變換、自適應顏色變換等。   ","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"回到本文的正題,接下來的內容,我們着重介紹視頻編解碼中的預測技術。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"6、幀內預測技術","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"視頻數據被劃分成方塊之後,相鄰的方塊的像素,以及方塊內的像素,顏色往往是逐漸變化的,他們之間有比較強的有相似性。這種相似性,就是空間冗餘。既然存在冗餘,就可以用更少的數據量來表達這樣的特徵。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"比如:","attrs":{}},{"type":"text","text":"先傳輸第一個像素的值,再傳輸第二個像素相對於第一個像素的變化值,這個變化值往往取值範圍變小了許多,原來要8個bit來表達的像素值,可能只需要少於8個bit就足夠了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同樣的道理,以像素塊爲基本單位,也可以進行類似的“差分”操作。我們從示例圖中,來更加直觀地感受一下這樣的相似性。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/12/12738fd8e3671706f133fb07b338db94.jpeg","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"如上圖中所標出的兩個8x8的塊:","attrs":{}},{"type":"text","text":"其亮度分量(Y)沿着“左上到右下”的方向,具有連續性,變化不大。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"假如:","attrs":{}},{"type":"text","text":"我們設計某種特定的“模式”,使其利用左邊的塊來“預測”右邊的塊,那麼“原始像素”減去“預測像素”就可以減少傳輸所需要的數據量,同時將該“模式”寫入最終的碼流,解碼器便可以利用左側的塊來“重建”右側的塊。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"極端一點講:","attrs":{}},{"type":"text","text":"假如左側的塊的像素值經過一定的運算可以完全和右側的塊相同,那麼編碼器只要用一個“模式”的代價,傳輸右側的塊。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,視頻中的紋理多種多樣,單一的模式很難對所有的紋理都適用,因此標準中也設計了多種多樣的幀內預測模式,以充分利用像素間的相關性,達到壓縮的目的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"例如下圖所示的H.264中9種幀內預測方向:","attrs":{}},{"type":"text","text":"以模式0(豎直預測)爲例,上方塊的每個像素值(重建)各複製一列,得到幀內預測值。其它各種模式也採用類似的方法,不過,生成預測值的方式稍有不同。有這麼多的模式,就產生了一個問題,對於一個塊而言,我們應該採用哪種模式來進行編碼呢?最佳的選擇方式,就是遍歷所有的模式進行嘗試,計算其編碼的所需的比特數和產生的質量損失,即率失真優化,這樣明顯非常複雜,因而也有很多種其它的方式來推斷哪種模式更好,例如基於SATD或者邊緣檢測等。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從H.264的9種預測模式,到AV1的56種幀內方向預測模式,越來越多的模式也是爲了更加精準地預測未編碼的塊,但是模式的增加,一方面增加了傳輸模式的碼率開銷,另一方面,從如此重多的模式中選一個最優的模式來編碼,使其能達到更高的壓縮比,這對編碼器的設計和實現也提出了更高的要求。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4e/4e6e2d0f25ddc5b67ca3f7e28e4708c0.png","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"7、幀間預測技術","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"以下5張圖片是一段視頻的前5幀:","attrs":{}},{"type":"text","text":"可以看出,圖片中只有Mario和磚塊在運動,其餘的場景大多是相似的,這種相似性就稱之爲時間冗餘。編碼的時候,我們先將第一幀圖片通過前文所述的幀內預測方式進行編碼傳輸,再將後續幀的Mario、磚塊的運動方向進行傳輸,解碼的時候,就可以將運動信息和第一幀一起來合成後續的幀,這樣就大大減少了傳輸所需的bit數。這種利用時間冗餘來進行壓縮的技術,就是運動補償技術。該技術早在H.261標準中,就已經被採用。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/6c/6c0fb536ab3cb13509e0b5b29f89bba9.png","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"細心地讀者可能已經發現:","attrs":{}},{"type":"text","text":"Mario和磚塊這樣的物體怎麼描述,才能讓它僅憑運動信息就能完整地呈現出來?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實視頻編碼中並不需要知道運動的物體的形狀,而是將整幀圖像劃分成像素塊,每個像素塊使用一個運動信息。即基於塊的運動補償。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下圖中紅色圈出的白色箭頭即編碼磚塊和Mario時的運動信息,它們都指向了前一幀中所在的位置。Mario和磚塊都有兩個箭頭,說明它們都被劃分在了兩個塊中,每一個塊都有單獨的運動信息。這些運動信息就是運動矢量。運動矢量有水平和豎直兩個分量,代表是的一個塊相對於其參考幀的位置變化。參考幀就是已經編碼過的某一(多)個幀。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/cd/cdc8cec5cb67076c1edfee50e128f45a.png","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"當然:","attrs":{}},{"type":"text","text":"傳輸運動矢量本身就要佔用很多 bit。爲了提高運動矢量的傳輸效率,主要有以下措施。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"一方面:","attrs":{}},{"type":"text","text":"可以儘可能得將塊劃分變大,共用一個運動矢量,因爲平坦區域或者較大的物體,他們的運動可能是比較一致的。從 H.264 開始,可變塊大小的運動補償技術被廣泛採用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"另一方面:","attrs":{}},{"type":"text","text":"相鄰的塊之間的運動往往也有比較高的相似性,其運動矢量也有較高的相似性,運動矢量本身也可以根據相鄰的塊運動矢量來進行預測,即運動矢量預測技術;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最後:","attrs":{}},{"type":"text","text":"運動矢量在表達物體運動的時候,有精度的取捨。像素是離散化的表達,現實中物體的運動顯然不是以像素爲單位進行運動的,爲了精確地表達物體的運動,需要選擇合適的精度來定義運動矢量。各視頻編解碼標準都定義了運動矢量的精度,運動矢量精度越高,越能精確地表達運動,但是代價就是傳輸運動矢量需要花費更多的bit。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"H.261中運動矢量是以整像素爲精度的,H.264中運動矢量是以四分之一像素爲精度的,AV1中還增加了八分之一精度。一般情況,時間上越近的幀,它們之間的相似性越高,也有例外,例如往復運動的場景等,可能相隔幾幀,甚至更遠的幀,會有更高的相似度。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了充分利用已經編碼過的幀來提高運動補償的準確度,從H.264開始引入了多參考幀技術。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"即:","attrs":{}},{"type":"text","text":"一個塊可以從已經編碼過的很多個參考幀中進行運動匹配,將匹配的幀索引和運動矢量信息都進行傳輸。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼如何得到一個塊的運動信息呢?最樸素的想法就是,將一個塊,在其參考幀中,逐個位置進行匹配檢查,匹配度最高的,就是最終的運動矢量。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"匹配度:常用的有SAD(Sum of Absolute Difference)、SSD(Sum of Squared Difference)等。逐個位置進行匹配度檢查,即常說的全搜索運動估計,其計算複雜度可想而知是非常高的。爲了加快運動估計,我們可以減少搜索的位置數,類似的有很多算法,常用的如鑽石搜索、六邊形搜索、非對稱十字型多層次六邊形格點搜索算法等。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以鑽石搜索爲例,如下圖所示,以起始的藍色點爲中心的9個匹配位置,分別計算這9個位置的SAD,如果SAD最小的是中心位置,下一步搜索中心點更近的周圍4個綠色點的SAD,選擇其中SAD最小的位置,繼續縮小範圍進行搜索;如果第一步中SAD最小的點不在中心,那麼以該位置爲中心,增加褐色的5或者3個點,繼續計算SAD,如此迭代,直到找到最佳匹配位置。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/95/9545a2196893e253b20b16087bce7c74.png","alt":"","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"編碼器在實現時,可根據實際的應用場景,對搜索算法進行選擇。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"例如:","attrs":{}},{"type":"text","text":"在實時音視頻場景下,計算複雜度是相對有限的,運動估計模塊要選擇計算量較小的算法,以平衡複雜度和編碼效率。當然,運動估計與運動補償的複雜度還與塊的大小,參考幀的個數,亞像素的計算等有關,在此不再深入展開。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"更多預測技術方面的原理這裏就不再贅述。如果你對上面所述的預測技術理解上感到力不從心,這裏有篇入門級的文章,可以先讀讀這篇《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-235-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(四):視頻編解碼之預測技術介紹","attrs":{}}]},{"type":"text","text":"》。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"8、寫在最後","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"音視頻編解碼技術,歸根結底就是在有限的資源下(網絡帶寬、計算資源等),讓音質更清晰、視頻更高質。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這其中,對於視頻來說,質量的提升仍然有很多可以深入研究的熱點問題。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"比如:","attrs":{}},{"type":"text","text":"基於人眼的主觀質量優化,主要利用人眼的視覺特性,將掩蔽效應、對比度靈敏度、注意力模型等與編碼相結合,合理分配碼率、減少編碼損失引起的視覺不適。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"AI在視頻編解碼領域的應用:包括將多種人工智能算法,如分類器、支持向量機、CNN等對編碼參數進行快速選擇,也可以使用深度學習對視頻進行編碼環外與編碼環內的處理,如視頻超分辨率、去噪、去霧、自適應動態範圍調整等編碼環外處理,達到提升視頻質量的目的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此外還有打破傳統混合編碼框架的深度神經網絡編碼,如Nvidia的Maxine視頻會議服務,利用深度學習來提取特徵,然後對特徵進行傳輸以節省帶寬。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"附錄:參考資料","attrs":{}}]},{"type":"blockquote","content":[{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-228-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(一):視頻編解碼之理論概述","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-229-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(二):視頻編解碼之數字視頻介紹","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-232-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(三):視頻編解碼之編碼基礎","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-235-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(四):視頻編解碼之預測技術介紹","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-237-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(五):認識主流視頻編碼技術H.264","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-241-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(六):如何開始音頻編解碼技術的學習","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-242-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(七):音頻基礎及編碼原理入門","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-243-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(八):常見的實時語音通訊編碼標準","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-247-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(九):實時語音通訊的迴音及迴音消除概述","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-250-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十):實時語音通訊的迴音消除技術詳解","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-251-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十一):實時語音通訊丟包補償技術詳解","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-253-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十二):多人實時音視頻聊天架構探討","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-266-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十三):實時視頻編碼H.264的特點與優勢","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-267-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十四):實時音視頻數據傳輸協議介紹","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-269-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十五):聊聊P2P與實時音視頻的應用情況","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-270-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十六):移動端實時音視頻開發的幾個建議","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-274-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十七):視頻編碼H.264、VP8的前世今生","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-2230-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十八):詳解音頻編解碼的原理、演進和應用選型","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-2840-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"即時通訊音視頻開發(十九):零基礎,史上最通俗視頻編碼技術入門","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-853-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"移動端實時音視頻直播技術詳解(一):開篇","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-955-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"移動端實時音視頻直播技術詳解(二):採集","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-960-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"移動端實時音視頻直播技術詳解(三):處理","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-965-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"移動端實時音視頻直播技術詳解(四):編碼和封裝","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-967-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"移動端實時音視頻直播技術詳解(五):推流和傳輸","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-972-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"移動端實時音視頻直播技術詳解(六):延遲優化","attrs":{}}]},{"type":"text","text":"》","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"本文已同步發佈於“即時通訊技術圈”公衆號。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同步發佈鏈接是:","attrs":{}},{"type":"link","attrs":{"href":"http://www.52im.net/thread-3581-1-1.html","title":null,"type":null},"content":[{"type":"text","text":"http://www.52im.net/thread-3581-1-1.html","attrs":{}}]}]}],"attrs":{}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章