2012-02-04 17 views
6

के साथ फ़्रेम सिंक्रनाइज़ेशन मुझे CALayer में AVPlayer के साथ उच्च परिशुद्धता पर बाह्य सामग्री समन्वयित करने में कोई समस्या हो रही है।AVPlayer

मेरा पहला विचार CAKeyframeAnimation के भीतर फ्रेम की एक सरणी (वीडियो में फ्रेम की संख्या के बराबर) रखना था और AVSynchronizedLayer के साथ सिंक करना था। हालांकि, वीडियो फ्रेम-दर-फ्रेम के माध्यम से कदम उठाने पर, ऐसा लगता है कि AVPlayer और कोर एनीमेशन अलग-अलग चक्रों पर फिर से चलाया जाता है, क्योंकि सिंक होने से पहले उनके बीच थोड़ी सी (लेकिन ध्यान देने योग्य) देरी होती है।

कोर वीडियो के माध्यम से प्रसंस्करण और प्रदर्शित करने का छोटा, फ्रेम स्तर पर AVPlayer के साथ सटीक रूप से सिंक करने का कोई तरीका है?

अद्यतन: 5 फ़रवरी 2012

अब तक का सबसे अच्छा तरीका मैं यह कर पाया है AVAssetExportSessionAVVideoCompositionCoreAnimationTool और एक CAKeyFrameAnimation के साथ मिलकर के माध्यम से पूर्व प्रस्तुत करना है।

हालांकि, मुझे ऐसा करने के लिए किसी भी वास्तविक समय के तरीके सीखने में अभी भी बहुत दिलचस्पी है।

उत्तर

3

'उच्च परिशुद्धता' से आपका क्या मतलब है?

हालांकि दस्तावेज़ों का दावा है कि AVAssetReader रीयल-टाइम उपयोग के लिए डिज़ाइन नहीं किया गया है, प्रैक्टिस में मुझे रीयल-टाइम में वीडियो पढ़ने में कोई समस्या नहीं है (सीएफ https://stackoverflow.com/a/4216161/42961)। लौटाए गए फ्रेम 'प्रेजेंटेशन टाइमस्टैम्प' के साथ आते हैं जिन्हें आप CMSampleBufferGetPresentationTimeStamp का उपयोग करके ला सकते हैं।

आप इस परियोजना का एक हिस्सा यहां 'मास्टर' टाइमकीपर बनना चाहते हैं। मान लें कि CALayer एनीमेशन गणना करने के लिए त्वरित है और डिस्क एक्सेस जैसी संभावित अवरोधक चीज़ों को शामिल नहीं करता है, मैं इसे मास्टर टाइम स्रोत के रूप में उपयोग करता हूं। आप (अपने UIView उपवर्ग पर जैसे draw चयनकर्ता में) सामग्री आकर्षित करने की आवश्यकता जब आप CALayer एनीमेशन से currentTime पढ़ना चाहिए, यदि आवश्यक हो, copyNextSampleBufferCMSampleBufferGetPresentationTimeStamp जब तक रिटर्न> = currentTime का उपयोग कर AVAssetReader के वीडियो फ्रेम के माध्यम से आगे बढ़ना फ्रेम आकर्षित, और फिर शीर्ष पर कैलियर एनीमेशन सामग्री खींचें।

1

यदि आपका खिलाड़ी AVURLASSet का उपयोग कर रहा है, तो क्या आपने इसे सटीक अवधि ध्वज सेट के साथ लोड किया था? अर्थात। कुछ ऐसा:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options]; 
संबंधित मुद्दे