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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

音视频开发 视频编解码理论知识

發布時間:2023/12/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 音视频开发 视频编解码理论知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

像素

像素是圖像的基本單元,一個個像素就組成了圖像。你可以認為像素就是圖像中的一個點。在下面這張圖中,你可以看到一個個方塊,這些方塊就是像素。

分辨率

圖像(或視頻)的分辨率是指圖像的大小或尺寸。我們一般用像素個數來表示圖像的尺寸。比如說一張1920x1080的圖像,前者1920指的是該圖像的寬度方向上有1920個像素點,而后者1080指的是圖像的高 度方向上有1080個像素點。

RGB

一般來說,我們看到的彩色圖像中,都有三個通道,這三個通道就是R、G、B通道,(有的時候還會有Alpha值,代表透明度) 通常R、G、B各占8個位,我們稱這種圖像是8bit圖像。

YUV

對于圖像顯示器來說,它是通過RGB模型來顯示圖像的。而在傳輸圖像數據時是使用YUV模型的,因為YUV模型可以節省帶寬。所以就需要采集圖像時將RGB模型轉換到YUV模型,顯示時再將YUV模型轉換為RGB模型。

從視頻采集與處理的角度來說,一般的視頻采集芯片輸出的碼流一般都是YUV數據流的形式,而從視頻處理(例如H.264、MPEG視頻編解碼)的角度來說,也是在原始YUV碼流進行編碼和解析 ;如果采集的資源時RGB的,也需要轉換成YUV。

使用YUV而非RGB的兩個原因: 1)yuv提取y亮度信號,可以直接給黑白電視使用,兼容黑白電視 2)人對uv的敏感性小于亮度,這樣我們適當減少uv的量,進行視頻的壓縮。所以才會有420 422 444等不同的yuv描述

YUV 顏色編碼采用的是 明亮度 和 色度 來指定像素的顏色。 其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。 YUV主要分為YUV 4:4:4,YUV 4:2:2,YUV 4:2:0幾種常用類型。

YUV格式有兩大類:planar和packed。對于planar的YUV格式,先連續存儲所有像素點的Y,緊接著存儲所有像素點的U,隨后是所有像素點的V。對于packed的YUV格式,每個像素點的Y,U,V是連續交叉存儲的。



YUV 4:4:4, 每一個Y對應一組UV。 2.YUV 4:2:2,每兩個Y共用一組UV。 3.YUV 4:2:0,每四個Y共用一組UV。

YUV 4:4:4采樣意味著Y、U、V三個分量的采樣比例相同,所以在生成的圖像里,每個像素的三個分量信息都是8bit。

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最后映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

這種采樣方式的圖像和 RGB 顏色模型的圖像大小是一樣,并沒有達到節省帶寬的目的

YUV 4:2:2采樣UV分量是Y分量的一般,Y分量和UV分量按照2:1的比例采樣,如果水平方向有10個像素點,那么采樣了10個Y分量,就只采樣了5個UV分量。

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個采集一個。
最后映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

通過這個例子就可以發現第一個像素點和第二個像素點共用了[U0、V1]分量,第三個像素點和第四個像素點共用了[U2、V3]分量,這樣就節省了圖像空間。比如一張1280*720大小的圖片,如果按照RGB方式存儲,會耗費:

(1280?720?8+1280?720?8+1280?720?8)、8/1024/1024=2.637 其中1280*720是表示有多少個像素點。但如果采用了YUV4:2:采樣格式:

(1280?720?8+1280?720?0.5?8?2)/8/1024/1024=1.76 節省了1/3的存儲空間,適合進行圖像傳輸。

YUV 4:2:0采樣YUV 4:2:0 采樣,并不是指只采樣 U 分量而不采樣 V 分量。而是指,在每一行掃描時,只掃描一種色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采樣。比如,第一行掃描時,YU 按照 2 : 1 的方式采樣,那么第二行掃描時,YV 分量按照 2:1 的方式采樣。對于每個色度分量來說,它的水平方向和豎直方向的采樣和 Y 分量相比都是 2:1 。

舉個例子 :
假設圖像像素為:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y4 U4 V4]、[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7]
那么采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y4 V4 Y5 Y6 V6 Y7
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最后映射出的像素點為:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

通過YUV 4:2:0采樣后的圖片大小為: (1280?720?8+1280?720?0.25?8?2)/8/1024/1024=1.32 采樣的圖像比RGB模型圖像節省了一半的存儲空間,因此也是比較主流的采樣方式。

視頻和圖像和關系

