सबसे पहले, यह समझना महत्वपूर्ण है कि कोई एकल मानक H.264 प्राथमिक बिटस्ट्रीम प्रारूप नहीं है। विनिर्देश दस्तावेज़ में एक अनुलग्नक होता है, विशेष रूप से अनुलग्नक बी, जो एक संभावित प्रारूप का वर्णन करता है, लेकिन यह एक वास्तविक आवश्यकता नहीं है। मानक निर्दिष्ट करता है कि वीडियो को अलग-अलग पैकेट में कैसे एन्कोड किया गया है। इन पैकेटों को कैसे संग्रहीत किया जाता है और कैसे प्रेषित किया जाता है, इसे इंटीग्रेटर के पास खुला छोड़ दिया जाता है।
1. एनेक्स बी
नेटवर्क अमूर्त परत इकाइयों
पैकेट को नेटवर्क एब्स्ट्रेक्शन लेयर यूनिट कहा जाता है। अक्सर संक्षिप्त NALU (या कभी-कभी केवल NAL) प्रत्येक पैकेट को व्यक्तिगत रूप से पार्स और संसाधित किया जा सकता है। प्रत्येक NALU के पहले बाइट में NALU प्रकार होता है, विशेष रूप से 3 बिट्स के माध्यम से 7. (बिट 0 हमेशा बंद रहता है, और बिट्स 1-2 इंगित करता है कि क्या NALU किसी अन्य NALU द्वारा संदर्भित है)।
19 अलग-अलग NALU प्रकार दो श्रेणियों, VCL और गैर- VCL में अलग-अलग परिभाषित किए गए हैं:
- VCL या वीडियो कोडिंग लेयर पैकेट में वास्तविक दृश्य जानकारी होती है।
- गैर-वीसीएल में मेटाडेटा होता है जो वीडियो को डीकोड करने के लिए आवश्यक हो सकता है या नहीं।
एक एकल NALU, या यहां तक कि एक VCL NALU एक फ्रेम के रूप में एक ही बात नहीं है। एक फ्रेम कई NALU में 'कटा हुआ' हो सकता है। जैसे आप पिज्जा को स्लाइस कर सकते हैं। एक या अधिक स्लाइस को वस्तुतः एक एक्सेस यूनिट (एयू) में वर्गीकृत किया जाता है जिसमें एक फ्रेम होता है। स्लाइसिंग थोड़ी गुणवत्ता वाली लागत पर आती है, इसलिए इसका उपयोग अक्सर नहीं किया जाता है।
नीचे सभी परिभाषित NALUs की एक तालिका है।
0 Unspecified non-VCL
1 Coded slice of a non-IDR picture VCL
2 Coded slice data partition A VCL
3 Coded slice data partition B VCL
4 Coded slice data partition C VCL
5 Coded slice of an IDR picture VCL
6 Supplemental enhancement information (SEI) non-VCL
7 Sequence parameter set non-VCL
8 Picture parameter set non-VCL
9 Access unit delimiter non-VCL
10 End of sequence non-VCL
11 End of stream non-VCL
12 Filler data non-VCL
13 Sequence parameter set extension non-VCL
14 Prefix NAL unit non-VCL
15 Subset sequence parameter set non-VCL
16 Depth parameter set non-VCL
17..18 Reserved non-VCL
19 Coded slice of an auxiliary coded picture without partitioning non-VCL
20 Coded slice extension non-VCL
21 Coded slice extension for depth view components non-VCL
22..23 Reserved non-VCL
24..31 Unspecified non-VCL
NALU प्रकार के एक जोड़े हैं जहाँ ज्ञान हो सकता है बाद में मददगार हो सकता है।
- अनुक्रम पैरामीटर सेट (एसपीएस)। इस गैर-वीसीएल एनएलयू में प्रोफ़ाइल, स्तर, रिज़ॉल्यूशन, फ्रेम दर जैसे डिकोडर को कॉन्फ़िगर करने के लिए आवश्यक जानकारी है।
- पिक्चर पैरामीटर सेट (PPS)। एसपीएस की तरह, इस गैर-वीसीएल में एन्ट्रापी कोडिंग मोड, स्लाइस ग्रुप, मोशन प्रेडिक्शन और डेबलॉक फिल्टर की जानकारी है।
- तात्कालिक विकोडक ताज़ा (IDR)। यह VCL NALU एक आत्म निहित छवि टुकड़ा है। यही है, एक आईडीआर को डीपीएस और पीपीएस बचाने के लिए किसी अन्य एनएलयू को संदर्भित किए बिना डिकोड किया जा सकता है और प्रदर्शित किया जा सकता है।
- एक्सेस यूनिट डेलिमिटर (एयूडी)। एयूडी एक वैकल्पिक एनएलयू है जिसका उपयोग प्रारंभिक धारा में फ्रेम को परिसीमित करने के लिए किया जा सकता है। यह आवश्यक नहीं है (जब तक कि टीएस (कंटेनर की तरह प्रोटोकॉल द्वारा अन्यथा न कहा गया हो), और अंतरिक्ष को बचाने के लिए अक्सर शामिल नहीं किया जाता है, लेकिन यह पूरी तरह से प्रत्येक एनएलयू को पार्स किए बिना एक फ्रेम की शुरुआत का पता लगाने के लिए उपयोगी हो सकता है।
NALU प्रारंभ कोड
एक NALU सम्मिलित नहीं है इसका आकार है। इसलिए केवल NALUs बनाने के लिए एक धारा बनाने से काम नहीं चलेगा क्योंकि आप नहीं जान पाएंगे कि कोई कहां रुकता है और अगला शुरू होता है।
अनुलग्नक B विनिर्देशन प्रत्येक NALU से पहले 'स्टार्ट कोड' की आवश्यकता को हल करता है। एक बाइट के 0x00
साथ एक स्टार्ट कोड 2 या 3 बाइट्स होता है 0x01
। जैसे 0x000001
या 0x00000001
।
धारावाहिक कनेक्शन पर प्रसारण के लिए 4 बाइट भिन्नता उपयोगी है क्योंकि यह एक के बाद 31 शून्य बिट्स की तलाश में धारा को बाइट करने के लिए तुच्छ है। यदि अगला बिट 0 है (क्योंकि प्रत्येक एनएलयू 0 बिट से शुरू होता है), यह एनएलयू की शुरुआत है। 4 बाइट भिन्नता का उपयोग आम तौर पर धारा में यादृच्छिक अभिगम बिंदुओं जैसे कि एसपीएस पीपीएस एयूडी और आईडीआर के लिए किया जाता है जहां 3 बाइट भिन्नता का उपयोग अंतरिक्ष को बचाने के लिए हर जगह किया जाता है।
अनुकरण रोकथाम बाइट्स
प्रारंभ कोड के काम करने की वजह से चार बाइट दृश्यों 0x000000
, 0x000001
, 0x000002
और0x000003
एक गैर RBSP Nalu भीतर अवैध हैं। इसलिए NALU बनाते समय, इन मूल्यों से बचने के लिए ध्यान रखा जाता है जो अन्यथा एक प्रारंभ कोड के साथ भ्रमित हो सकते हैं। यह एक 'एमुनेशन प्रिवेंशन' बाइट डालकर पूरा किया जाता है 0x03
, इसलिए यह 0x000001
बन जाता है 0x00000301
।
जब डिकोडिंग करते हैं, तो इम्यूशन रोकथाम बाइट्स को देखना और अनदेखा करना महत्वपूर्ण है। क्योंकि एमुलेशन की रोकथाम बाइट्स एक एनएलयू के भीतर लगभग कहीं भी हो सकती हैं, यह अक्सर प्रलेखन में अधिक सुविधाजनक होता है मान लें कि उन्हें पहले ही हटा दिया गया है। एमुलेशन रोकथाम बाइट्स के बिना एक प्रतिनिधित्व को रॉ बाइट सीक्वेंस पेलोड (आरबीएसपी) कहा जाता है।
उदाहरण
आइए एक संपूर्ण उदाहरण देखें।
0x0000 | 00 00 00 01 67 64 00 0A AC 72 84 44 26 84 00 00
0x0010 | 03 00 04 00 00 03 00 CA 3C 48 96 11 80 00 00 00
0x0020 | 01 68 E8 43 8F 13 21 30 00 00 01 65 88 81 00 05
0x0030 | 4E 7F 87 DF 61 A5 8B 95 EE A4 E9 38 B7 6A 30 6A
0x0040 | 71 B9 55 60 0B 76 2E B5 0E E4 80 59 27 B8 67 A9
0x0050 | 63 37 5E 82 20 55 FB E4 6A E9 37 35 72 E2 22 91
0x0060 | 9E 4D FF 60 86 CE 7E 42 B7 95 CE 2A E1 26 BE 87
0x0070 | 73 84 26 BA 16 36 F4 E6 9F 17 DA D8 64 75 54 B1
0x0080 | F3 45 0C 0B 3C 74 B3 9D BC EB 53 73 87 C3 0E 62
0x0090 | 47 48 62 CA 59 EB 86 3F 3A FA 86 B5 BF A8 6D 06
0x00A0 | 16 50 82 C4 CE 62 9E 4E E6 4C C7 30 3E DE A1 0B
0x00B0 | D8 83 0B B6 B8 28 BC A9 EB 77 43 FC 7A 17 94 85
0x00C0 | 21 CA 37 6B 30 95 B5 46 77 30 60 B7 12 D6 8C C5
0x00D0 | 54 85 29 D8 69 A9 6F 12 4E 71 DF E3 E2 B1 6B 6B
0x00E0 | BF 9F FB 2E 57 30 A9 69 76 C4 46 A2 DF FA 91 D9
0x00F0 | 50 74 55 1D 49 04 5A 1C D6 86 68 7C B6 61 48 6C
0x0100 | 96 E6 12 4C 27 AD BA C7 51 99 8E D0 F0 ED 8E F6
0x0110 | 65 79 79 A6 12 A1 95 DB C8 AE E3 B6 35 E6 8D BC
0x0120 | 48 A3 7F AF 4A 28 8A 53 E2 7E 68 08 9F 67 77 98
0x0130 | 52 DB 50 84 D6 5E 25 E1 4A 99 58 34 C7 11 D6 43
0x0140 | FF C4 FD 9A 44 16 D1 B2 FB 02 DB A1 89 69 34 C2
0x0150 | 32 55 98 F9 9B B2 31 3F 49 59 0C 06 8C DB A5 B2
0x0160 | 9D 7E 12 2F D0 87 94 44 E4 0A 76 EF 99 2D 91 18
0x0170 | 39 50 3B 29 3B F5 2C 97 73 48 91 83 B0 A6 F3 4B
0x0180 | 70 2F 1C 8F 3B 78 23 C6 AA 86 46 43 1D D7 2A 23
0x0190 | 5E 2C D9 48 0A F5 F5 2C D1 FB 3F F0 4B 78 37 E9
0x01A0 | 45 DD 72 CF 80 35 C3 95 07 F3 D9 06 E5 4A 58 76
0x01B0 | 03 6C 81 20 62 45 65 44 73 BC FE C1 9F 31 E5 DB
0x01C0 | 89 5C 6B 79 D8 68 90 D7 26 A8 A1 88 86 81 DC 9A
0x01D0 | 4F 40 A5 23 C7 DE BE 6F 76 AB 79 16 51 21 67 83
0x01E0 | 2E F3 D6 27 1A 42 C2 94 D1 5D 6C DB 4A 7A E2 CB
0x01F0 | 0B B0 68 0B BE 19 59 00 50 FC C0 BD 9D F5 F5 F8
0x0200 | A8 17 19 D6 B3 E9 74 BA 50 E5 2C 45 7B F9 93 EA
0x0210 | 5A F9 A9 30 B1 6F 5B 36 24 1E 8D 55 57 F4 CC 67
0x0220 | B2 65 6A A9 36 26 D0 06 B8 E2 E3 73 8B D1 C0 1C
0x0230 | 52 15 CA B5 AC 60 3E 36 42 F1 2C BD 99 77 AB A8
0x0240 | A9 A4 8E 9C 8B 84 DE 73 F0 91 29 97 AE DB AF D6
0x0250 | F8 5E 9B 86 B3 B3 03 B3 AC 75 6F A6 11 69 2F 3D
0x0260 | 3A CE FA 53 86 60 95 6C BB C5 4E F3
यह एक पूर्ण एयू है जिसमें 3 एनएलयू हैं। जैसा कि आप देख सकते हैं, हम एक एसपीएस (एसपीएस 67 के साथ शुरू होता है) के बाद एक स्टार्ट कोड से शुरू करते हैं। एसपीएस के भीतर, आपको दो एमुलेशन प्रिवेंशन बाइट्स दिखाई देंगे। इन बाइट्स के बिना इन 0x000000
पदों पर अवैध अनुक्रम होगा। इसके बाद आपको एक प्रारंभ कोड दिखाई देगा जिसके बाद एक PPS (PPS 68 से शुरू होता है) और एक अंतिम प्रारंभ कोड के बाद एक IDR स्लाइस होता है। यह एक पूर्ण H.264 धारा है। यदि आप इन मानों को एक हेक्स संपादक में टाइप करते हैं और फ़ाइल को .264
एक्सटेंशन के साथ सहेजते हैं , तो आप इसे इस छवि में परिवर्तित कर पाएंगे:
एनेक्स बी का उपयोग आमतौर पर लाइव और स्ट्रीमिंग प्रारूपों जैसे ट्रांसपोर्ट स्ट्रीम, एयर ब्रॉडकास्ट और डीवीडी में किया जाता है। इन प्रारूपों में एसपीएस और पीपीएस को समय-समय पर दोहराना आम है, आमतौर पर हर आईडीआर से पहले इस प्रकार डिकोडर के लिए एक यादृच्छिक पहुंच बिंदु का निर्माण होता है। यह एक स्ट्रीम में पहले से ही शामिल होने की क्षमता को सक्षम बनाता है।
2. एवीसीसी
H.264 स्ट्रीम को संग्रहीत करने का अन्य सामान्य तरीका AVCC प्रारूप है। इस प्रारूप में, प्रत्येक NALU अपनी लंबाई (बड़े एंडियन प्रारूप में) से पहले है। यह विधि पार्स करना आसान है, लेकिन आप अनुलग्नक बी की बाइट संरेखण विशेषताओं को खो देते हैं। बस चीजों को जटिल करने के लिए, लंबाई को 1, 2 या 4 बाइट्स का उपयोग करके एन्कोड किया जा सकता है। यह मान किसी शीर्ष लेख ऑब्जेक्ट में संग्रहीत है। इस हेडर को अक्सर 'एक्स्ट्राडाटा' या 'सीक्वेंस हेडर' कहा जाता है। इसका मूल प्रारूप इस प्रकार है:
bits
8 version ( always 0x01 )
8 avc profile ( sps[0][1] )
8 avc compatibility ( sps[0][2] )
8 avc level ( sps[0][3] )
6 reserved ( all bits on )
2 NALULengthSizeMinusOne
3 reserved ( all bits on )
5 number of SPS NALUs (usually 1)
repeated once per SPS:
16 SPS size
variable SPS NALU data
8 number of PPS NALUs (usually 1)
repeated once per PPS:
16 PPS size
variable PPS NALU data
उपरोक्त समान उदाहरण का उपयोग करते हुए, AVCC एक्सट्रैडाटा इस तरह दिखेगा:
0x0000 | 01 64 00 0A FF E1 00 19 67 64 00 0A AC 72 84 44
0x0010 | 26 84 00 00 03 00 04 00 00 03 00 CA 3C 48 96 11
0x0020 | 80 01 00 07 68 E8 43 8F 13 21 30
आप देखेंगे कि SPS और PPS अब बैंड से बाहर संग्रहीत हैं। यही है, प्राथमिक स्ट्रीम डेटा से अलग। इस डेटा का संग्रहण और प्रसारण फ़ाइल कंटेनर का काम है, और इस दस्तावेज़ के दायरे से परे है। ध्यान दें कि भले ही हम स्टार्ट कोड का उपयोग नहीं कर रहे हैं, लेकिन इम्यूशन प्रिवेंशन बाइट्स अभी भी डाले गए हैं।
इसके अतिरिक्त, एक नया चर कहा जाता है NALULengthSizeMinusOne
। यह भ्रमित नाम दिया चर हमें बताता है कि प्रत्येक NALU की लंबाई को संग्रहीत करने के लिए कितने बाइट्स का उपयोग करना है। इसलिए, यदि NALULengthSizeMinusOne
0 पर सेट किया गया है, तो प्रत्येक NALU एक ही बाइट से पहले होता है जो इसकी लंबाई दर्शाता है। आकार को संग्रहीत करने के लिए एकल बाइट का उपयोग करके, NALU का अधिकतम आकार 255 बाइट्स है। यह स्पष्ट रूप से बहुत छोटा है। पूरे मुख्य फ्रेम के लिए रास्ता बहुत छोटा है। 2 बाइट्स का उपयोग करने से हमें 64k प्रति NALU मिलता है। यह हमारे उदाहरण में काम करेगा, लेकिन अभी भी बहुत कम सीमा है। 3 बाइट्स परिपूर्ण होंगे, लेकिन किसी कारण से सार्वभौमिक रूप से समर्थित नहीं है। इसलिए, 4 बाइट्स अब तक सबसे आम है, और यह वही है जो हमने यहां इस्तेमाल किया है:
0x0000 | 00 00 02 41 65 88 81 00 05 4E 7F 87 DF 61 A5 8B
0x0010 | 95 EE A4 E9 38 B7 6A 30 6A 71 B9 55 60 0B 76 2E
0x0020 | B5 0E E4 80 59 27 B8 67 A9 63 37 5E 82 20 55 FB
0x0030 | E4 6A E9 37 35 72 E2 22 91 9E 4D FF 60 86 CE 7E
0x0040 | 42 B7 95 CE 2A E1 26 BE 87 73 84 26 BA 16 36 F4
0x0050 | E6 9F 17 DA D8 64 75 54 B1 F3 45 0C 0B 3C 74 B3
0x0060 | 9D BC EB 53 73 87 C3 0E 62 47 48 62 CA 59 EB 86
0x0070 | 3F 3A FA 86 B5 BF A8 6D 06 16 50 82 C4 CE 62 9E
0x0080 | 4E E6 4C C7 30 3E DE A1 0B D8 83 0B B6 B8 28 BC
0x0090 | A9 EB 77 43 FC 7A 17 94 85 21 CA 37 6B 30 95 B5
0x00A0 | 46 77 30 60 B7 12 D6 8C C5 54 85 29 D8 69 A9 6F
0x00B0 | 12 4E 71 DF E3 E2 B1 6B 6B BF 9F FB 2E 57 30 A9
0x00C0 | 69 76 C4 46 A2 DF FA 91 D9 50 74 55 1D 49 04 5A
0x00D0 | 1C D6 86 68 7C B6 61 48 6C 96 E6 12 4C 27 AD BA
0x00E0 | C7 51 99 8E D0 F0 ED 8E F6 65 79 79 A6 12 A1 95
0x00F0 | DB C8 AE E3 B6 35 E6 8D BC 48 A3 7F AF 4A 28 8A
0x0100 | 53 E2 7E 68 08 9F 67 77 98 52 DB 50 84 D6 5E 25
0x0110 | E1 4A 99 58 34 C7 11 D6 43 FF C4 FD 9A 44 16 D1
0x0120 | B2 FB 02 DB A1 89 69 34 C2 32 55 98 F9 9B B2 31
0x0130 | 3F 49 59 0C 06 8C DB A5 B2 9D 7E 12 2F D0 87 94
0x0140 | 44 E4 0A 76 EF 99 2D 91 18 39 50 3B 29 3B F5 2C
0x0150 | 97 73 48 91 83 B0 A6 F3 4B 70 2F 1C 8F 3B 78 23
0x0160 | C6 AA 86 46 43 1D D7 2A 23 5E 2C D9 48 0A F5 F5
0x0170 | 2C D1 FB 3F F0 4B 78 37 E9 45 DD 72 CF 80 35 C3
0x0180 | 95 07 F3 D9 06 E5 4A 58 76 03 6C 81 20 62 45 65
0x0190 | 44 73 BC FE C1 9F 31 E5 DB 89 5C 6B 79 D8 68 90
0x01A0 | D7 26 A8 A1 88 86 81 DC 9A 4F 40 A5 23 C7 DE BE
0x01B0 | 6F 76 AB 79 16 51 21 67 83 2E F3 D6 27 1A 42 C2
0x01C0 | 94 D1 5D 6C DB 4A 7A E2 CB 0B B0 68 0B BE 19 59
0x01D0 | 00 50 FC C0 BD 9D F5 F5 F8 A8 17 19 D6 B3 E9 74
0x01E0 | BA 50 E5 2C 45 7B F9 93 EA 5A F9 A9 30 B1 6F 5B
0x01F0 | 36 24 1E 8D 55 57 F4 CC 67 B2 65 6A A9 36 26 D0
0x0200 | 06 B8 E2 E3 73 8B D1 C0 1C 52 15 CA B5 AC 60 3E
0x0210 | 36 42 F1 2C BD 99 77 AB A8 A9 A4 8E 9C 8B 84 DE
0x0220 | 73 F0 91 29 97 AE DB AF D6 F8 5E 9B 86 B3 B3 03
0x0230 | B3 AC 75 6F A6 11 69 2F 3D 3A CE FA 53 86 60 95
0x0240 | 6C BB C5 4E F3
इस प्रारूप का एक लाभ डिकोडर को शुरू में कॉन्फ़िगर करने और एक धारा के बीच में कूदने की क्षमता है। यह एक सामान्य उपयोग का मामला है जहां मीडिया एक हार्ड ड्राइव जैसे यादृच्छिक अभिगम माध्यम पर उपलब्ध है, और इसलिए इसका उपयोग MP4 और MKV जैसे सामान्य कंटेनर स्वरूपों में किया जाता है।