2011-10-05 26 views
6

我或多或少地使用這裏的代碼:AVPlayer Video SeekToTime 但是,當我嘗試滾動時,它似乎鎖定到某些時間點(基本上每個放置第二個時間標記的幀),所以當我擦洗擦洗器時,我的手指和最後一秒之間來回拍攝,視頻僅在第二個標記處變化。iOS AVPlayer在某些時刻鎖定我的鎖定

現在我做了一個「大」的變化,因爲我們需要平滑滾動,因爲我在任何地方都有一個「seekToTime」,我用seekToTime替換了它:toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero。

如果您需要更多信息,請讓我知道!提前致謝!

回答

12

參考下面的代碼:此代碼是蘋果的示例代碼

AVPlayerDemo

某些部分如果試圖實現一個流媒體播放器,請參閱下面的示例代碼。

StitchedStreamPlayer

也,一個完整的工具準確地擦洗是使用下面的滑塊一樣。 因爲偉大的視頻播放器應該考慮UX。就像你知道運行默認的視頻應用程序當你拖動滑塊時,如果拖動滑塊必須進行微調。

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

我會嘗試。感謝名單! – headkit

3

隨着bitmapdata.com答案(使用[AVPlayer setRate],而不是暫停/ seekTime),你需要有對每幀的關鍵幀編碼的視頻。 只需使用該設置重新編碼我的視頻,現在我可以非常順利地瀏覽我的視頻!

+0

偉大的提示!謝謝! –

+0

但是,您如何重新編碼視頻? – openfrog

+0

我使用Adobe Media Encoder,它非常適合這項工作。 – kikko