2009-12-24 15 views
24

में एमपीईजी 4/एच 264 आई-फ्रेम (आईडीआर) का पता लगाएं मुझे आरटीपी पैकेट में एमपीईजी 4 आई-फ्रेम का पता लगाने की आवश्यकता है। मुझे पता है कि आरटीपी हेडर को कैसे हटाया जाए और इसमें एमपीईजी 4 फ्रेम कैसे प्राप्त करें, लेकिन मैं समझ नहीं पा रहा हूं कि आई-फ्रेम की पहचान कैसे करें।आरटीपी धारा

क्या इसमें कोई विशिष्ट हस्ताक्षर/हेडर है?

उत्तर

30

ठीक है तो मैंने इसे H264 स्ट्रीम के लिए निकाला।

मैं कैसे फ़्रेम पता लगाने के लिए:

  • निकालें आरटीपी हैडर
  • जांच h264 पेलोड में पहली बाइट का मूल्य
  • अगर मूल्य 124 (0x7C) है यह एक मैं-फ्रेम है

मैं एमपीईजी 4-ईएस स्ट्रीम के लिए इसे समझ नहीं सकता ... कोई सुझाव?

संपादित करें: H264 IDR

यह मेरी h264 धारा (fmtp:96 packetization-mode=1; profile-level-id=420029;) के लिए काम करता है। आप बस बाइट सरणी पास करते हैं जो आरटीपी के माध्यम से प्राप्त एच 264 खंड का प्रतिनिधित्व करता है। यदि आप संपूर्ण आरटीपी पास करना चाहते हैं, तो आरटीपी हेडर को छोड़ने के लिए RTPHeaderBytes मान को सही करें। मुझे हमेशा आई-फ्रेम मिलता है, क्योंकि यह एकमात्र फ्रेम है जिसे खंडित किया जा सकता है, here देखें। मैं अपने सर्वर में कोड के इस (सरलीकृत) टुकड़े का उपयोग करता हूं, और यह एक आकर्षण की तरह काम करता है !!!! यदि I-Frame (IDR) खंडित नहीं है, तो fragment_type 5 होगा, इसलिए यह कोड खंडित और खंडित आईडीआर के लिए true वापस करेगा।

public static bool isH264iFrame(byte[] paket) 
    { 
     int RTPHeaderBytes = 0; 

     int fragment_type = paket[RTPHeaderBytes + 0] & 0x1F; 
     int nal_type = paket[RTPHeaderBytes + 1] & 0x1F; 
     int start_bit = paket[RTPHeaderBytes + 1] & 0x80; 

     if (((fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128) || fragment_type == 5) 
     { 
      return true; 
     } 

     return false; 
    } 

यहाँ एनएएल इकाई प्रकार के टेबल है:

Type Name 
    0 [unspecified] 
    1 Coded slice 
    2 Data Partition A 
    3 Data Partition B 
    4 Data Partition C 
    5 IDR (Instantaneous Decoding Refresh) Picture 
    6 SEI (Supplemental Enhancement Information) 
    7 SPS (Sequence Parameter Set) 
    8 PPS (Picture Parameter Set) 
    9 Access Unit Delimiter 
    10 EoS (End of Sequence) 
    11 EoS (End of Stream) 
    12 Filter Data 
13-23 [extended] 
24-31 [unspecified] 

संपादित करें 2: MPEG4 मैं-VOP

मैं चे और ISO IEC 14496-2 दस्तावेज़ में अद्यतन करने के लिए इस ... Thanx भूल गया, मैं इसे काम करने में कामयाब रहा! चे संस्कार उसके जवाब में इतना सटीक था, लेकिन नहीं ... इसलिए यहाँ मैं, पी और बी फ्रेम (आई-VOP, पी VOP, बी VOP) संक्षेप में लगाने के लिए कैसे है:

  1. VOP (वीडियो ऑब्जेक्ट प्लेन - फ्रेम) कोड 000001B6 (हेक्स) से शुरू होता है। यह सभी एमपीईजी 4 फ्रेम (आई, पी, बी)
  2. अगला कई और जानकारी का पालन करता है, कि मैं यहां वर्णन नहीं कर रहा हूं (आईईसी दस्तावेज़ देखें), लेकिन हम केवल (जैसा कि कहा जाता है) की आवश्यकता है निम्नलिखित बाइट से उच्च 2 बिट्स (B6 मान के साथ बाइट के बाद अगले दो बिट्स)। उन 2 बिट्स आप VOP_CODING_TYPE बताओ, तालिका देखें:

    VOP_CODING_TYPE (binary) Coding method 
             00 intra-coded (I) 
             01 predictive-coded (P) 
             10 bidirectionally-predictive-coded (B) 
             11 sprite (S) 
    

तो, मैं-फ्रेम पैकेट चार बाइट्स 000001B6 और अगले बाइट 00 के उच्च दो टुकड़े होने के साथ शुरू लगता है खोजने के लिए। यह मुझे एक साधारण वीडियो ऑब्जेक्ट प्रकार (उन्नत सरल के लिए सुनिश्चित नहीं) के साथ एमपीईजी 4 स्ट्रीम में फ्रेम मिलेगा।

किसी अन्य समस्या के लिए, आप दिए गए दस्तावेज़ (ISO IEC 14496-2) देख सकते हैं, आप एमपीईजी 4 के बारे में जानना चाहते हैं।:)

+4

