2011-10-05 9 views
6

मैं यहां से कोड का उपयोग कर कम या कम हूं: AVPlayer Video SeekToTime हालांकि, जब मैं स्क्रॉल करने का प्रयास करता हूं तो ऐसा लगता है कि यह कुछ समय बिंदु (मूल रूप से प्रत्येक फ्रेम जो दूसरी बार चिह्न पर रहता है)), इसलिए जब मैं स्क्रबर के माध्यम से साफ़ करता हूं, जहां मेरी अंगुली होती है और आखिरी दूसरी बार यह गुजरती है और वीडियो केवल दूसरे अंक में बदल जाता है।आईओएस एवीप्लेयर कुछ बिंदुओं पर लॉकिंग की तलाश

अब एक "बड़ा" परिवर्तन मैंने किया है क्योंकि हम चिकनी स्क्रॉलिंग चाहते हैं कि कहीं भी "तलाश करने वाला समय" है, मैंने इसे एक खोज के साथ बदल दिया है: सहनशीलता इससे पहले: केसीएमटाइम ज़ीरो सहिष्णुता: केसीएमटाइमजेरो।

यदि आपको और जानकारी चाहिए तो कृपया मुझे बताएं! अग्रिम में धन्यवाद!

उत्तर

12

कोड नीचे देखें: इस कोड को एप्पल नमूना कोड

AVPlayerDemo

का कुछ हिस्सा है आप एक स्ट्रीमिंग खिलाड़ी को लागू करने के लिए नीचे दिए गए नमूना कोड का उल्लेख प्रयास करें।

StitchedStreamPlayer

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

CPSlider | OBSlider

/* The user is dragging the movie controller thumb to scrub through the movie. */ 
- (IBAction)beginScrubbing:(id)sender 
{ 
    mRestoreAfterScrubbingRate = [mPlayer rate]; 
    [mPlayer setRate:0.f]; 

    /* Remove previous timer. */ 
    [self removePlayerTimeObserver]; 
} 

/* Set the player current time to match the scrubber position. */ 
- (IBAction)scrub:(id)sender 
{ 
    if ([sender isKindOfClass:[UISlider class]]) 
    { 
     UISlider* slider = sender; 

     CMTime playerDuration = [self playerItemDuration]; 
     if (CMTIME_IS_INVALID(playerDuration)) { 
      return; 
     } 

     double duration = CMTimeGetSeconds(playerDuration); 
     if (isfinite(duration)) 
     { 
      float minValue = [slider minimumValue]; 
      float maxValue = [slider maximumValue]; 
      float value = [slider value]; 

      double time = duration * (value - minValue)/(maxValue - minValue); 

      [mPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC)]; 
     } 
    } 
} 

/* The user has released the movie thumb control to stop scrubbing through the movie. */ 
- (IBAction)endScrubbing:(id)sender 
{ 
    if (!mTimeObserver) 
    { 
     CMTime playerDuration = [self playerItemDuration]; 
     if (CMTIME_IS_INVALID(playerDuration)) 
     { 
      return; 
     } 

     double duration = CMTimeGetSeconds(playerDuration); 
     if (isfinite(duration)) 
     { 
      CGFloat width = CGRectGetWidth([mScrubber bounds]); 
      double tolerance = 0.5f * duration/width; 

      mTimeObserver = [[mPlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(tolerance, NSEC_PER_SEC) queue:NULL usingBlock: 
      ^(CMTime time) 
      { 
       [self syncScrubber]; 
      }] retain]; 
     } 
    } 

    if (mRestoreAfterScrubbingRate) 
    { 
     [mPlayer setRate:mRestoreAfterScrubbingRate]; 
     mRestoreAfterScrubbingRate = 0.f; 
    } 
} 
+0

आप जानते हैं कि यह कोड मेरे लिए बनाए गए दृश्य/नियंत्रक के बाहर इतना बेहतर काम करता है। केवल स्क्रबर कोड का प्रयास नहीं किया, बहुत बेहतर धन्यवाद काम करता है! –

+0

मैं कोशिश करूँगा। thanx! – headkit

3

bitmapdata.com के साथ-साथ उत्तर (का उपयोग करते हुए [AVPlayer setRate] रोकें/seekTime के बजाय) आप एक वीडियो हर फ्रेम पर एक-फ़्रेम के साथ इनकोडिंग की आवश्यकता है। बस उस सेटिंग के साथ मेरे वीडियो को फिर से एन्कोड किया गया और अब मैं अपने वीडियो के माध्यम से बहुत आसानी से नेविगेट कर सकता हूं!

+0

ग्रेट टिप! धन्यवाद! –

+0

लेकिन आप वीडियो को फिर से एन्कोड कैसे करते हैं? – openfrog

+0

मैंने एडोब मीडिया एनकोडर का उपयोग किया जो नौकरी के लिए बिल्कुल सही था। – kikko

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