2013-03-14 3 views
5

मुझे एक एसडीपी सत्र की एक यूडीपी स्ट्रीम को एक डीकोडेबल एच .264 स्ट्रीम में अनुवाद करने में कुछ मौलिक चीज़ याद आ रही है। मैं एक H.264 सक्षम कैमरा के साथ परीक्षण कर रहा हूं और सीधे प्लेयर के साथ स्ट्रीम चला सकता हूं। जब मैं अनुवादित स्ट्रीम चलाने की कोशिश करता हूं तो इसे प्लेयर द्वारा पहचाना नहीं जाएगा (अनुपलब्ध हेडर त्रुटि)। हालांकि मुझे जावा एप्लिकेशन में इसे एकीकृत करने में सक्षम होने के लिए यूडीपी स्ट्रीम को डीकोड करना है जिसके लिए कुछ डिकोडर हैं।एच.264 यूडीपी पैकेट को प्ले करने योग्य मीडिया स्ट्रीम या फ़ाइल (डीफ्रैग्मेंटेशन) में परिवर्तित करने के लिए कैसे करें

मैं सवाल पहले से ही निम्नलिखित करने के लिए बहुत अच्छा जवाब देखा है:

  1. How to process raw UDP packets so that they can be decoded by a decoder filter in a directshow source filter
  2. Problem to Decode H264 video over RTP with ffmpeg (libavcodec)

दोनों कुछ छोटे मतभेद जो भ्रमित कर रहे हैं (नीचे देखें)।

लेकिन पहले हमें आसान हिस्सा देखने दें। जैसा कि मैंने कैमरे से देखा है वहां एसपीएस और पीपीएस पैकेट भेजे गए हैं। सभी शेष पैकेट खंडित फ्रेम खंडित हैं या नहीं।

फ्रेम के बिना सभी पैकेट्स (केवल मेरे मामले में केवल NALUnitType 7 और 8) के लिए मैं आरटीपी हैडर (12 बाइट्स) की पट्टी और बाइट 3 x 0 बाइट्स और 1 x 1 सामने (00 00 00 01) ।

सभी खंडित फ्रेम पैकेट्स के लिए मैं उन्हें उत्तर 1 के विवरण के अनुसार पुनर्निर्माण करता हूं। इसलिए विस्तार से इसका अर्थ है: आरटीपी हेडर की स्ट्रिप (केवल डेटा सत्यापन के लिए इसका उपयोग करें)। फिर पेलोड से विखंडन जानकारी को डीकोड करें:

पहला बाइट: [3 एनएएल यूनिट बिट्स | 5 फ्रेगमेंट टाइप बिट्स]
दूसरा बाइट: [स्टार्ट बिट | अंत बीआईटी | आरक्षित बीआईटी | 5 एनएएल यूनिट बिट्स]

यदि बिट शुरू होता है तो एक नया पेलोड हेडर बनाया गया है: [3 एनएएल यूनिट बिट्स (पहले बाइट से) | 5 एनएएल यूनिट बिट्स (दूसरे बाइट से)]
यह हमें एक गैर idrr स्लाइस के लिए एक NALUnitType 1 या एक idr टुकड़ा के लिए 5 देता है। जो विनिर्देश के अनुसार है।

मैं यह नया पेलोड हेडर (1 बाइट) लेता हूं और 2 बाइट हेडर के बिना पेलोड को एक नए पैकेज में संलग्न करता हूं। सभी निरंतर खंडों को उसी तरह जोड़ा जाता है (12 बाइट्स आरटीपी हेडर की पट्टी, यूनिट प्रकार की जानकारी के 2 बाइट्स की पट्टी) जब तक कि अंतहीन जानकारी दिखाई न दे। जब अंत देखा जाता है तो मैंने इस पैकेट के सामने बाइट्स (00 00 00 01) शुरू किया और इसे स्ट्रीम में लिख दिया।

समस्या यह है कि इसे अज्ञात कारण के लिए डीकोड नहीं किया जा सकता है। मेरे द्वारा पढ़े गए उत्तरों के उत्तर 2 में अंतर यह है कि पेलोड हेडर का दूसरा बाइट भी अनुवादित पैकेट में रखा जा सकता है। लेकिन मैंने दोनों की कोशिश की और अभी भी कोई भाग्य नहीं है।

शायद नव निर्मित धारा में कुछ और गायब है? या क्या मैं डीफ्रैग्मेंटेशन में गलती करता हूं?

+0

यह पता चला है कि संयुक्त फ्रेम का नया पेलोड हेडर किसी भी तरह गलत है। मैं जांचूंगा कि वहां क्या गलत हो सकता है। – Thomas

+0

[3 एनएएल यूनिट बिट्स (पहले बाइट से) | 5 एनएएल यूनिट बिट्स (दूसरे बाइट से) | 0x40] चाल करता है। मुझे नहीं पता क्यों अभी तक। – Thomas

उत्तर

2

थॉमस,

मैं अपने आप को यह सब समझने की कोशिश कर रहा हूँ। यह मुझे देखकर, इसे पढ़ने से: How to process raw UDP packets so that they can be decoded by a decoder filter in a directshow source filter कि आपके "प्रारंभ बाइट्स" एक बाइट से बंद है। मुझे लगता है कि यह 3 बाइट्स है, चार नहीं ... जैसा कि: 00 00 01

शायद यही वह समस्या है जहां इसे परेशानी हो रही है।

1

उत्तर के लिए Problem to Decode H264 video over RTP with ffmpeg (libavcodec) देखें।इसका सही कार्यान्वयन है!

और @ थॉमस, हाँ, यदि एसपीएस, पीपीएस या एसईआई एनएएल मौजूद हैं तो इसमें 4 है।

संबंधित मुद्दे