2012-06-18 20 views
6

द्वारा उत्पन्न कच्चे H264 mdat से पीटीएस प्राप्त करें मैं AVAssetWriter द्वारा लिखित H.264 mov फ़ाइल को पढ़ने और लिखने की कोशिश कर रहा हूं। मैं व्यक्तिगत एनएएल इकाइयों को निकालने में कामयाब रहा, उन्हें ffmpeg के AVPackets में पैक करें और उन्हें ffmpeg का उपयोग करके किसी अन्य वीडियो प्रारूप में लिखें। यह काम करता है और परिणामस्वरूप फ़ाइल प्लेबैक गति को छोड़कर अच्छी तरह से खेलती है। कच्चे एच .264 डेटा से मैं सही पीटीएस/डीटीएस मूल्यों की गणना कैसे करूं? या शायद उन्हें पाने के लिए कोई और तरीका मौजूद है? 30आईओएस AVAssetWriter

  1. सीमा पर कब्जा न्यूनतम/अधिकतम फ्रेम दर और मान लेते हैं कि आउटपुट फ़ाइल हो जाएगा 30 एफपीएस:

    यहाँ मैं क्या कोशिश की है है। असल में इसकी एफपीएस हमेशा निर्धारित मूल्यों से कम होती है। और, मुझे लगता है कि एफपीएस पैकेट से पैकेट तक स्थिर नहीं है।

  2. प्रत्येक लिखित नमूना की प्रस्तुति टाइमस्टैम्प याद रखें और मान लें कि नमूने एक-एक-एक को NALUs पर मानचित्रित करते हैं और आउटपुट पैकेट में सहेजे गए टाइमस्टैंप को लागू करते हैं। यह काम नहीं करता है।

  3. पीटीएस को 0 या AV_NOPTS_VALUE पर सेट करना। काम नहीं करता

इसके बारे में googling से मैं समझता हूं कि कच्चे H.264 डेटा में आमतौर पर कोई समय की जानकारी नहीं होती है। कभी-कभी एसईआई के अंदर कुछ समय की जानकारी हो सकती है, लेकिन मेरे द्वारा उपयोग की जाने वाली फ़ाइलों में यह नहीं है। दूसरी तरफ, कुछ ऐसे अनुप्रयोग हैं जो मैं वही कर रहा हूं जो मैं करने की कोशिश कर रहा हूं, इसलिए मुझे लगता है कि यह किसी भी तरह से संभव है।

+2

मैं AVAssetWriter द्वारा लिखित एक mov फ़ाइल से H.264 को एक साथ पढ़ने की भी कोशिश कर रहा हूं, और पाइप/नियमित फ़ाइल पढ़ने का उपयोग करके इसे नहीं कर सका। लिखे जाने पर आप इसे कैसे पढ़ सकते हैं? धन्यवाद! –

+3

नियमित फ़ाइल पढ़ने का उपयोग करें, लेकिन ईओएफ पर फिर से रुकने की बजाय। जल्द या बाद में आपका पठन ऑपरेशन सफल होगा। – kolyuchiy

+2

@kolyuchiy - प्रेषण स्रोत सिस्टम का बेहतर उपयोग करते हैं। फ़ाइल डिस्क्रिप्टर पर एक पढ़ा गया स्रोत सेट करें। डेटा पढ़ने के लिए एक ब्लॉक कहा जाएगा। यदि ईओएफ आपके फ़ाइल पर त्रुटि को स्पष्ट करता है। –

उत्तर

5

आपको या तो उन्हें स्वयं उत्पन्न करना होगा, या पीटीएस/डीटीएस सूचना उत्पन्न करने के लिए एमपी 4/एमओवी कंटेनर में एटम की समयावधि की जानकारी प्राप्त करना होगा। Libavformat में FFmpeg का mov.c मदद कर सकता है।

AVAssetWriter के साथ लिखने वाले प्रत्येक नमूना/फ्रेम को वीसीएल एनएएलएस के साथ एक से एक मानचित्रित किया जाएगा। यदि आप जो भी कर रहे हैं वह परिवर्तित हो रहा है तो एफएफएमपीईजी को भारी भारोत्तोलन करना है। एक कंटेनर प्रारूप से दूसरे में जाने पर यह समय की जानकारी को सही ढंग से बनाए रखेगा।

AVAssetWriter द्वारा उत्पन्न बिटस्ट्रीम में एसईआई डेटा नहीं है। इसमें केवल एसपीएस/पीपीएस/आई/पी फ्रेम शामिल हैं। एसपीएस में वीयूआई या एचआरडी पैरामीटर भी नहीं होते हैं।

- संपादित करें -

इसके अलावा, यह है कि आप CMSampleBufferRef के तत्कालीन समय आधार से सार्वजनिक टेलीफोन जानकारी बचत कर रहे हैं, तो लक्ष्य कंटेनर से अलग हो सकता है को ध्यान में रखना। उदाहरण के लिए AVFoundation समय आधार नैनोसेकंड है, और एक एफएलवी फ़ाइल मिलीसेकंड है।

+1

धन्यवाद! वास्तव में CMSampleBuffers में वास्तव में सही पीटीएस होते हैं जो आउटपुट पैकेट के लिए मानचित्र होते हैं। मैं उस दिशा में सभी तरह से जाने के लिए बहुत आलसी था। यह मेरी समस्या हल हो गई। – kolyuchiy