2012-07-18 16 views
13

पर्यावरण:264 रूपांतरण (एक आरटीपी धारा से)

मैं एक आईपी कैमरा है, जो एक 264 इनकोडिंग प्रारूप में आरटीपी पर के डेटा स्ट्रीमिंग के लिए सक्षम है की है। यह कच्ची धारा ईथरनेट से दर्ज की जाती है। उस डेटा के साथ मुझे काम करना है।

लक्ष्य:

अंत मैं एक * .mp4 फ़ाइल, जो मैं आम मीडिया प्लेयर (VLC या Windows सांसद की तरह) के साथ खेल सकते है चाहते हैं।

मैं अब तक क्या किया:

मैं ले रहा है कि कच्चे धारा डेटा और यह पार्स। चूंकि डेटा आरटीपी के माध्यम से प्रसारित किया गया है, इसलिए मुझे एनएएल बाइट्स, एसपीएस और पीपीएस की देखभाल करने की आवश्यकता है।

1. लिखें एक कच्चे फ़ाइल

सबसे पहले मैं यह निर्धारित प्रत्येक फ्रेम के प्रकार ईथरनेट पर प्राप्त किया। ऐसा करने के लिए, मैं प्रत्येक आरटीपी पेलोड के पहले दो बाइट्स का विश्लेषण करता हूं, इसलिए मैं 8 एनएएल यूनिट बिट, फ्रैगमेंट टाइप बिट्स और स्टार्ट, आरक्षित और एंड बिट प्राप्त कर सकता हूं। पेलोड में, वे इस तरह की व्यवस्था की कर रहे हैं:

Byte 1: [   3 NAL Unit Bits   | 5 Fragment Type Bits] 
Byte 2: [Start Bit | Reserved Bit | End Bit | 5 NAL Unit Bits] 

इस से मैं निर्धारित कर सकते हैं:

  • प्रारंभ और एक वीडियो फ्रेम समाप्त -> शुरू बिट और अंत बिट
  • का प्रकार पेलोड -> 5 टुकड़ा प्रकार बिट्स
  • एनएएल यूनिट बाइट

टुकड़ा प्रकार, जिसमें जरूरी हैं मेरे मामले हैं:

Fragment Type 7 = SPS 
Fragment Type 8 = PPS 
Fragment Type 28 = Video Fragment 

एनएएल बाइट एक साथ बाइट 1 और 2 से एनएएल यूनिट बिट्स डाल द्वारा बनाई गई है।

एसपीएस/पी पी एस:

अब विखंडन प्रकार मैं निम्न कार्य के आधार पर

  1. लिखें एनएएल उपसर्ग (0x00 0x00 0x01) और फिर एसपीएस या पीपीएस डेटा

स्टार्ट बिट

0 के साथ फ्रैगमेंटेशन
  1. लिखें एनएएल उपसर्ग
  2. लिखें एनएएल यूनिट बाइट
  3. लिखें शेष कच्चे डेटा

प्रारंभ बिना विखंडन Bit

  1. कच्चे डेटा लिखें

इसका मतलब यह है मेरी कच्ची फ़ाइल कुछ ली लगती है ke इस:

[NAL Prefix][SPS][NAL Prefix][PPS][NAL Prefix][NAL Unit Byte][Raw Video Data][Raw Video Data]....[NAL Prefix][NAL Unit Byte][Raw Video Data]... 

हर पीपीएस और एसपीएस मैं अपने धारा डेटा में मिल के लिए, मैं सिर्फ एक एनएएल उपसर्ग (0x00 0x00 0x01) और फिर एसपीएस/पी पी एस में ही लिखें।

अब मैं कुछ मीडिया प्लेयर के साथ इस डेटा है, जो मुझे करने के लिए सुराग नहीं खेल सकते:

2. कन्वर्ट फ़ाइल

जब से मैं कोडेक्स के साथ अधिक से अधिक कार्य से बचना चाहता था मैं बस मौजूदा एप्लिकेशन -> एफएफएमपीईजी का उपयोग करने के लिए चला गया। यह मैं उन मानकों के साथ बोल रहा हूँ:

ffmpeg.exe -f h264 -i <RawInputFile> -vcodec copy -r 25 <OutPutFilename>.mp4

-f h264: यह ffmpeg बताना चाहिए मैं एक h264 कोड किया है धारा

-vcodec copy: उद्धरण मैनपेज से:

Force video codec to codec. Use the "copy" special value to tell that the raw codec data must be copied as is.

