感情中特能折騰的人,很多都是之前戀情裡受過創傷的人。人總有一種“補償情結”,希望把之前吃過的虧在日後一股腦兒地補回來。那些陳年舊帳就這樣算到了新人頭上。殊不知,成熟的愛,是傷口處開出的玫瑰。容得下委屈的,才留得住真愛。——蘇芩
文章目錄
-
- 一、視訊格式
- 二、視訊協定
- 三、視訊流
-
-
- 1. 顔色空間
- 2. 采樣率
- 3、編碼/存儲格式
-
- 四、視訊編解碼
-
-
- 1、視訊編碼方式
- 2、幀率(FPS)
- 3、分辨率(Resolution)
- 4、碼率(BPS)
-
- 參考
一、視訊格式
我們經常在各大視訊網站上(如哔哩哔哩、騰訊視訊)觀看視訊,我們也經常在電影天堂上下載下傳電影,我們偶爾會把他們儲存到本地,我們會看到我們儲存的檔案格式都是.avi、.mp4、.mkv之類的檔案,我們在網絡直接觀看就是觀看的視訊流,儲存到本地的檔案都是各種視訊檔案
本地視訊檔案常見有MP4、MKV、AVI等,這些都是什麼?有什麼差別?
我們在解答這個問題之前,我們需要引入一個名詞:視訊封裝格式,簡稱 視訊格式,我們有時候也叫容器
常見的視訊格式如下:
視訊檔案格式 | 視訊封裝格式 |
---|---|
.avi | AVI(Audio Video Interleaved) |
.wmv、.asf | WMV(Windows Media Video) |
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 | MPEG(Moving Picture Experts Group) |
.mkv | Matroska |
.rm、.rmvb | Real Video |
.mov | QuickTime File Format |
.flv | Flash Video |
二、視訊協定
在騰訊視訊、哔哩哔哩網上看的視訊,與本地播放的MP4、MKV、AVI檔案,有什麼差別?
在回答這個問題,我們需要解釋視訊協定
『視訊協定』是針對網絡流媒體而言的,也就是隻有在有網絡時通過浏覽器或者移動端APP才能看到的視訊,目前常見的協定有RTSP、RTMP、HLS、HTTP等。筆者短暫地接觸過GStreamer開發,在連接配接到RSTP視訊時,發現除了視音頻流和metadata之外,還攜帶了播放的信令。
而剝開視訊協定的外殼之後我們後面會介紹視訊流本身
三、視訊流
就視訊流而言,相信大家平時一定經常聽到類似“h264碼流”、“yuv流”、“編碼流”、“解碼流”,“原始流”、“裸流”,“壓縮後的流”或者“未壓縮的流”等等。歸納而言,提到『視訊流』的時候,一定隻有兩種形式:
- 經過壓縮算法壓縮的流資料,稱為『編碼流』,又因為目前壓縮/編碼算法以H264為主,是以也常常稱為『H264碼流』。
- 未經壓縮的流資料,是解碼後的流資料,稱為『原始流』,可以想象視訊是由一幅一幅在時間上連續的“圖像”組成的,而因為視訊内部的“圖像”是『YUV』(後文将介紹),是以也常常稱為『YUV流』。
我們這裡會引入一個概念叫做幀,『幀』是視訊流媒體領域的核心
『幀』,可以聯想成我們平時看到的一幅幅“圖像”,隻不過我們平時接觸的圖檔是『RGB』格式的,而視訊幀通常是『YUV』格式的。既然提到了『RGB』和『YUV』,那麼就來了解下幀的格式『YUV』,
- 在達到最大壓縮率的情況下,能夠保證對人眼感覺的失真度最小。『YUV』的三通道中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰階值;而"U"和"V"表示的則是色度(Chrominance或Chroma)。有一堆科學家研究發現,人眼對UV的敏感度最低,是以可以極大比例地壓縮UV兩個通道的數值。見視訊編解碼學習一 yuv格式。
- 為了向前相容黑白電視。這個就涉及曆史原因了,非常推薦零基礎入門音視訊開發。曆史上在制定視訊幀格式時,是有人提出過用RGB的,最終決定用YUV
1. 顔色空間
“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度(Chrominance)、濃度(Chroma)。這裡表示的是色彩空間的基,即類似XYZ坐标系的一種色标表示基準,也就是說每一種顔色可以通過三維向量<yi,ui,vi>來表示。與其類似的還有RGB顔色空間、HSV顔色空間等。下圖來自How does the YUV color coding work?
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjcmbw5CN4kDZyQmNwYWZzUjZ2UzM1UzNzcjM4UWOyUDO0U2Y08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
随着通信行業的發展,實際應用之多之複雜,導緻『YUV』衍生出了一個大家族。接觸視訊領域的一定聽說過YCbCr,甚至還有YPbPr、YIQ等。它們有的已經被時代淘汰,有的現在還在使用。之是以出現『YUV』大家族,完全是因為實際電路系統之間的差異,導緻要從『YUV』轉到『RGB』空間,實際對應的轉化系數是有些許差異的,于是各個部門開始制定各種規範,才有了我們現在看到的『YUV』大家族。
YCbCr是專門針對數字電路而誕生的;YPbPr則是模拟電路。但是,現在是數字時代,是以為了模拟電路而生的YPbPr已經逐漸被淘汰了,而YCbCr還一直發揮着作用。是以現在,YCbCr有時也會被簡單地稱為/認為『YUV』。
2. 采樣率
讀者可能聽說過“YUV444”,“YUV422”,“YUV420”,到這裡可能會納悶:“YUV不是顔色空間嗎?為什麼後面還會跟着一串數字?” 因為當你看到YUV後面跟着一串數字的時候,『YUV』已經不再是顔色空間的基的含義了,而是意味着在原始『YUV流』上的采樣。
在以前流媒體剛剛興起時,還沒有什麼4G/5G,當時為了減小網絡傳輸的帶寬的壓力,可謂做了種種努力。除了編碼/壓縮之外,YUV采樣率也是一種。
444,422和420是三種『YUV』(在數字電路中指代YCbCr)的采樣,三位數分别代表Y\U\V(數字電路中為Y\Cb\Cr,本段後同)通道的抽樣比。是以可以了解,444是全采樣;而422是對Y進行全采樣,對U\V分别進行1/2均勻采樣。有趣的問題來了,420難道是完全丢棄了V通道/分量資料嘛?答案是否定的。
首先,必須要搞明白一個問題,一幀圖像是由一個個像素組成的矩形,譬如4x4的尺寸的圖像,就是由16個像素點組成的。在平時接觸的『RGB』圖像中,每個像素必然至少由R\G\B這三個通道組成的(有的圖像還有\alpha分量),每個分量的取值一般都是[0,255],也就是[20,28],是以經常說一個像素占用3位元組(如果還有其他分量,比如RGBA,就另當别論)。『YUV』圖像同理,它的每個像素是由Y\U\V組成的。
接下來,從整張圖像宏觀考慮采樣問題。還是以4X4的圖像為例,444的如下圖2-1,這個是形象化成圖像的樣子,實際在機器記憶體儲并不是這樣,具體可以參見部落格《圖像原始格式一探究竟》。422和420分别如下圖2-2和2-3。
圖2-1. YUV444采樣示意圖
圖2-1對應YUV444采樣,即全采樣,圖示中可以看出每個像素中的Y\U\V通道都保留下來了,一般來說YUV444太大了,是以很少使用。
圖2-2. YUV422采樣示意圖
圖2-2對應YUV422采樣,這種采樣方式是:每個掃描線或者說每行相鄰2個像素,隻取1個像素的U\V分量。此外,可以計算出來,每個像素占用的大小為原來的2/3,是以說YUV422是YUV444的2/3大小。
這個時候就有一個問題,在『YUV』轉『RGB』時,被抽走了U\V分量的像素要怎麼辦呢?做法很簡單,就是相鄰2個像素的Y分量公用保留着的U\V分量。
圖2-2. YUV420采樣示意圖
圖2-3對應YUV420采樣,這種采樣方式是:隔行進行YUV422每行采樣的辦法,即相鄰2個像素隻取1個像素的U\V分量;下一行丢棄所有的U\V分量。此外,可以計算出來,每個像素占用的大小為原來的1/2,是以說YUV420是YUV444的1/2大小。恢複U\V分量的辦法同YUV422,隻不過這裡是2X2的矩陣共享保留着的U\V分量。
這種設計辦法真的很巧妙!前文提到的**“人眼對UV的敏感度最低,是以可以極大比例地壓縮UV兩個通道的數值”**,且對于圖像而言,相鄰的區域像素的色彩、飽和度一般非常接近,是以這種以2X2矩陣為基本機關,隻保留1組U\V分量合情合理。
3、編碼/存儲格式
大家肯定還聽說過YV12、YU12、NV12、NV21吧,看到這裡是不是又納悶:“後面的數字怎麼變成2個了?而且前面的英文字母還變了?”
以上統稱為『視訊的存儲格式』,也就是說,計算機是如何存儲一幀視訊的。
首先,『視訊的存儲格式』總分為兩大類:『打包格式(packed)』和『平面格式(planar)』。前者又被稱作『緊湊格式(packed)』。其實除此之外還有『半平面模式(Semi-Planar)』,估計是使用的比較少,是以在很多文章中常被忽略。
筆者很感興趣,為什麼會出現『打包格式』和『平面格式』兩大派系,網上搜了很多資料也沒找到原因,部落格【音視訊基礎】:I420、YV12、NV12、NV21等常見的YUV420存儲格式提到了需要約定存儲格式,但也沒提到為什麼會分成這兩種。要麼就是派系之争,類似貝葉斯學派和頻率學派;要麼就是實際應用中逐漸衍生出這兩大格式。時至今日,這兩個格式還在被使用,是以對于多媒體開發者們都有必要了解。
『打包格式』是把Y\U\V分量交叉存儲,『平面格式』則是把Y\U\V嚴格分開存儲,『半平面模式』介于兩者之間,Y分量分開存儲,U\V交叉存儲。
以下圖為例說明『打包格式』、『平面格式』和『半平面模式』應該是非常清楚的,圖摘自部落格YUV格式初探:
圖3-1. YUV420P存儲示意圖
圖3-2. YUV420SP存儲示意圖
圖3-3. YUV420Packet存儲示意圖
四、視訊編解碼
1、視訊編碼方式
- 視訊編碼的作用: 将視訊像素資料(RGB,YUV 等)壓縮成視訊碼流,進而降低視訊的資料量。
名稱 | 推出機構 | 推出時間 | 目前使用領域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研發中 |
H.264 | MPEG/ITU-T | 2003 | 各個領域 |
MPEG4 | MPEG | 2001 | 不溫不火 |
MPEG2 | MPEG | 1994 | 數字電視 |
VP9 | 2013 | 研發中 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微軟平台 |
常見的幀名詞
2、幀率(FPS)
『幀率』,FPS,全稱Frames Per Second。指每秒傳輸的幀數,或者每秒顯示的幀數,一般來說,『幀率』影響畫面流暢度,且成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。一個較權威的說法:
當視訊幀率不低于24fps時,人眼才會覺得視訊時連貫的,稱為“視覺暫留”現象。
是以,才有說法:盡管『幀率』越高越流暢,但在很多實際應用場景中24fps就可以了。
3、分辨率(Resolution)
『分辨率』,也常被俗稱為『圖像的尺寸』或者『圖像的大小』。指一幀圖像包含的像素的多少,常見有1280x720(720P),1920X1080(1080P)等規格。『分辨率』影響圖像大小,且與之成正比:『分辨率』越高,圖像越大;反之,圖像越小。
4、碼率(BPS)
『碼率』,BPS,全稱Bits Per Second。指每秒傳送的資料位數,常見機關KBPS(千位每秒)和MBPS(兆位每秒)。筆者認為這個概念真正要了解起來還是需要好好說明的,網上一說:“『碼率』與體積成正比:碼率越大,體積越大;碼率越小,體積越小”;另一說:“『碼率』越大,說明機關時間内取樣率越大,資料流精度就越高,這樣表現出來的的效果就是:視訊畫面更清晰畫質更高”;還有說法是:”『碼率』就是『失真度』“。但是筆者有一段時間就是不了解,每秒傳輸的資料越大,為什麼必然就對應畫面更清晰?還有體積怎麼了解呢?且看下文”三者之間的關系“。
『幀率』『分辨率』和『碼率』三者之間的關系
最理想的情況是畫面越清晰、越流暢是最好的。但在實際應用中,還需要結合硬體的處理能力、實際帶寬條件選擇。高『幀率』高『分辨率』,也就意味着高『碼率』,也意味着需要高帶寬和強大的硬體能力進行編解碼和圖像處理。是以『幀率』和『分辨率』應該視情況而定。
要說三者之間的關系,其實就是對于『碼率』的了解。在**碼率(BPS)**概念中提到了幾段摘自網上的說法,說的都太模糊了,筆者直到閱讀了文章Video Bitrate Vs. Frame Rate,才真的了解了『碼率』。
參考
https://zhuanlan.zhihu.com/p/61747783