2012-03-06 14 views
10

के रूप में आरटीपी/एच 264 स्ट्रीम को कैसे लिखें मुझे my previous question के लिए कोई समाधान नहीं मिला, इसलिए मैंने इसे चरण-दर-चरण करने का प्रयास किया।फ़ाइल

जो चीज मैं अब करना चाहता हूं वह एक फ़ाइल के रूप में आरटीपी/एच 264 स्ट्रीम को स्टोर करना है।

मैं क्या पाया अब तक नीचे है:

| RTP HEADER 12bytes long | FU INDICATOR 1byte | FU HEADER 1byte | FU payload | 

जैसा कि मैंने आरएफसी समझा 6184 दस्तावेज़, मैं कर रहा हूँ (सबसे पहले मेरी RTP/H264 FU-ए जिनमें से रूप है) एक ऐसे पैकेट के साथ एक एनएएल शुरू करना जिसमें एफयू हेडर के पहले हिस्से में '1' है और निम्नलिखित पैकेट्स को जोड़ना जो पहले बिट पर '0' सेट करते हैं, जो अंतिम पैकेट तक है जो एफयू हेडर के दूसरे बिट पर '1' है।

मुझे लगता है कि एफयू-ए पैकेटिज़ेशन से पहले एक पूर्ण एनएएल कैसे प्राप्त करें और मुझे जो भी मिला वह मुझे प्रत्येक पूर्ण एनएएल के सामने 'शुरुआती बिट्स' (0x00000001) डालने की ज़रूरत है।

लेकिन अभी तक कोई भाग्य नहीं है। नीचे लॉग का हिस्सा है

========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= adding the next NAL as 716 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= a NAL is summed up as 4866 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 139 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= a NAL is summed up as 7061 
========= the new NAL is as 1377 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]41/1000001 [5]E4/11100100 [6]40/1000000 [7]1A/11010 ... 
========= a NAL is summed up as 1369 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E6/11100110 [7]60/1100000 ... 
========= adding the next NAL as 94 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E6/11100110 [7]60/1100000 ... 
========= a NAL is summed up as 1472 
========= the new NAL is as 447 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]41/1000001 [5]E8/11101000 [6]80/10000000 [7]16/10110 ... 
========= a NAL is summed up as 439 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EA/11101010 [7]A0/10100000 ... 
========= adding the next NAL as 1174 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EA/11101010 [7]A0/10100000 ... 
========= a NAL is summed up as 2552 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EC/11101100 [7]C0/11000000 ... 
========= adding the next NAL as 1364 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EC/11101100 [7]C0/11000000 ... 
========= a NAL is summed up as 2742 
========= the new NAL is as 1400 
... 

मेरे सवाल है,

  1. अगर मैं FU-ए द्वारा खंडित पैकेट से पूरा nals प्राप्त कर सकते हैं, मैं इसे कैसे एक फाइल है जो के रूप में कर सकते हैं वीएलसी या अन्य खिलाड़ी द्वारा चलाने में सक्षम?

  2. मैं अभी भी उलझन में हूं अगर मुझे एफयू सूचक और एफयू हेडर रखना है या नहीं। किसी ने कहा कि मैं (FU हैडर पर '1' के साथ शुरू)

किसी भी सलाह वास्तव में सराहना की जाएगी ताकि उन्हें केवल बहुत पहले पैकेट के लिए ले जाने की जरूरत है।

धन्यवाद।

+0

अरे, मुझे बिल्कुल वही चीज़ करते कोशिश कर रहा हूँ .. मैं आरएफसी 6184 पढ़ सकते हैं और तेह एक ही चरणों का पालन करें और यह एक फ़ाइल में स्टोर करने के लिए करने की कोशिश की .. लेकिन मेरी फ़ाइल सब पर खेलने के लिए प्रतीत नहीं होता ... कर सकते हैं आप कृपया इस्तेमाल किए गए समाधान को पोस्ट करें? इस प्रश्न में 7k से अधिक विचार हैं .. यह हम सभी के लिए सहायक होगा .. –

उत्तर

