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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

音视频开发入门基础知识(视频入门篇)

發布時間:2024/3/26 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 音视频开发入门基础知识(视频入门篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RTSP實時音視頻開發實戰課程:<RTSP實時音視頻開發實戰>

音視頻開發入門基礎知識(音頻入門篇)

目錄

一、前言

二、視頻采集和顯示

三、視頻常見的格式

四、RGB轉YUV和YUV轉RGB

五、視頻的壓縮編碼

一、前言

? ? ? ?當前隨著科技的進步和人們生活水平的不斷提高,現在人們在茶余飯后都會使用手機、電腦等這類產品,來看一些有趣的視頻,來娛樂自己;而這些都離不開音視頻技術的支持。本文開始介紹視頻開發中最基本的技術知識,比如視頻采集和顯示、視頻常見的格式、視頻壓縮編碼等。

? ? ? ?首先要知道我們是如何通過視頻來看到他人的;如下圖所示,視頻/聲音通過攝像頭/麥克風采集后(捕捉)將視頻/聲音通過網絡發送出去,其他人通過網絡接收后將視頻顯示到屏幕上,聲音在揚聲器播放,比如我們通過抖音、朋友圈視頻等,都是拍攝視頻上傳,通過網絡傳輸,之后在通過網絡接收來播放視頻和聲音;另外視頻/聲音通過攝像頭/麥克風采集后(捕捉)將視頻/聲音保存為文件存儲后,通過播放器選擇文件來播放,將視頻畫面顯示到屏幕上,聲音通過揚聲器播放,比如我們手機通過相機拍攝后就是保存在手機中,然后通過手機自帶播放器來播放視頻和聲音。

二、視頻采集和顯示

? ? 人們要想看到自然界中的景象就需要光,通過光的傳遞將自然界的景象傳遞給人眼。我們手機/相機對景象的采集也是通過光。如下圖是視頻/圖像采集的一個過程;通常自然界的人物和景象通過光電轉換將光信號轉換為電信號,常見的光電轉換就是攝像頭感光元器件;電信號經過處理器轉為數字信號,程序就可以將數字信號進行處理存儲為文件。

? ? ? 那么顯示器是如何顯示數字圖像的呢?如下圖是顯示數字圖像的過程;處理器將數字信號轉為電信號,電信號通過電光轉換器后轉換為光信號,就可以被人眼觀察到;通常電信號轉為光信號的有發光二極管、液晶顯示器等。

? ? ? 上面介紹了圖像的顯示過程,那么視頻和圖像什么關系呢?我們都知道一張圖像里面的畫面是靜止,而視頻里面的畫面是可以動態的,所以視頻和圖像最大差異在于視頻是動態而圖像是靜態的。其實視頻是由若干張圖像組成(注意這里的若干個圖像是存在差異的,即不同時刻拍攝的運動物體/景象);當物體在運動過程中通過快速的連續不斷的拍攝若干張圖像組合在一起就構成了一個視頻,這就是視頻拍攝的過程。如下圖綠蔭場上的小球從高拋的過程,通過相機連續不斷的拍攝出多個靜態圖像經過組合就可以得到一個小球高拋的運動狀態的視頻出來。? ? ? ?

三、視頻常見的格式

? ? 任何一個視頻或者一個圖像都有一個像素格式,而像素是指在數字圖像/視頻中一個最小的顏色單位,在圖像/視頻中按照水平+垂直的方向進行排列,通過像素的位置和顏色就可以呈現真實景象的樣子。如下圖是一副圖像,下圖的一個格子就可以認為是一個像素(實際進行了放大)。水平和垂直方向的數字520和280就是這個圖像的大小,也叫圖像的寬度和高度,通常也叫分辨率520x280,也就是圖像的寬度是520,高度是280,單位就是像素。

? ? ? 經過攝像頭/處理器得到的視頻/圖像的像素格式通常有RGB、YUV等格式,在這里我們重點介紹RGB和YUV。

? ? ? 什么是RGB?RGB格式也叫RGB色彩,就是常說的光學三原色,R代表Red(紅色),G代表Green(綠色),B代表Blue(藍色);自然界中肉眼所能看到的任何色彩都可以由這三種色彩混合疊加而成。在RGB格式的圖像中一個像素包含了R、G、B三個顏色,其中每個顏色占8bit,也就是一個字節,三個顏色就是24bit(3個字節),由于一個R、G或者B占用8bit那么其所表達的數字范圍就是0-255,所以單個顏色所能表示的顏色范圍只有256中。通常為了方便圖像的存取,RGB格式的圖像其三個顏色是交叉存儲的,如下圖,一個像素的RGB值存儲完之后存下一個像素的RGB值。一副分辨率為520x280的RGB格式的圖像其大小為520x280*3=436800字節=426.5625KB。

? ? ? 此外對于RGB圖像格式不同可能每個像素大小不同,除了RGB格式還有其他格式比如RGBA格式,ARGB格式、BGR格式等、對于RGBA格式和ARGB格式是在RGB顏色上多了一個Alpha,也通常指圖像的透明度,也占用一個字節;對于ARGB和RGBA格式的圖像來說每一個像素占32bit(4個字節),一副分辨率為520x280的ARGB/RGBA格式的圖像其大小為520x280*4=582400字節=568.75KB。BGR圖像格式和RGB的格式像素大小都是24bit僅僅是RGB的存儲順序不同,RGB是先存儲Red顏色,BGR是先存儲Blue顏色。另外還有些更高bit的RGB格式存在,比如10bit的RGB甚至16bit的RGB,10bit和16bit的RGB和8bit的RGB相比大小會明顯增大,此外10bit和16bit由于單個像素的bit數增加那么所表達的顏色范圍也會增加,比如10bitRGB單個顏色值的范圍為0-1023,所以10bitRGB可以表示的顏色有1024種,比8bitRGB高出4倍。

? ? ? 什么是YUV?YUV是是一種顏色編碼方法,通常是對RGB進行顏色轉換得到YUV。Y通常是顏色中的亮度信息(灰度信息),UV是顏色中的彩色信息。通常人眼對事物顏色的亮度和彩色信息的敏感程度不同,大多是對亮度敏感度較高,對彩色信息敏感度較低,所以將顏色的亮度和彩色信息分離表示可以有助于圖像的編碼。通常YUV的格式有YUV444、YUV422、YUV420;YUV444表示的YUV圖像中亮度和彩色信息所占空間大小是1:1:1(Y:U:V);YUV422表示的YUV圖像中亮度和彩色信息所占空間大小是2:1:1(Y:U:V),即彩色信息量和亮度信息量相比較降低了一半的信息和存儲空間;YUV420表示的YUV圖像中亮度和彩色信息所占空間大小是4:1:1(Y:U:V),即彩色信息量和亮度信息量相比較降低了3/4的信息和存儲空間,YUV格式通常是減少彩色信息量來降低存儲空間大小的一種格式;YUV420的存儲空間結構舉例可以如下圖所示,先存儲32個Y,在存幀8個U和8個V。

? ? ? 在實際的視頻和圖像編碼中使用的YUV格式大多是YUV420的。可以發現上圖YUV420的存儲結構的三個分量(Y/U/V)是單獨存儲的,除了上面的單獨存儲格式外還有UV交織存儲的YUV420格式,比如NV21,NV12,這兩種也是比較常見的YUV420格式。NV21通常是V在前U在后的存儲方式,NV12是U在前V在后的存儲方式.,如下圖左側是NV12,右側是NV21.

? ? ? YUV圖像格式通常一個像素由Y分量和U、V分量表示,三個分量通常都是占8bit(一個字節),對于YUV420(NV21/NV12)的圖像來說一個像素需要1.5個字節(一個字節的Y和0.25字節的U+0.25字節的V)表示;一副520x280的YUV420圖像大小為520x280x1.5=218400字節=213.28KB,可以看到YUV420的格式圖像比同分辨率的RGB的大小降低了一半。和RGB一樣,YUV不僅有8bit的數據也有10bit、12bit表示的,對于Y(亮度)10bit的數據可以表示0-1023范圍的亮度,UV10bit的數據可以表示0-1023范圍的色度。

四、RGB轉YUV和YUV轉RGB

? ? ?通常情況下RGB格式的圖像其大小比較大,占用較大的存儲空間,所示需要對RGB格式進行壓縮,通常RGB壓縮為YUV(通常是YUV420),RGB壓縮為YUV的過程也就是RGB轉YUV的公式如下,下面的公式是BT709色域空間下的RGB轉YUV的公式。

BT709 Y = 0.183*R + 0.614*G + 0.062*B + 16; U = 0.439*B - 0.339*G - 0.101*R + 128; V = 0.439*R - 0.399*G - 0.040*B + 128;

下面的公式是BT601色域空間下的RGB轉YUV的公式。

BT601 Y = 0.257*R + 0.504*G + 0.098*B + 16; U = 0.439*B - 0.291*G - 0.148*R + 128; V = 0.439*R - 0.368*G - 0.071*B + 128;

關于BT709和BT601是國際標準中不同的兩種色域(也就是表示紅綠藍顏色的范圍)。

? ? ? 另外在顯示圖像數據的時候通常都是按照RGB數據格式進行顯示像素點,所以實際顯示YUV數據的時候還需要將YUV轉RGB,下面的公式是BT709色域空間下的YUV轉RGB的公式。

BT709 R = 1.164*(Y-16) + 1.792*(V-128); G = 1.164*(Y-16) - 0.213*(U-128) - 0.534*(V-128); B = 1.164*(Y-16) + 2.114*(U-128);

下面的公式是BT601色域空間下的YUV轉RGB的公式。

BT601 R = 1.164*(Y-16) + 1.596*(V-128); G = 1.164*(Y-16) - 0.392*(U-128) - 0.812*(V-128); B = 1.164*(Y-16) + 2.016*(U-128);

五、視頻的壓縮編碼

? ? ?上面的RGB和YUV的介紹中我們可以知道,一副格式為YUV420,分辨率為520x280的圖像占用213.28KB,如果是格式為YUV420,分辨率為520x280,時常為1秒,幀率為30幀每秒的視頻其大小為520x280x1.5x30=6398.4375KB=6.25MB,如果視頻分辨率是高清也就是1920x1080,則視頻的大小為1920x1080x1.5x30=91125KB=88.99MB,如果你要從網上看格式為YUV420,分辨率1920x1080,幀率30幀每秒的視頻則需要的網速是88.99MB*8=711.9Mb每秒,這種網速一般人根本達不到。如果你要是錄制格式為YUV420,分辨率1920x1080,幀率30幀每秒,時常為1小時的視頻則大小是:1920x1080x1.5*30*60*60=320364MB=312.8GB,這么大的存儲空間,一部256G內存的手機根本不夠用,所以需要對YUV格式的視頻進一步壓縮才能滿足我們日常視頻拍攝,瀏覽的需求。

? ? ? 目前視頻壓縮編碼算法標準比較多,通常使用較多的是H264(也叫AVC)和H265(也叫HEVC);使用H264對YUV420的圖像進行壓縮,壓縮率可以達到100倍-200倍,而且不影響視頻的觀看,H265編碼算法可以達到300倍的壓縮率,而且不影響視頻的觀看。下圖是H264的編碼框圖。

下圖是H265的編碼框圖。

?

? ? ? 根據H264和H265的編碼框圖看出H265編碼算法更加復雜。實際上H265的壓縮效率比H264的要高,但是同時H265的編碼器實現更加困難,目前開源的H265編碼器X265比H264開源的X264編碼器速度要慢上很多。

? ? ?下圖是視頻采集到編碼的數據流程圖。

? ? ?下圖是視頻解碼到顯示的數據流程。

? ? ?H264和H265編碼器對YUV進行壓縮,主要過程是對視頻YUV進行編碼,將YUV數據編碼為IDR幀、P幀、B幀;

IDR幀(Instantaneous Decoding Refresh),即時解碼刷新,是視頻的關鍵幀,IDR幀的解碼不需要依賴其他視頻幀。解碼器遇到這個幀會將之前的解碼信息清空,根據當前的IDR幀解碼生成新的解碼信息。視頻編碼幀中可以有多個IDR幀。

P幀 是前向預測編碼的視頻幀,它的解碼只能參考它前面的P幀或者IDR幀。

B幀 是雙向預測編碼的視頻幀,它的解碼需要參考前面的P幀或者IDR幀,也需要參考它后面的P幀或者IDR幀。

? ? ? ?通常IDR幀采用幀內壓縮方式,只消除空域上的內容冗余,壓縮率比較低;P幀采用幀內和幀間的壓縮方式不僅消除空間上的冗余也可以消除時間上的冗余,壓縮效率比較高;B幀也采用幀間幀內和幀間的壓縮方式,也會消除空間和時間上的冗余,其采用雙向預測編碼可以進一步降低時間冗余。因此視頻壓縮的目的是降低視頻內容的冗余,使用更少的數據量來保存圖像信息。

?下圖是H264/H265視頻編碼幀結構圖。

有關H264和H265視頻碼流的分析如下文章:

H264視頻碼流結構分析

H265視頻碼流結構分析

總結

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

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