對於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×96@30.9 (8) 176×144@15.0 (4) |
| 1b |
1,485 |
99 |
128 |
160 |
384 |
512 |
128×96@30.9 (8) 176×144@15.0 (4) |
| 1.1 |
3,000 |
396 |
192 |
240 |
576 |
768 |
176×144@30.3 (9) 320×240@10.0 (3) 352×288@7.5 (2) |
| 1.2 |
6,000 |
396 |
384 |
480 |
1,152 |
1,536 |
320×240@20.0 (7) 352×288@15.2 (6) |
| 1.3 |
11,880 |
396 |
768 |
960 |
2,304 |
3,072 |
320×240@36.0 (7) 352×288@30.0 (6) |
| 2 |
11,880 |
396 |
2,000 |
2,500 |
6,000 |
8,000 |
320×240@36.0 (7) 352×288@30.0 (6) |
| 2.1 |
19,800 |
792 |
4,000 |
5,000 |
12,000 |
16,000 |
352×480@30.0 (7) 352×576@25.0 (6) |
| 2.2 |
20,250 |
1,620 |
4,000 |
5,000 |
12,000 |
16,000 |
352×480@30.7(10) 352×576@25.6 (7) 720×480@15.0 (6) 720×576@12.5 (5) |
| 3 |
40,500 |
1,620 |
10,000 |
12,500 |
30,000 |
40,000 |
352×480@61.4 (12) 352×576@51.1 (10) 720×480@30.0 (6) 720×576@25.0 (5) |
| 3.1 |
108,000 |
3,600 |
14,000 |
17,500 |
42,000 |
56,000 |
720×480@80.0 (13) 720×576@66.7 (11) 1280×720@30.0 (5) |
| 3.2 |
216,000 |
5,120 |
20,000 |
25,000 |
60,000 |
80,000 |
1,280×720@60.0 (5) 1,280×1,024@42.2 (4) |
| 4 |
245,760 |
8,192 |
20,000 |
25,000 |
60,000 |
80,000 |
1,280×720@68.3 (9) 1,920×1,080@30.1 (4) 2,048×1,024@30.0 (4) |
| 4.1 |
245,760 |
8,192 |
50,000 |
62,500 |
150,000 |
200,000 |
1,280×720@68.3 (9) 1,920×1,080@30.1 (4) 2,048×1,024@30.0 (4) |
| 4.2 |
522,240 |
8,704 |
50,000 |
62,500 |
150,000 |
200,000 |
1,920×1,080@64.0 (4) 2,048×1,080@60.0 (4) |
| 5 |
589,824 |
22,080 |
135,000 |
168,750 |
405,000 |
540,000 |
1,920×1,080@72.3 (13) 2,048×1,024@72.0 (13) 2,048×1,080@67.8 (12) 2,560×1,920@30.7 (5) 3,680×1,536@26.7 (5) |
| 5.1 |
983,040 |
36,864 |
240,000 |
300,000 |
720,000 |
960,000 |
1,920×1,080@120.5 (16) 4,096×2,048@30.0 (5) 4,096×2,304@26.7 (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 下呢?
(完)
參考文獻
~~~~~~~~
http://en.wikipedia.org/wiki/H.264
H.264/MPEG-4 AVC