केक की शांति!
1. डाटा प्राप्त करें
मैं देख सकते हैं, आप पहले से ही पता है कि कैसे करना है (RTSP सत्र, सेटअप एक RTP/AVP/UDP;unicast;
परिवहन प्रारंभ करें, और उपयोगकर्ता डाटाग्राम प्राप्त) ... लेकिन आप में हैं संदेह, पूछो।
कोई फर्क नहीं पड़ता परिवहन (यूडीपी या टीसीपी) डेटा स्वरूप मुख्य रूप से एक ही है:
- आरटीपी डेटा:
[RTP Header - 12bytes][Video data]
- यूडीपी:
[RTP Data]
- टीसीपी:
[$ - 1byte][Transport Channel - 1byte][RTP data length - 2bytes][RTP data]
तो यूडीपी से डेटा प्राप्त करने के लिए, आपको केवल पहले 12 बाइट्स को बंद करना होगा जो आरटीपी हेडर का प्रतिनिधित्व करते हैं। लेकिन सावधान रहें, आपको वीडियो समय की जानकारी प्राप्त करने की आवश्यकता है, और एमपीईजी 4 के लिए पैकेटिज़ेशन जानकारी!
टीसीपी के लिए आपको बाइट $
प्राप्त करने तक पहले बाइट को पढ़ने की आवश्यकता है। फिर अगला बाइट पढ़ें, यह परिवहन चैनल होगा कि निम्न डेटा संबंधित है (जब सर्वर SETUP अनुरोध पर प्रतिक्रिया करता है तो यह कहता है: Transport: RTP/AVP/TCP;unicast;interleaved=0-1
इसका मतलब है कि वीडियो डेटा में TRANSPORT_CHANNEL = 0 होगा और वीडियो आरटीसीपी डेटा में TRANSPORT_CHANNEL = 1 होगा)। आप वीडियो डेटा प्राप्त करना चाहते हैं, इसलिए हम 0 की उम्मीद करते हैं ... फिर एक छोटा (2 बाइट) पढ़ें जो आरटीपी डेटा की लंबाई का प्रतिनिधित्व करता है, इसलिए उस बाइट को पढ़ें, और अब यूडीपी के समान ही करें।
2. Depacketize डेटा
H264 और MPEG4 डेटा आमतौर पर packetized रहे हैं (SDP में है packetization-mode
पैरामीटर उनमें से प्रत्येक क्या मतलब मान 0, 1 और 2 हो सकता है, और, आप इसे depacketize करने के लिए कैसे HERE देख सकते हैं) क्योंकि एक निश्चित नेटवर्क सीमा है कि एक एंडपॉइंट टीसीपी या यूडीपी के माध्यम से भेज सकता है जिसे एमटीयू कहा जाता है। यह आमतौर पर 1500 बाइट या उससे कम होता है। तो यदि वीडियो फ्रेम उस से बड़ा है (और यह आमतौर पर है), तो इसे एमटीयू आकार के टुकड़ों में खंडित (पैकेटेटेड) होना चाहिए। यह टीसीपी और यूडीपी परिवहन पर एन्कोडर/स्ट्रीमर द्वारा किया जा सकता है, या आप दूसरी तरफ वीडियो फ्रेम को खंडित करने और फिर से इकट्ठा करने के लिए आईपी पर रिले कर सकते हैं ... यदि आप यूडीपी पर एक चिकनी त्रुटि प्रवण वीडियो चाहते हैं तो सबसे पहले बेहतर होगा और टीसीपी।
H264: जांच करने के लिए आरटीपी डेटा (जो UDP पर आ गया, या टीसीपी से अधिक interleaved) एक बड़ा H264 वीडियो फ्रेम का टुकड़ा पकड़ लेगा, तो आपको पता होना चाहिए कि टुकड़ा जब यह packetized है दिखता है:
H264 FRAGMENT
First byte: [ 3 NAL UNIT BITS | 5 FRAGMENT TYPE BITS]
Second byte: [ START BIT | END BIT | RESERVED BIT | 5 NAL UNIT BITS]
Other bytes: [... VIDEO FRAGMENT DATA...]
अब, बाइट सरणी में पहला वीडियो डेटा प्राप्त Data
कहा जाता है और निम्नलिखित जानकारी प्राप्त:
int fragment_type = Data[0] & 0x1F;
int nal_type = Data[1] & 0x1F;
int start_bit = Data[1] & 0x80;
int end_bit = Data[1] & 0x40;
यदि fragment_type == 28
तो उसके बाद वीडियो डेटा वीडियो फ्रेम खंड का प्रतिनिधित्व करता है। अगली जांच start_bit
सेट है, यदि यह है, तो वह खंड अनुक्रम में पहला है। आप पहली पेलोड बाइट (3 NAL UNIT BITS
) से पहले 3 बिट्स ले कर आईडीआर के एनएएल बाइट को पुनर्निर्माण के लिए इसका उपयोग करते हैं और उन्हें दूसरे पेलोड बाइट (5 NAL UNIT BITS
) से अंतिम 5 बिट्स के साथ संयोजित करते हैं ताकि आपको इस [3 NAL UNIT BITS | 5 NAL UNIT BITS]
की तरह बाइट मिले। फिर उस खंड से VIDEO FRAGMENT DATA
के साथ पहले एनएएल बाइट को एक स्पष्ट बफर में लिखें।
तो start_bit
और end_bit
0 तो बस बफर करने के लिए VIDEO FRAGMENT DATA
(छोड़ने के पहले दो पेलोड बाइट्स कि टुकड़ा की पहचान) लिखना है।
तो start_bit
है 0 और end_bit
1, इसका मतलब है कि यह पिछले टुकड़ा है, और तुम सिर्फ लिखने इसके VIDEO FRAGMENT DATA
बफर करने के लिए (पहले दो बाइट्स कि टुकड़ा पहचान लंघन), और अब आप अपने वीडियो फ्रेम पुनर्निर्मित किया!
ध्यान रखें कि आरटीपी डेटा पहले 12 बाइट्स में आरटीपी हेडर रखता है, और यदि फ्रेम खंडित होता है, तो आप डीफ्रैग्मेंटेशन बफर में पहले दो बाइट्स कभी नहीं लिखते हैं, और आपको एनएएल बाइट का पुनर्निर्माण करने और इसे पहले लिखने की आवश्यकता है । यदि आप यहां कुछ गड़बड़ करते हैं, तो तस्वीर आंशिक होगी (इसमें से आधा भूरा या काला होगा या आप कलाकृतियों को देखेंगे)।
एमपीईजी 4: यह एक आसान है। आपको आरटीपी हेडर में MARKER_BIT की जांच करने की आवश्यकता है।वह बाइट सेट है (1
) यदि वीडियो डेटा पूरे वीडियो फ्रेम का प्रतिनिधित्व करता है, और यह वीडियो डेटा के 0
एक वीडियो फ्रेम खंड है। तो इसे अचयनित करने के लिए, आपको यह देखने की ज़रूरत है कि MARKER_BIT क्या है। यदि यह 1
है, तो बस वीडियो डेटा बाइट पढ़ें।
पूरे फ्रेम:
[MARKER = 1]
पैकेट फ्रेम:
[MARKER = 0], [MARKER = 0], [MARKER = 0], [MARKER = 1]
कि, सभी दूसरों कि
MARKER_BIT=1
के साथ पहली बार एक सहित का पालन किया है
MARKER_BIT=0
पहले वीडियो फ्रेम टुकड़ा है
पहले पैकेट एक ही वीडियो फ्रेम के टुकड़े हैं। तो तुम क्या करने की जरूरत है: depacketization बफर में
MARKER_BIT=0
तक जगह वीडियो डेटा
- प्लेस अगले वीडियो डेटा जहां
MARKER_BIT=1
एक ही बफर में
- Depacketization बफर अब एक पूरी MPEG4 फ्रेम रखती
3. विकोडक के लिए प्रक्रिया डेटा (एनएएल बाइट धारा)
जब आपके पास वीडियो फ्रेम को डिमैक्टेड किया गया है, आपको एनएएल बाइट स्ट्रीम बनाने की आवश्यकता है।
- H264:
0x000001[SPS], 0x000001[PPS], 0x000001[VIDEO FRAME], 0x000001...
- MPEG4:
0x000001[Visual Object Sequence Start], 0x000001[VIDEO FRAME]
नियम: यह निम्न स्वरूप है
- हर फ्रेम
0x000001
3 बाइट कोड के साथ कोई बात नहीं prepended किया जाना चाहिए कोडेक
- प्रत्येक स्ट्रीम शुरू होनी चाहिए विन्यास जानकारी के साथ, H264 के लिए कि एसपीएस कर रहे हैं और पी पी एस (SDP में
config
पैरामीटर) है कि आदेश (SDP में sprop-parameter-sets
) में फ्रेम, और MPEG4 के लिए VOS फ्रेम
तो तुम और H264 के लिए एक config बफर का निर्माण करने की जरूरत है MPEG4 3 बाइट्स 0x000001
के साथ प्रीपेड किया गया है, इसे पहले भेजें, और उसके बाद प्रत्येक 3 बाइट्स के साथ प्रत्येक डिमैक्टेड वीडियो फ्रेम को प्रीपेड करें और उसे डिकोडर को भेजें।
आप किसी भी बस टिप्पणी को स्पष्ट ... :)
विस्तृत स्पष्टीकरण के लिए धन्यवाद ... मैं कोशिश करूंगा और देखेंगे कि क्या होगा ... – Novalis
यह H264 के लिए काम करता है ... वैसे भी मुझे अन्य 28 की तुलना में अन्य खंड_टाइप की जांच करनी चाहिए ... – Novalis
ठीक है अगर 28 नहीं है, यह पैकेटेटेड टुकड़ा नहीं है! फिर आप वीडियो डेटा का उपयोग करें। वोट ऊपर? : डी – Cipi