सही (यहां तक ​​कि बंद नहीं) नहीं है यही कारण है कि। यह उन धाराओं के लिए काम हो सकता है जिन्हें आप देख रहे हैं। आईईटीएफ में आरएफसी 3984 (जल्द ही 3 9 84bis के साथ प्रतिस्थापित किया जाएगा) देखें। ध्यान दें कि आप खंडित एनएएल (टुकड़े हेडर के साथ, कई एनएएल के साथ एसटीएपी पैकेट (और आईफ्रेम एक पैकेट के दूसरे एनएएल में शुरू कर सकते हैं), आदि आप वास्तव में पैकेट स्ट्रीम में सभी एनएएल स्कैन करना चाहते हैं एक आईडीआर शुरू करने वाले एनएएल।ध्यान दें कि वास्तविक आई-फ्रेम/सी-फ्रेम अनुक्रम और चित्र पैरामीटर सेट के एक सेट से पहले हो सकता है, जो * महत्वपूर्ण * हैं और आईडीआर का हिस्सा माना जाना चाहिए (लेकिन मार्कर नहीं हैं) – jesup

+0

वैसे यह केवल काम करता है मेरे लिए तो ... = | – Cipi

+0

@jesup आमतौर पर बैंड से बाहर पैरामीटर सेट नहीं हैं? इसके अलावा - हाय! फैंसी आपसे मिलकर ... –

7

जहाँ तक मुझे पता है, आरटीपी पेलोड में MPEG4-ES धारा टुकड़े आमतौर पर MPEG4 startcode के साथ शुरू, इन में से एक हो सकता है, जो:

  • 0x000001b0: visual_object_sequence_start_code (शायद-फ़्रेम)
  • 0x000001b6 : vop_start_code (-फ़्रेम, अगर अगले दो टुकड़े कर रहे हैं शून्य)
  • 0x000001b3: group_of_vop_start_code है, जो तीन बाइट्स तो उम्मीद है कि एक vop_start_code कि या कोई मुख्य-फ़्रेम का नहीं हो सकता है शामिल है और (ऊपर देखें)
  • 0x00000120: video_object_layer_start_code (शायद-फ़्रेम)
  • 0x00000100 - 0x0000011f: video_object_start_code (उन मुख्य-फ़्रेम की तरह के रूप में अच्छी लग रही है) और
  • कुछ (शायद नहीं एक-फ़्रेम)

मुझे डर लग रहा है कि आप करेंगे सुनिश्चित करने के लिए स्ट्रीम को पार्स करने की आवश्यकता है: -/

6

वास्तव में, यदि आप एनएएल मान (प्रथम बाइट) 0x7C है तो इसका मतलब है कि आई-फ्रेम खंडित है। SDP में packetization-mode=1 में कोई अन्य फ्रेम (पी और बी) खंडित नहीं किया जा सकता है, तो इसका मतलब है कि I-Frames खंडित हैं, और इसलिए यदि आप 0x7C को पहले बाइट के रूप में पढ़ते हैं, तो यह I-Frame है। यहां और पढ़ें: http://www.rfc-editor.org/rfc/rfc3984.txt

0

0x000001b6: vop_start_code (-फ़्रेम, अगर अगले दो बिट्स शून्य हैं) इस एमपीईजी -4

1

यह मेरे लिए काम किया के लिए सही तरीका है:
- पता लगाएं "पेलोड प्रकार", उदाहरण के लिए: पेलोड प्रकार: डायनामिकआरटीपी-टाइप -96 (9 6)
- Wireshark बताएं कि कौन सी स्ट्रीम H264 है: फ़ाइल-> प्राथमिकताएं-> प्रोटोकॉल-> H264। पेलोड प्रकार के रूप में 96 दर्ज करें।
- slice_type पर फ़िल्टर: "h264.slice_type eq 7"

1

H264 के लिए:

  1. आरटीपी हेडर निकालें।
  2. यदि खंड एनएएल प्रकार (पहले बाइट में) एसपीएस (7) या पीपीएस (8) फ्रेम को आईफ्रेम के रूप में चिह्नित करता है (कई कैमरे एसपीएस और पीपीएस (एक्सिस शामिल) का उपयोग नहीं करते हैं)।
  3. अगर एनएएल प्रकार # 28 एफयू ए (विखंडन इकाई ए) है तो एनएएल प्रकार आईडीआर (5) (आईडीआर (इंस्टेंटस डिकोडिंग रीफ्रेश) पिक्चर) एक आईफ्रेम है तो एफयू हेडर (अगली बाइट) की जांच करें।

उदाहरण:

nal_ref_idc: 3, nal type: 7 (0x07) descripcion: 7 (SPS)<br> 
00000000 24 00 00 2B 80 60 22 ED 96 57 3E 68 57 F3 22 B5 $..+.`"í.W>hWó"µ<br> 
00000010 67 64 00 1E AD 84 01 0C 20 08 61 00 43 08 02 18 gd..­... .a.C... 

00000020 40 10 C2 00 84 2B 50 5A 09 34 DC 04 04 04 08 @.Â..+PZ.4Ü....<br> 
nal_ref_idc: 3, nal type: 8 (0x08) descripcion: 8 (PPS)<br> 
00000000 24 00 00 10 80 60 22 EE 96 57 3E 68 57 F3 22 B5 $....`"î.W>hWó"µ 
00000010 68 EE 3C B0 hî<° 

FU_A (fragmentation unit A) 
nal_ref_idc: 3, nal type: 5 (0x05) descripcion: 5 (IDR (Instantaneous Decoding Refresh) Picture) 
00000000 24 00 05 96 80 60 22 F1 96 57 3E 68 57 F3 22 B5 $....`"ñ.W>hWó"µ 
00000010 7C 05 A0 AA 2F 81 92 AB CA FE 9E 34 D8 06 AD 74 |. ª/..«Êþ.4Ø.­t 
...