parameters H.264 स्ट्रीम के लिए अनुक्रम/चित्र पैरामीटर सेट(ओं) के लिए संभावित स्थान



set mp4 (1)

सबसे पहले, यह समझना महत्वपूर्ण है कि कोई एकल मानक H.264 प्राथमिक बिटस्ट्रीम प्रारूप नहीं है। विनिर्देश दस्तावेज़ में एनेक्स होता है, विशेष रूप से अनुलग्नक बी, जो एक संभावित प्रारूप का वर्णन करता है, लेकिन यह वास्तविक आवश्यकता नहीं है। मानक निर्दिष्ट करता है कि वीडियो को अलग-अलग पैकेट में कैसे एन्कोड किया जाता है। इन पैकेट को कैसे संग्रहीत किया जाता है और प्रेषित किया जाता है, यह इंटीग्रेटर के लिए खुला रहता है।

1. अनुलग्नक बी

नेटवर्क एब्स्ट्रक्शन लेयर इकाइयों

पैकेट को नेटवर्क एब्स्ट्रक्शन लेयर यूनिट कहा जाता है। अक्सर संक्षेप में एनयूएल (या कभी-कभी केवल एनएएल) प्रत्येक पैकेट को व्यक्तिगत रूप से पार्स और संसाधित किया जा सकता है। प्रत्येक एनयूएल के पहले बाइट में एनयूएल प्रकार होता है, विशेष रूप से 3 से 7 बिट्स (बिट 0 हमेशा बंद रहता है, और बिट्स 1-2 इंगित करता है कि एक एनयूएल को किसी अन्य एनयूएल द्वारा संदर्भित किया जाता है)।

दो श्रेणियों, वीसीएल और गैर-वीसीएल में विभाजित 1 9 विभिन्न एनयूएल प्रकार परिभाषित किए गए हैं:

  • वीसीएल, या वीडियो कोडिंग लेयर पैकेट में वास्तविक दृश्य जानकारी होती है।
  • गैर-वीसीएल में मेटाडेटा होता है जो वीडियो को डीकोड करने की आवश्यकता हो सकती है या नहीं।

एक एकल NALU, या यहां तक ​​कि एक वीसीएल NALU एक फ्रेम के समान नहीं है। कई फ्रेमों में एक फ्रेम 'कटा हुआ' किया जा सकता है। जैसे आप एक पिज्जा टुकड़ा कर सकते हैं। एक या अधिक स्लाइस को तब वर्च यूनिट्स (एयू) में समूहीकृत किया जाता है जिसमें एक फ्रेम होता है। स्लाइसिंग थोड़ी सी गुणवत्ता वाली लागत पर आती है, इसलिए इसका अक्सर उपयोग नहीं किया जाता है।

नीचे सभी परिभाषित एनयूएल की एक तालिका है।

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

कुछ एनयूएल प्रकार हैं जहां ज्ञान का ज्ञान बाद में उपयोगी हो सकता है।

  • अनुक्रम पैरामीटर सेट (एसपीएस)। इस गैर-वीसीएल एनयूएल में प्रोफाइल, स्तर, रिज़ॉल्यूशन, फ्रेम दर जैसे डीकोडर को कॉन्फ़िगर करने के लिए आवश्यक जानकारी होती है।
  • चित्र पैरामीटर सेट (पीपीएस)। एसपीएस के समान, इस गैर-वीसीएल में एन्ट्रॉपी कोडिंग मोड, स्लाइस समूह, गति भविष्यवाणी और डिबॉकिंग फ़िल्टर पर जानकारी शामिल है।
  • तत्काल डिकोडर रीफ्रेश (आईडीआर)। यह वीसीएल न्यूल एक स्वयं निहित छवि टुकड़ा है। यही है, किसी भी अन्य एनयूएल सेव एसपीएस और पीपीएस संदर्भित किए बिना आईडीआर को डीकोड और प्रदर्शित किया जा सकता है।
  • एक्सेस यूनिट डिलीमीटर (एयूडी)। एक एयूडी एक वैकल्पिक एनयूएल है जिसका प्रयोग प्राथमिक धारा में फ्रेम को सीमित करने के लिए किया जा सकता है। यह आवश्यक नहीं है (जब तक अन्यथा कंटेनर / प्रोटोकॉल, टीएस की तरह नहीं कहा जाता है), और अक्सर अंतरिक्ष को बचाने के लिए शामिल नहीं किया जाता है, लेकिन यह प्रत्येक एनयूएल को पूरी तरह से पार्स किए बिना फ्रेम की शुरुआत को खोजने के लिए उपयोगी हो सकता है।

एनयूएल स्टार्ट कोड

एक एनयूएल में इसका आकार नहीं होता है। इसलिए बस एक धारा बनाने के लिए एनयूएल को संयोजित करना काम नहीं करेगा क्योंकि आप नहीं जान पाएंगे कि कोई कहां रुकता है और अगला शुरू होता है।

अनुलग्नक बी विनिर्देश प्रत्येक एनयूएल से पहले 'प्रारंभ कोड' की आवश्यकता के द्वारा हल करता है। एक प्रारंभ कोड 2 या 3 0x00 बाइट्स 0x01 बाइट के साथ होता है। उदाहरण के लिए 0x000001 या 0x00000001

