2012-08-05 22 views
15

मैं एक आईफोन ऐप विकसित करने की कोशिश कर रहा हूं जो कैमरे का उपयोग केवल अंतिम कुछ मिनट/सेकंड रिकॉर्ड करने के लिए करेगा। उदाहरण के लिए, आप 5 मिनट के लिए कुछ मूवी रिकॉर्ड करते हैं "सेव" पर क्लिक करें, और केवल अंतिम 30s ही सहेजे जाएंगे। मैं वास्तव में पांच मिनट रिकॉर्ड नहीं करना चाहता हूं और फिर पिछले 30 के दशक काटना चाहता हूं (यह मेरे लिए काम नहीं करेगा)। इस विचार को "Loop recording" कहा जाता है।आईओएस अंतहीन वीडियो रिकॉर्डिंग

इसका परिणाम अंतहीन वीडियो रिकॉर्डिंग में होता है, लेकिन आपको केवल अंतिम भाग याद है। प्रीकॉर्डर ऐप जो मैं करना चाहता हूं वह करें। (मैं इस संदर्भ का अन्य संदर्भ में उपयोग करना चाहता हूं) मुझे लगता है कि इसे Circular buffer के साथ आसानी से अनुकरण किया जाना चाहिए। मैंने एवीफाउंडेशन के साथ एक प्रोजेक्ट शुरू किया। यह शानदार होगा अगर मैं किसी भी तरह से वीडियो डेटा को एक परिपत्र बफर (जिसे मैं कार्यान्वित करूंगा) पर रीडायरेक्ट कर सकता हूं। मुझे केवल फाइल में इसे लिखने के बारे में जानकारी मिली।

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

कैमरे से डेटा को पुनर्निर्देशित करने के लिए कोई संकेत कैसे सराहना की जाएगी।

+0

Thx :) लेकिन समस्या यह है कि कैमरे से डेटा को उस तरह के बफर में रीडायरेक्ट करना है। –

+0

एडम - क्या आपने कभी यह हल किया है कि यह कैसे करें? – jangelo42

+0

@AdamSzeptyck: मैं कुछ हासिल करने की कोशिश कर रहा था जो आप ऊपर हासिल करना चाहते थे। यदि आप इसे हल करने में सक्षम हैं, तो क्या आप कृपया हमें बता सकते हैं कि आप इसे कैसे कर सकते हैं। –

उत्तर

10

महत्वपूर्ण! आईओएस 8 के रूप में आप VTCompressionSession का उपयोग कर सकते हैं और कंटेनर के माध्यम से खोदने के बजाय एनएएल इकाइयों तक सीधे पहुंच सकते हैं।


खैर सौभाग्य से आप यह कर सकते हैं और मैं आपको बता कैसे करेंगे, लेकिन आप अपने हाथों या तो MP4 या MOV कंटेनर के साथ गंदा पाने के लिए करने जा रहे हैं। इस (हालांकि, अधिक MOV विशेष) के लिए एक सहायक संसाधन एप्पल क्विकटाइम फ़ाइल स्वरूप है परिचय पुस्तिका http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html#//apple_ref/doc/uid/TP40000939-CH202-TPXREF101

पहली बात का पहला, आप 30 सेकंड से पहले एक मनमाना बिंदु से अपनी सहेजी गई फिल्म शुरू करने के लिए सक्षम होने के लिए नहीं जा रहे हैं रिकॉर्डिंग के अंत में, आपको लगभग 30 सेकंड में कुछ आई-फ्रेम का उपयोग करना होगा। आपके कीफ्रेम अंतराल के आधार पर, यह 30 सेकंड के पहले या उसके बाद कई सेकंड हो सकता है। आप सभी आई-फ्रेम का उपयोग कर सकते हैं और मनमाने ढंग से बिंदु से शुरू कर सकते हैं, लेकिन फिर आप शायद बाद में वीडियो को फिर से एन्कोड करना चाहेंगे क्योंकि यह काफी बड़ा होगा।