-r 25 : फ्रेमरेट को 25 एफपीएस पर सेट करता है।

जब मैं उन पैरामीटर के साथ ffmpeg को कॉल करता हूं तो मुझे एक .mp4 फ़ाइल मिलती है, जिसे मैं वीएलसी और विंडोज एमपी के साथ खेल सकता हूं, इसलिए यह वास्तव में काम करता है। लेकिन फ़ाइल अब मेरी कच्ची फ़ाइल से थोड़ा अलग दिखती है।

इस ओर जाता है मुझे मेरे सवाल का:

मैं वास्तव में क्या किया?

मेरी समस्या यह नहीं है कि यह काम नहीं कर रहा है। मैं सिर्फ यह जानना चाहता/चाहती हूं कि मैंने वास्तव में ffmpeg को कॉल करने के साथ क्या किया है। मेरे पास एक कच्ची H264 फ़ाइल थी जो मैं नाटक नहीं कर सका।FFmpeg I का उपयोग करने के बाद इसे चला सकता है।

वहाँ मूल कच्चे फ़ाइल के बीच निम्न मतभेद (जो मैं लिखा है) और FFmpeg द्वारा लिखित एक हैं:

  1. हैडर: FFmpeg फ़ाइल हैडर
  2. की 0x30 के बारे में बाइट्स की तरह है
  3. पाद: FFmpeg फ़ाइल भी एक पाद लेख
  4. बदल दिया उपसर्ग और 2 नए बाइट्स है:

अपूर्ण फ़ाइल से एक नया वीडियो फ्रेम 012,350,096 की तरह शुरू कर दिया जबकिनई फ़ाइल में यह इस तरह दिखता है:

[0x00 0x00][2 "Random" Bytes][NAL Unit Byte][Raw Video Data].....[0x00 0x00[2 other "Random" Bytes][NAL Unit Byte][Raw Video Data]... 

मैं समझता हूँ कि वीडियो स्ट्रीम एक कंटेनर प्रारूप (मुझे ठीक कर लें मैं गलत हूँ, लेकिन मुझे लगता है कि नए शीर्ष लेख और पाद कि के लिए जिम्मेदार हैं) की जरूरत है। लेकिन कच्चे डेटा में वास्तव में कुछ बाइट क्यों बदलते हैं? यह कुछ डीकोडिंग नहीं हो सकता है क्योंकि धारा को खिलाड़ी द्वारा डीकोड किया जाना चाहिए और ffmpeg नहीं।

जैसा कि आप देख सकते हैं कि मुझे अपनी समस्या के लिए एक और समाधान की आवश्यकता नहीं है जितनी अधिक स्पष्टीकरण (इसलिए मैं इसे स्वयं समझा सकता हूं)। वास्तव में ffmpeg क्या करता है? और यह वीडियो डेटा के भीतर कुछ बाइट क्यों बदलता है?

+1

क्या आप इसे प्राप्त करने में सक्षम थे? यदि हां, क्या आप समाधान साझा करने के इच्छुक हैं? धन्यवाद! –

उत्तर

0

ऐसा लगता है कि स्ट्रीम को पैकेटेट किया गया है। कई कंटेनर प्रारूप बिटस्ट्रीम को पैकेट में विभाजित करते हैं और थोड़ी सी जानकारी जैसे टाइम स्टैंप, पैकेट की लंबाई इत्यादि जोड़ते हैं। यह डिकोडर को हुक को बिना किसी सबकुछ के फ़ाइल को छोड़ने के लिए देता है, एक पैकेट खो जाने पर पुन: संसाधित करता है, सिंकिंग ऑडियो/वीडियो, कई धाराओं के संयोजन, आदि

अधिक जानकारी के लिए MP4 फ़ाइल प्रारूप की जानकारी पर

देखो: अपने 264 अनुलग्नक बी बाइट धारा
http://en.wikipedia.org/wiki/MPEG-4_Part_14

2

MP4 कंटेनर जोड़ने इसके अलावा, ffmpeg परिवर्तित (के साथ एनएएल उपसर्ग) लंबाई पूर्ववर्ती प्रारूप में।

आपका [0x00 0x00] [2 "यादृच्छिक" बाइट्स] 32 बिट पूर्णांक है, जो बाइट्स में निम्नलिखित एनएएल इकाई की लंबाई देता है।

-1

आप खुले h264 specs में अपने परिवर्तनों के बारे में अधिक पढ़ सकते हैं। अध्याय अनुलग्नक बी

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