大量的圖像連續起來,就是視頻。衡量視頻,又是用的什么指標參數呢?最主要的一個,就是幀率(Frame Rate)。在視頻中,一個幀(Frame)就是指一幅靜止的畫面。幀率,就是指視頻每秒鐘包括的畫面數量(FPS,Frame per second)。

為什么視頻數據需要編碼?

有了視頻之后,就涉及到兩個問題: 一個是存儲; 二個是傳輸。

未經編碼的視頻,它的體積是非常龐大的。 以一個分辨率1920×1280,30FPS的視頻為例: 共:1920×1280=2,073,600(Pixels 像素),每個像素點是24bit(前面算過的哦); 也就是:每幅圖片2073600×24=49766400 bit,8 bit(位)=1 byte(字節); 所以:49766400bit=6220800byte≈6.22MB。 這是一幅1920×1280圖片的原始大小,再乘以幀率30。

也就是說:每秒視頻的大小是186.6MB,每分鐘大約是11GB,一部90分鐘的電影,約是1000GB

顯然如此大的體積需要壓縮,于是編碼就產生了。

什么是編碼?

編碼:就是按指定的方法,將信息從一種形式(格式),轉換成另一種形式(格式)。視頻編碼:就是將一種視頻格式,轉換成另一種視頻格式。

編碼的終極目的,就是為了壓縮。各種視頻編碼方式,都是為了讓視頻變得體積更小,有利于存儲和傳輸。 要實現壓縮,就要設計各種算法,將視頻數據中的冗余信息去除。

當你面對一張圖片,或者一段視頻的時候,如果是你,你會如何進行壓縮呢? 我覺得,首先你想到的,應該是找規律。是的,尋找像素之間的相關性,還有不同時間的圖像幀之間,它們的相關性。

舉個例子:如果一幅圖(1920×1080分辨率),全是紅色的,我有沒有必要說2073600次[255,0,0]?我只要說一次[255,0,0],然后再說2073599次“同上”。

如果一段1分鐘的視頻,有十幾秒畫面是不動的,或者,有80%的圖像面積,整個過程都是不變(不動)的。那么,是不是這塊存儲開銷,就可以節約掉了?

圖像一般都是有數據冗余的,主要包括以下4種:

空間冗余。比如說將一幀圖像劃分成一個個16x16的塊之后,相鄰的塊很多時候都有比較明顯的相似性, 這種就叫空間冗余。

時間冗余。一個幀率為25fps的視頻中前后兩幀圖像相差只有40ms,兩張圖像的變化是比較小的,相似性很高,這種叫做時間冗余。

視覺冗余。我們的眼睛是有視覺靈敏度這個東西的。人的眼睛對于圖像中高頻信息的敏感度是小于低頻信息的。有的時候去除圖像中的一些高頻信息,人眼看起來跟不去除高頻信息差別不大,這種叫做視覺冗余。

信息炳冗余。我們一般會使用Zip等壓縮工具去壓縮文件,將文件大小減小,這個對于圖像來說也是可以 做的,這種冗余叫做信息嫡冗余。

各種視頻壓縮算法就是為了減少上面的這幾種冗余。視頻編碼技術優先消除的目標,就是空間冗余和時間冗余。

宏塊

每一幀圖像,又是劃分成一個個塊來進行編碼的,這一個個塊在H264中叫做宏塊,而在VP9、AV1 中稱之為超級塊,其實概念是一樣的。宏塊大小一般是16x16 (H264、VP8) , 32x32 (H265、VP9),64x64 (H265、VP9、AV1) , 128x128 (AV1)這幾種。這里提到的H264、H265、VP8、VP9和AV1都是市面上常見的編碼標準。

幀內預測 幀間預測

幀內預測——基于同一幀內已編碼塊預測,構造預測塊,計算與當前塊的殘差,對殘差、預測模式等信息進行編碼。其主要去除的是空間冗余。

幀間預測——基于一個或多個已編碼幀預測,構造預測塊,計算與當前塊的殘差,對殘差、預測模式、運動矢量殘差、參考圖像索引等信息進行編碼。其主要去除的是時間冗余。

幀類型

幀間預測需要參考已經編碼的幀,幀間編碼幀可以分為只參考前面幀的前向編碼幀和前后都可以參考的雙向編碼幀

I幀:是自帶全部信息的獨立幀,是最完整的畫面(占用的空間最大),無需參考其它圖像便可獨立進行解碼。視頻序列中的第一個幀,始終都是I幀。