तो यह जानकर कि चलो आगे बढ़ें।

पहला चरण तब होता है जब आप अपना AVAssetWriter सेट अप करते हैं, तो आप अपने AVAssetWriterInput की अपेक्षाओं को MediaDataInRealTime प्रॉपर्टी को YES पर सेट करना चाहेंगे।

कैप्चर आउटपुट कॉलबैक में आप जिस फ़ाइल को लिख रहे हैं उससे एक फ़्रेड करने में सक्षम होंगे। पहला फ्रेड आपको एमपी 4/एमओवी (जो भी प्रारूप आप उपयोग कर रहे हैं) शीर्षलेख प्राप्त करेगा (यानी 'ftyp' परमाणु, 'चौड़ा' परमाणु, और 'mdat' परमाणु की शुरुआत)। आप चाहते हैं कि 'mdat' अनुभाग के अंदर क्या है। तो ऑफसेट जो आप डेटा को सहेजना शुरू करेंगे, वह 36 या उससे भी कम होगा।

प्रत्येक पढ़ाई आपको 0 या अधिक एवीसी एनएएल इकाइयों को प्राप्त करेगी। आप आईएसओ/आईईसी 14496-10 तालिका 7-1 से एनएएल इकाई प्रकारों की एक सूची पा सकते हैं। वे अनुलग्नक बी में निर्दिष्ट की तुलना में थोड़ा अलग प्रारूप में होंगे, लेकिन यह ठीक है। इसके अतिरिक्त, MP4/MOV फ़ाइल में केवल आईडीआर स्लाइस और गैर-आईडीआर स्लाइस होंगे। आईडीआर वह आई-फ्रेम होगा जिसे आप लटकाना चाहते हैं।

4 bytes - Size 
[Size] bytes - NALU Data 
data[0] & 0x1F - NALU Type 

तो अब आप डेटा के लिए आप देख रहे हैं:

MP4/MOV कंटेनर म एनएएल इकाई स्वरूप इस प्रकार है।जब आप इस फ़ाइल को सहेजने के लिए जाते हैं, तो आपको एमपीवी/एमओवी कंटेनर को सही लंबाई, नमूना गिनती के साथ अपडेट करना होगा, आपको प्रत्येक नमूने के लिए सही आकार के साथ 'stsz' परमाणु को अपडेट करना होगा और चीजों को अपडेट करना होगा फिल्म की सही अवधि के साथ मीडिया हेडर और ट्रैक हेडर आदि। मैं शायद ऐसा करने की अनुशंसा करता हूं कि पहले रन पर एक नमूना कंटेनर तैयार कर रहा है कि आप उस विशेष फिल्म के उचित डेटा के साथ ओवरराइट/ओवरराइट कर सकते हैं। आप ऐसा करना चाहते हैं क्योंकि विभिन्न iDevices पर एन्कोडर्स में सभी समान सेटिंग्स नहीं हैं और 'एवीसीसी' परमाणु में एन्कोडर जानकारी होती है।

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

+0

पर ईमेल कर सकते हैं महान उत्तर, क्या आप इसके लिए कुछ डेमो कोड प्रदान कर सकते हैं। यह बहुत उपयोगी होगा। –

+2

https://github.com/jgh-/VideoCore/blob/master/transforms/Apple/H264Encode.mm 'VTCompressionSession' का कार्यान्वयन दिखाता है। एनएएल इकाइयों को पाइप के नीचे धक्का देने के बजाय 'एच 264 एन्कोड :: संपीड़न सत्रऑटपुट' में इस कोड नमूने में आप उन्हें 30 सेकंड या जो कुछ भी भंडारण के लिए रिंग बफर में डाल सकते हैं। – jgh

+0

ग्रेट!, लिंक साझा करने के लिए धन्यवाद =) –

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