2011-10-05 2 views
6

私はここからコードを使用しています:AVPlayer Video SeekToTime しかし、私はそれをスクロールしようとすると、特定の時点(基本的にすべてのフレームが2番目のタイムマーク)ので、私がスクラブをスクラブすると、私の指の位置と最後の秒との間で前後に撮影を続け、ビデオが通過すると、ビデオはその2番目のマークでのみ変化します。iOS AVPlayer seektotime特定のポイントでロックする

スムーズなスクロールが必要なので、私がした "大きな"変更は、seekToTime:置き換えられた "seekToTime"がどこにあるかです。toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero。

さらに詳しい情報が必要な場合はお知らせください。前もって感謝します!

答えて

12

はコードの下に参照してください:あなたは以下のサンプルコードを参照して、ストリーミングプレーヤーを実装しようとした場合、このコードは、Appleのサンプルコード

AVPlayerDemo

の一部です。

StitchedStreamPlayer

も、正確にスクラブへの完全な実装は、以下のようなスライダーを使用しています。 素晴らしいビデオプレーヤーはUXを検討する必要があるためです。あなたが知っているように、デフォルトのビデオアプリを実行しているスライダーを下にドラッグすると微調整が必​​要になります。

CPSlider | (代わりに一時停止/ seekTimeの[AVPlayer setRate]を使用して)bitmapdata.comの答えとともに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

あなたは、すべてのフレームのキーフレームでエンコードされたビデオを持っている必要があります。 その設定でビデオを再エンコードするだけで、ビデオを非常にスムーズにナビゲートできます。

+0

すばらしいヒント!ありがとう! –

+0

しかし、あなたはどのようにビデオを再エンコードするのですか? – openfrog

+0

私は仕事に最適なAdobe Media Encoderを使用しました。 – kikko

関連する問題