P幀:“幀間預測編碼幀”,需要參考前面的I幀和/或P幀的不同部分,才能進行編碼。P幀對前面的P和I參考幀有依賴性。但是,P幀壓縮率比較高,占用的空間較小。

B幀:“雙向預測編碼幀”,以前幀后幀作為參考幀。不僅參考前面,還參考后面的幀,所以,它的壓縮率最高,可以達到200:1。

如圖,箭頭是從參考幀指向編碼幀

GOP(序列)和IDR

在H264中圖像以序列為單位進行組織,一個序列是一段圖像編碼后的數據流。 一個序列的第一個圖像叫做 IDR 圖像(立即刷新圖像),IDR 圖像都是 I 幀圖像。H.264 引入 IDR 圖像是為了解碼的重同步,當解碼器解碼到 IDR 圖像時,立即將參考幀隊列清空,將已解碼的數據全部輸出或拋棄,重新查找參數集,開始一個新的序列。這樣,如果前一個序列出現重大錯誤,在這里可以獲得重新同步的機會。IDR圖像之后的圖像永遠不會使用IDR之前的圖像的數據來解碼。

一個序列就是一段內容差異不太大的圖像編碼后生成的一串數據流。當運動變化比較少時,一個序列可以很長,因為運動變化少就代表圖像畫面的內容變動很小,所以就可以編一個I幀,然后一直P幀、B幀了。當運動變化多時,可能一個序列就比較短了,比如就包含一個I幀和3、4個P幀。 在視頻編碼序列中,GOP即Group of picture(圖像組),指兩個I幀之間的距離,Reference(參考周期)指兩個P幀之間的距離。兩個I幀之間形成一組圖片,就是GOP(Group Of Picture)。

PTS和DTS

為什么會有PTS和DTS的概念?

P幀需要參考前面的I幀或P幀才可以生成一張完整的圖片,而B幀則需要參考前面I幀或P幀及其后面的一個P幀才可以生成一張完整的圖片。這樣就帶來了一個問題:在視頻流中,先到來的 B 幀無法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來播放時間與解碼時間不一致了,順序打亂了,那這些幀該如何播放呢?這時就引入了另外兩個概念:DTS 和 PTS。

DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在于告訴播放器該在什么時候解碼這一幀的數據。 PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀的數據。

在視頻采集的時候是錄制一幀就編碼一幀發送一幀的,在編碼的時候會生成 PTS,這里需要特別注意的是 frame(幀)的編碼方式,在通常的場景中,編解碼器編碼一個 I 幀,然后向后跳過幾個幀,用編碼 I 幀作為基準幀對一個未來 P 幀進行編碼,然后跳回到 I 幀之后的下一個幀。編碼的 I 幀和 P 幀之間的幀被編碼為 B 幀。之后,編碼器會再次跳過幾個幀,使用第一個 P 幀作為基準幀編碼另外一個 P 幀,然后再次跳回,用 B 幀填充顯示序列中的空隙。這個過程不斷繼續,每 12 到 15 個 P 幀和 B 幀內插入一個新的 I 幀。P 幀由前一個 I 幀或 P 幀圖像來預測,而 B 幀由前后的兩個 P 幀或一個 I 幀和一個 P 幀來預測,因而編解碼和幀的顯示順序有所不同,如下所示:


假設編碼器采集到的幀是這個樣子的:

I B B P B B P

那么它的顯示順序,也就是PTS應該是這樣:

1 2 3 4 5 6 7

編碼器的編碼順序是:

1 4 2 3 7 5 6

推流順序也是按照編碼順序去推的,即

I P B B P B B

那么接收斷收到的視頻流也就是:

I P B B P B B

這時候去解碼,也是按照收到的視頻流一幀一幀去解的了,接收一幀解碼一幀,因為在編碼的時候已經按照 I、B、P 的依賴關系編好了,接收到數據直接解碼就好了。那么解碼順序是:

I P B B P B B
DTS:1 2 3 4 5 6 7
PTS:1 4 2 3 7 5 6

可以看到解碼出來對應的 PTS 不是順序的,為了正確顯示視頻流,這時候我們就必須按照 PTS 重新調整解碼后的 frame(幀),即

I B B P B B P
DTS:1 3 4 2 6 7 5
PTS:1 2 3 4 5 6 7

關于FFmpeg/WebRTC/RTMP/RTSP/HLS/RTP播放器-音視頻流媒體高級開發 學習資料、視頻教程

總結

以上是生活随笔為你收集整理的音视频开发 视频编解码理论知识的全部內容,希望文章能夠幫你解決所遇到的問題。

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