4 बाइट भिन्नता एक धारावाहिक कनेक्शन पर संचरण के लिए उपयोगी है क्योंकि यह 31 शून्य बिट्स की तलाश करके धारा को संरेखित करने के लिए छोटा है। यदि अगला बिट 0 है (क्योंकि प्रत्येक NALU 0 बिट के साथ शुरू होता है), यह एक NALU की शुरुआत है। 4 बाइट भिन्नता आमतौर पर केवल एसपीएस पीपीएस एयूडी और आईडीआर जैसे स्ट्रीम में यादृच्छिक अभिगम बिंदुओं को संकेत देने के लिए उपयोग की जाती है, जहां अंतरिक्ष को बचाने के लिए हर जगह 3 बाइट भिन्नता का उपयोग किया जाता है।

इम्यूलेशन रोकथाम बाइट्स

कोड शुरू करें क्योंकि चार बाइट अनुक्रम 0x000000 , 0x000002 , 0x000002 और 0x000003 गैर-आरबीएसपी एनयूएल के भीतर अवैध हैं। तो जब एक एनयूएल बनाते हैं, इन मूल्यों से बचने के लिए देखभाल की जाती है जो अन्यथा प्रारंभ कोड से भ्रमित हो सकती है। यह 'इम्यूलेशन रोकथाम' बाइट 0x03 डालने से पूरा किया जाता है, ताकि 0x00000301 बन 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 इन पदों पर होगा। इसके बाद आपको एक पीपीएस (पीपीएस 68 के साथ शुरू होता है) और एक अंतिम प्रारंभ कोड के बाद एक आईडीआर स्लाइस के बाद एक प्रारंभ कोड दिखाई देगा। यह एक पूर्ण H.264 धारा है। यदि आप इन मानों को एक हेक्स संपादक में टाइप करते हैं और फ़ाइल को .264 एक्सटेंशन से सहेजते हैं, तो आप इसे इस छवि में कनवर्ट करने में सक्षम होंगे:

अनुलग्नक बी आमतौर पर लाइव स्ट्रीमिंग प्रारूपों जैसे परिवहन धाराओं, वायु प्रसारण और डीवीडी पर उपयोग किया जाता है। इन प्रारूपों में समय-समय पर एसपीएस और पीपीएस को दोहराना आम है, आमतौर पर प्रत्येक आईडीआर से पहले डीकोडर के लिए यादृच्छिक अभिगम बिंदु बनाते हैं। यह पहले से ही प्रगति पर स्ट्रीम में शामिल होने की क्षमता को सक्षम बनाता है।

2. एवीसीसी

H.264 स्ट्रीम संग्रहीत करने की अन्य सामान्य विधि AVCC प्रारूप है। इस प्रारूप में, प्रत्येक एनयूएल इसकी लंबाई (बड़े एंडियन प्रारूप में) से पहले है। इस विधि को पार्स करना आसान है, लेकिन आप एनेक्स बी की बाइट संरेखण सुविधाओं को खो देते हैं। बस चीजों को जटिल करने के लिए, लंबाई 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

ऊपर दिए गए एक ही उदाहरण का उपयोग करते हुए, एवीसीसी एक्स्ट्राडाटा इस तरह दिखेगा:

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

आप देखेंगे कि एसपीएस और पीपीएस अब बैंड से बाहर संग्रहित है। वह है, प्राथमिक धारा डेटा से अलग है। इस डेटा का संग्रहण और संचरण फ़ाइल कंटेनर का काम है, और इस दस्तावेज़ के दायरे से बाहर है। ध्यान दें कि भले ही हम प्रारंभ कोड का उपयोग नहीं कर रहे हैं, इम्यूलेशन रोकथाम बाइट अभी भी डाले गए हैं।

इसके अतिरिक्त, NALULengthSizeMinusOne नामक एक नया चर है। यह भ्रमित रूप से नामित चर हमें बताता है कि प्रत्येक एनयूएल की लंबाई को स्टोर करने के लिए कितने बाइट्स का उपयोग करना है। इसलिए, यदि NALULengthSizeMinusOne को 0 पर सेट किया गया है, तो प्रत्येक NALU एक लंबाई से पहले एक बाइट के साथ होता है। आकार को स्टोर करने के लिए एक बाइट का उपयोग करके, एनयूएल का अधिकतम आकार 255 बाइट है। यह स्पष्ट रूप से बहुत छोटा है। एक पूरे कुंजी फ्रेम के लिए रास्ता बहुत छोटा है। 2 बाइट्स का उपयोग करके हमें प्रति एनएलयू 64k देता है। यह हमारे उदाहरण में काम करेगा, लेकिन अभी भी एक बहुत कम सीमा है। 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

इस प्रारूप का लाभ शुरुआत में डिकोडर को कॉन्फ़िगर करने और स्ट्रीम के बीच में कूदने की क्षमता है। यह एक आम उपयोग केस है जहां मीडिया एक हार्ड ड्राइव जैसे यादृच्छिक एक्सेस माध्यम पर उपलब्ध है, और इसलिए एमपी 4 और एमकेवी जैसे सामान्य कंटेनर प्रारूपों में उपयोग किया जाता है।

मैं एक H.264 डिकोडर पर काम कर रहा हूं और मैं सोच रहा हूं कि एसपीएस और पीपीएस कहां खोजें। मेरा संदर्भ साहित्य मुझे बताता है कि एच 2264-स्ट्रीम में एनएएल इकाइयों को एन्कोड किया गया है, लेकिन जब मैं आईएसवीवीयर के साथ एक उदाहरण-एमपी 4-फाइल को देखता हूं, तो यह कहता है कि एसपीएस और पीपीएस एवीसीसी बॉक्स में हैं।

यह वास्तव में कैसे काम करता है? यह एमएमवी फाइलों या अन्य H.264 कंटेनर के लिए कैसे दिखता है?

अग्रिम में धन्यवाद!