का उपयोग कर .mov से फ्रेम-दर-फ्रेम पार्सिंग मैं एक .mov फ़ाइल से H.264 फ्रेम को पार्स करने का प्रयास कर रहा हूं। मुझे लगता है कि मैं इस निष्कर्ष पर आया हूं कि एफएफएमपीईजी के एवीफॉर्मैट-भाग से mov.c जाने का रास्ता है। लेकिन mov.c असम्बद्ध कोड के बगल में ~ 2600 लाइनें है। मैं एफएफएमपीईजी के उपयोग के उदाहरणों की तलाश में हूं, विशेष रूप से किसी भी फ़ाइल प्रकार की संरचना को पार्स करना। कोई फर्क नहीं पड़ता कि यह एमपीईजी 4 या क्विकटाइम मूवी है क्योंकि वे संरचना में काफी समान हैं।ffmpeg
यदि कोई मौजूदा उदाहरण नहीं है (मुझे कोई नहीं मिल रहा है) शायद किसी ने इसका उपयोग किया है और मुझे कोड की कुछ पंक्तियां दे सकते हैं, या समझाया जा सकता है कि कैसे शुरू किया जाए?
मुझे क्या करना कोशिश कर रहा हूँ: मैं AVCaptureSession का उपयोग वीडियो कैमरा से नमूने पर कब्जा करने, इन नमूनों तो H264 में इनकोडिंग और AVAssetsWriter, AVAssetsWriterInput और AVAssetsWriterInputPixelBufferAdaptor की मदद से फाइल करने के लिए लिखा जाता है। इसका कारण यह है कि मैं सीधे हार्डवेयर H264 एन्कोडिंग तक नहीं पहुंच सकता क्योंकि सेब इसे अनुमति नहीं देगा। क्या मैं अब क्या करने की जरूरत (मुझे यकीन है कि नहीं लगता) को पार्स आउट है:
"mdat" -atom .mov फ़ाइल से (मूवी डेटा, वहाँ हो सकता है एक से अधिक मुझे लगता है कि)। फिर के साथ "-टॉम और फिर वीडियो-परमाणु के भीतर (वीडियो डेटा नमूना, एक से अधिक हो सकता है)। मुझे लगता है कि कई परमाणु होंगे जो मैं मानता हूं कि फ्रेम है। ये "avc1" प्रकार का होगा (यह H264 के लिए प्रकार है)। कृपया मुझे इस में सही करें क्योंकि मुझे पूरा यकीन है कि मुझे यह सब ठीक से नहीं मिला है।
मेरा प्रश्न यह है कि, मैं एकल फ्रेम को पार्स करने के बारे में कैसे जाउंगा। मैं the documentation पढ़ रहा हूं और iFrameExtractor पर देखा (जो फ्रेम को डीकोड करने के बाद से बहुत उपयोगी नहीं है)। मुझे लगता है कि जब मैं mov.c FFMPEG-AVFormat से उपयोग करना चाहता हूं तो मुझे यह सही ढंग से समझ गया है लेकिन मुझे यकीन नहीं है।
संपादित करें: मैं अब इस तरह कोशिश कर रहा हूँ:
मैं जो .mov फ़ाइल में वीडियोस्ट्रीम पाता है थोड़ा कम init समारोह मैं iFrameExtractor चलाते हैं।
मैं इस तरह के फ्रेम के लिए डेटा प्राप्त:
AVPacket packet; av_read_frame(pFormatCtx, &packet); NSData *frame; if(packet.stream_index == videoStream){ frame = [NSData dataWithBytes:packet.data length:packet.size]; } videoStream++; av_free_packet(&packet); return frame;
मैं तो NSOperation की एक उपवर्ग जहां यह अपलोड करने के लिए प्रतीक्षा में बनाए रखा है के लिए इसे पारित। लेकिन मुझे EXC_BAD_ACC प्राप्त होता है, क्या मैं फ्रेम से डेटा कॉपी करते समय कुछ गलत कर रहा हूं? कोई विचार। मुझे EXC _.. मिलता है। जब मैं क्लास वेरिएबल NSData* frame
को अपने (nonatomic, retain) -property का उपयोग करके सेट करने का प्रयास करता हूं। (यह संश्लेषण पंक्ति पर EXC_BAD_ACC कहता है)
mov.c अंत लक्ष्य के साथ मदद करने के लिए नहीं जा रहा है। यदि आपको एमओवी/एमपी 4 पार्सिंग सहायता की ज़रूरत है तो यह आसान हो सकता है। जब चीजें किसी न किसी हो जाती हैं [mp4v2] (http://code.google.com/p/mp4v2/) के लिए एक और आसान लाइब्रेरी। असल में आपको इसे खुद लिखना होगा। विभिन्न कारणों से नौकरी पाने के लिए कोई पुस्तकालय नहीं जा रहा है। –
@Steve McFarlin, धन्यवाद, आप क्यूटी-प्रलेखन छोड़कर पढ़ने क्योंकि मैं सच में मुसीबत यह सभी उत्साहित हो रही है mov फ़ाइल की पूरी संरचना समझ पर कोई सुझाव है, यह है कि परमाणु भी नहीं है सही है एक विशिष्ट क्रम में होना चाहिए? आपको लगता है कि mov या mp4 के साथ काम करने के लिए सबसे आसान कौन सा था? –
@Steve McFarlin, मैं लगता है कि आप iFrameExtractor परियोजना को देखा है। मार्टिन बोहेम (उदाहरण के लिए dranger.com पर) के ट्यूटोरियल में यह भी वही कोड है। अगले फ्रेम फ़ंक्शन में वे केवल av_read_frame का उपयोग करते हैं और फिर इसे डीकोड करते हैं। AV_read_frame द्वारा संशोधित AVPacket एन्कोडेड H264-फ्रेम नहीं होगा? –