2012-08-10 34 views
11

में वीडियो प्लेबैक रिवर्स मैं एवीप्लेयर में वीडियो को पिछड़ा खेलना चाहता हूं। मैंने दरों की संपत्ति को -1.0 में बदलने की कोशिश की है, और हालांकि यह काम करता है यह चिकनी नहीं था। क्या कोई तरीका है जिससे मैं आसानी से वीडियो चला सकता हूं?आईओएस

+4

वीडियो खेल एक दिलचस्प बात है, क्योंकि वीडियो हर एक्स फ्रेम पर मुख्य-फ़्रेम है, और फ़्रेम के बीच फ्रेम बस के परिवर्तन भंडारण कर रहे हैं पिछले फ्रेम से छवि (पूरे फ्रेम नहीं)। इसलिए वीडियो को पिछड़ा खेलना सिर्फ फ्रेम के क्रम को बदलने के बारे में नहीं है, क्योंकि फ्रेम पिछले एक के साथ संबंध में हैं (अगले के साथ नहीं!) और, आम तौर पर, आप फ्रेम के क्रम को बदलने के लिए नहीं बदलते हैं पिछड़ा संस्करण, ज्यादातर मामलों में आपको फिर से वीडियो प्रस्तुत करना चाहिए। यह सामान्य कारण है कि आपको वीडियो के साथ समस्या क्यों है। – holex

+0

बहुत ही रोचक सवाल। – Daniel

+1

धन्यवाद। क्या आप मुझे वीडियो के रिवर्स प्लेबैक के लिए कोई समाधान सुझा सकते हैं? –

उत्तर

6

टिप्पणियों में कहा गया है कि समस्या keyframes के साथ है और तथ्य यह है कि अधिकांश कोडेक्स को पीछे की ओर खेलने के लिए डिज़ाइन नहीं किया गया है। वीडियो को फिर से एन्कोड करने के लिए 2 विकल्प हैं जिनके लिए आपको संपादन में वीडियो को वास्तव में विपरीत करने की आवश्यकता नहीं है।

  1. प्रत्येक फ्रेम को एक कीफ्रेम बनाएं। मैंने इस काम को H.264 जैसे कोडेक्स के लिए अच्छी तरह से देखा है जो कि कीफ्रेम पर भरोसा करता है। असल में यदि प्रत्येक फ्रेम एक महत्वपूर्ण फ्रेम है, तो प्रत्येक फ्रेम को किसी भी पिछले फ्रेम पर भरोसा किए बिना डीकोड किया जा सकता है, इसलिए यह प्रभावी रूप से आगे खेलने जैसा ही है।
  2. एक कोडेक का उपयोग करें जो कि कीफ्रेम और गैर-कीफ्रेम का उपयोग नहीं करता है (मूल रूप से सभी फ़्रेम हमेशा कीफ्रेम होते हैं)। PhotoJPEG एक ऐसा विकल्प है, हालांकि मुझे पूरी तरह से यकीन नहीं है कि यह आईओएस पर वापस खेलता है। मुझे ऐसा लगता है। यह मैक पर बहुत अच्छा काम करता है।

ध्यान दें कि इनमें से किसी भी विकल्प के परिणामस्वरूप सामान्य "कीफ्रेम प्रत्येक एक्स फ्रेम" एन्कोडेड वीडियो की तुलना में बड़े फ़ाइल आकार होंगे।

0

आपको वर्तमान आइटम के अंत तक पहुंचना होगा और फिर ऋणात्मक मूल्य पर दर निर्धारित करनी होगी। कुछ इस तरह:

-(void)reversePlay { CMTime durTime = myPlayer.currentItem.asset.duration; if (CMTIME_IS_VALID(durTime)) { [myPlayer seekToTime:durTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; [myPlayer setRate:-1.0]; } else NSLog(@"Invalid time"); }

स्रोत: https://stackoverflow.com/a/16104363/701043