5
  1. एक विकल्प वीएलसी के साथ खेलने के लिए सक्षम होने के लिए इस तरह के mp4 या avi के रूप में एक फ़ाइल स्वरूप में डेटा mux है। AFAIR avi H.264 के लिए एक खराब फिट था (हाथ से कारण याद नहीं कर सकता)। libmp4 जैसे निःशुल्क पुस्तकालय हैं, या यदि आप डायरेक्टशो, Geraint's mp4mux का उपयोग कर विंडोज़ पर हैं।

    एक अन्य विकल्प ffmpeg उपयोग करने के लिए एक mp4 में एक .264 फ़ाइल को रूपांतरित करने के लिए है

    ffmpeg मैं test.264 test.mp4

    मतलब यह है कि .264 फ़ाइल शुरू कोड के द्वारा अलग एनएएल इकाइयां हैं ।

  2. से RFC6184

    FU पेलोड खंडित एनएएल इकाई के पेलोड के टुकड़े के होते हैं

    ताकि अगर लगातार FUS के विखंडन इकाई पेलोड क्रमिक रूप से concatenated रहे हैं, खंडित एनएएल का पेलोड इकाई का पुनर्निर्माण किया जा सकता है।खंडित एनएएल इकाई के एनएएल इकाई प्रकार ऑक्टेट को विखंडन इकाई पेलोड, में शामिल नहीं किया गया है, बल्कि खंडित एनएएल इकाई के एनएएल इकाई प्रकार ऑक्टेट की जानकारी एफयू के एफ और एनआरआई क्षेत्रों में व्यक्त की गई है विखंडन इकाई के संकेतक ऑक्टेट और के प्रकार फ़ील्ड में एफयू हेडर। एक एफयू पेलोड में मई की कोई संख्या हो सकती है और मई खाली हो।

    आप .264 फ़ाइल में लिखने से पहले मूल एनएएल इकाई को फिर से संगठित करने के लिए यदि आप में 1.

+0

धन्यवाद फिर से राल्फ, बीटीडब्ल्यू मैं वास्तव में सोच रहा हूं कि मुझे एसपीएस, पीपीएस के साथ क्या करना चाहिए। वर्तमान में जो पूर्ण एनएएल मैं पुनर्निर्माण कर रहा हूं उसके पास एसपीएस, पीपीएस पैकेट नहीं हैं। मुझे लगता है कि मुझे उन्हें स्ट्रीम के पहले पैकेट से पहले रखना होगा या एवीसीओडीसी कोंटेक्स्ट को एसपीएस, पीपीएस के साथ शुरू करना होगा। तुम कैसे सोचते हो?? – Jun

+0

ठीक है, मैंने कुछ प्रगति की है। मैंने धारा के सिर पर एसपीएस, पीपीएस पैकेट लगाए और 2bytes से प्रत्येक पुनर्निर्मित एकल नाल के शीर्षलेख को संपादित किया (इसमें अभी भी एफयू सूचक, एफयू हेडर शामिल है) 1byte में मूल रूप से था। अब elecard स्ट्रीम विश्लेषक फ़ाइल को पढ़ता है लेकिन वीएलसी या किसी अन्य खिलाड़ी के लिए अभी भी पठनीय नहीं है, लेकिन अगर मैंने इसे mp4 में 'ffmpeg -i src.mp4 con.mp4' द्वारा परिवर्तित किया है, तो con.mp4 सामान्य वीडियो प्लेयर द्वारा खेला जा सकता है। – Jun

+0

लेकिन मुझे अपने स्वयं के प्लेयर में ffmpeg api द्वारा फ़ाइल को डीकोड करने की आवश्यकता है, इसलिए मुझे रूपांतरण के बिना इसे चलाने की ज़रूरत है। इसे ffmpeg api avcodec_decode_video2() द्वारा डीकोड किया जाना चाहिए .. कोई सलाह ???? – Jun

6

FU, STAP, और MTAP एनएएल इकाइयां हैं उल्लिखित दूसरा दृष्टिकोण लेने की आवश्यकता होगी केवल आरटीपी पैकेटिज़ेशन के लिए विशिष्ट है क्योंकि उन्हें नेटवर्क परिवहन की सुविधा के लिए डिज़ाइन किया गया है। दूसरे शब्दों में, एक डीकोडर पर सही ढंग से पार्सिंग पर भरोसा न करें। आखिरकार, आपको एफयू पैकेट के मामले में एनएएल इकाइयों को फिर से इकट्ठा करने की जरूरत है, या एसटीएपी/एमटीएपी के मामले में उन्हें कई एनएएल इकाइयों में तोड़ना होगा।

एक बार जब आपके पास एनएएल इकाई हो (और इसमें पीपीएस, एसपीएस, एसईआई, टुकड़ा विभाजन, और 1-23 रेंज में अन्य सभी प्रकार शामिल हैं), तो आप '0001' स्टार्ट कोड के साथ डिस्क पर लिख सकते हैं प्रति एच .264 अनुबंध बी

एमपीईजी -4 जैसे कंटेनर में H.264 अनुबंध बी स्ट्रीम को विभिन्न कमांड लाइन उपकरण के साथ किया जा सकता है (मुझे यकीन है कि ffmpeg इसे कर सकता है)।