對于H.264(MPEG-4 AVC)而言,級别(Level)是與檔次(Profile)同等重要的參數。但很多文章說的很簡略,隻是說标清視訊一般用3.1,高清用4,具體含義語焉不詳。于是我做了一番研究。
一、級别詳表
級别(Level)是用來限制 分辨率、幀率 和 碼率 的。詳細資訊請看表格——
Level | Max macroblocks | Max video bit rate (kbit/s) | Examples for high resolution @ frame rate (max stored frames) | ||||
per second | per frame | BP, XP, MP | HiP | Hi10P | Hi422P, Hi444PP | ||
1 | 1,485 | 99 | 64 | 80 | 192 | 256 | 128×[email protected] (8) 176×[email protected] (4) |
1b | 1,485 | 99 | 128 | 160 | 384 | 512 | 128×[email protected] (8) 176×[email protected] (4) |
1.1 | 3,000 | 396 | 192 | 240 | 576 | 768 | 176×[email protected] (9) 320×[email protected] (3) 352×[email protected] (2) |
1.2 | 6,000 | 396 | 384 | 480 | 1,152 | 1,536 | 320×[email protected] (7) 352×[email protected] (6) |
1.3 | 11,880 | 396 | 768 | 960 | 2,304 | 3,072 | 320×[email protected] (7) 352×[email protected] (6) |
2 | 11,880 | 396 | 2,000 | 2,500 | 6,000 | 8,000 | 320×[email protected] (7) 352×[email protected] (6) |
2.1 | 19,800 | 792 | 4,000 | 5,000 | 12,000 | 16,000 | 352×[email protected] (7) 352×[email protected] (6) |
2.2 | 20,250 | 1,620 | 4,000 | 5,000 | 12,000 | 16,000 | 352×[email protected](10) 352×[email protected] (7) 720×[email protected] (6) 720×[email protected] (5) |
3 | 40,500 | 1,620 | 10,000 | 12,500 | 30,000 | 40,000 | 352×[email protected] (12) 352×[email protected] (10) 720×[email protected] (6) 720×[email protected] (5) |
3.1 | 108,000 | 3,600 | 14,000 | 17,500 | 42,000 | 56,000 | 720×[email protected] (13) 720×[email protected] (11) 1280×[email protected] (5) |
3.2 | 216,000 | 5,120 | 20,000 | 25,000 | 60,000 | 80,000 | 1,280×[email protected] (5) 1,280×1,[email protected] (4) |
4 | 245,760 | 8,192 | 20,000 | 25,000 | 60,000 | 80,000 | 1,280×[email protected] (9) 1,920×1,[email protected] (4) 2,048×1,[email protected] (4) |
4.1 | 245,760 | 8,192 | 50,000 | 62,500 | 150,000 | 200,000 | 1,280×[email protected] (9) 1,920×1,[email protected] (4) 2,048×1,[email protected] (4) |
4.2 | 522,240 | 8,704 | 50,000 | 62,500 | 150,000 | 200,000 | 1,920×1,[email protected] (4) 2,048×1,[email protected] (4) |
5 | 589,824 | 22,080 | 135,000 | 168,750 | 405,000 | 540,000 | 1,920×1,[email protected] (13) 2,048×1,[email protected] (13) 2,048×1,[email protected] (12) 2,560×1,[email protected] (5) 3,680×1,[email protected] (5) |
5.1 | 983,040 | 36,864 | 240,000 | 300,000 | 720,000 | 960,000 | 1,920×1,[email protected] (16) 4,096×2,[email protected] (5) 4,096×2,[email protected] (5) |
Level:級别。
Max macroblocks:最大宏塊數。注:宏塊尺寸是16x16的。
per second:每秒(的最大宏塊數)。可用于限制幀率。
per frame:每幀(的最大宏塊數)。可用于限制分辨率。
Max video bit rate (kbit/s):最大視訊碼率。不同檔次(Profile)下會有差別。
BP:Baseline Profile,基線檔次。
XP:Extended Profile,進階檔次。
MP:Main Profile,主要檔次。
HiP:High Profile,進階檔次。
Hi10P:High 10 Profile,進階10位檔次。
Hi422P:High 4:2:2 Profile,進階4:2:2檔次。
Hi444PP:High 4:4:4 Predictive Profile,進階4:4:4(實驗性?)檔次。
Examples for high resolution @ frame rate (max stored frames):範例:高分辨率@幀率(最大存儲幀數)。
二、推算分辨率與幀率
在視訊壓制時,碼率的挑選是很容易判斷的。而分辨率與幀率 和 級别 的關系,就沒那麼明顯了。是以我們需要找到計算方法。
首先看看常見視訊分辨率所配套的級别——
480P(800x480):若幀率低于13.5用2.2,若幀率在13.5至27之間就用3,幀率高于27時用3.1。
720P(1280x720):一般為3.1。
1080P(1920x1080):一般為4。
可以看到480P(800x480)有點特殊,是以我以它為例來講解如何推算分辨率與幀率。
因宏塊尺寸是16x16的,我們根據此資訊計算出 水準宏塊數(PicWidthInMbs) 和 垂直宏塊數(FrameHeightInMbs)——
水準宏塊數 = ceil(視訊寬度 / 16) = ceil(800 / 16) = ceil(50.0) = 50
垂直宏塊數 = ceil(視訊高度 / 16) = ceil(480 / 16) = ceil(30.0) = 30
注:ceil(x)是向頂舍入函數,傳回的是大于等于x的最小整數。
然後計算每幀宏塊數(macroblocks per frame)——
每幀宏塊數 = 水準宏塊數 * 垂直宏塊數 = 50 * 30 = 1500
查上面的級别詳表,可知支援 每幀宏塊數1500 的最低級别是2.2。
級别2.2所允許的 每秒最大宏塊數(Max macroblocks per second) 是 20250。20250 / 1500 = 13.5。即最高支援每秒13.5幀。
提高一個級别,級别3所允許的 每秒最大宏塊數 是 40500。40500 / 1500 = 27。即最高支援每秒27幀。
再提高一個級别,級别3.1所允許的 每秒最大宏塊數 是 108000。108000 / 1500 = 72。即最高支援每秒72幀,夠用了。
當宏塊數超過級别的限制時,x264會顯示這樣的警告資訊——
x264 [warning]: frame MB size (120x68) > level limit (5120)
現在來做做練習題,鞏固一下所學知識吧——
1. 720P(1280x720)視訊在級别3.1下,最高支援每秒多少幀?
2. 1080P(1920x1080)視訊在級别4下,最高支援每秒多少幀?
三、最大存儲幀數、DPB 與 MaxDpbMbs
在前面的級别詳表中,還有一個神秘的字段——最大存儲幀數(max stored frames)。它是從何而來的呢?
最大存儲幀數與DPB有關——DPB:decoded picture buffer,解碼圖檔緩存區。在做視訊解碼時,需要将最近的若幹幅參考幀緩存起來,這個緩沖區就叫做DPB。是以最大存儲幀數也是最大參考幀數(ref)。DPB一般以宏塊數為機關(DpbMbs),計算公式為——
DpbMbs = ref(參考幀數) * PicWidthInMbs(水準宏塊數) * FrameHeightInMbs(垂直宏塊數)
在不同的級别(Level)下,最大的解碼圖檔緩存區宏塊數(MaxDpbMbs)是不同的——
Level | MaxDpbMbs |
1 | 396 |
1b | 396 |
1.1 | 900 |
1.2 | 2,376 |
1.3 | 2,376 |
2 | 2,376 |
2.1 | 4,752 |
2.2 | 8,100 |
3 | 8,100 |
3.1 | 18,000 |
3.2 | 20,480 |
4 | 32,768 |
4.1 | 32,768 |
4.2 | 34,816 |
5 | 110,400 |
5.1 | 184,320 |
我們可根據 MaxDpbMbs限制 倒推出 最大的參考幀數——
max_ref = min(floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)
注1:floor(x)是向底舍入函數,傳回的是小于等于x的最大整數。
注2:因參考幀數(ref)最大隻能為16。
練習題——
1. 720P(1280x720)視訊在級别3.1下,最高支援多少個參考幀(最大存儲幀數)?級别3.2、4 下呢?
2. 1080P(1920x1080)視訊在級别4下,最高支援多少個參考幀(最大存儲幀數)?級别5、5.1 下呢?
(完)
參考文獻