2016-07-20 13 views
1

私はこのコードを持っています。 コードはログビデオで動作しますが、短いビデオでは非常にうまく動作します。 私は短いビデオをタップするとAVPlayerが途中スウィフトAVPlayer seekToTimeは問題

にプリントない、唯一の初めの近くやビデオの終わり近くに求める:

Val : 3.36008475976495 
Val : 7.14189817632069 
Val : 13.3303201306846 
Val : 3.70388597945183 
Val : 3.93308679257642 
Val : 3.24548435320265 
Val : 3.70388597945183 
Val : 18.8311396456748 
Val : 27.0823689181601 
Val : 40.1468152662618 
Val : 51.3776551093667 
Val : 17.2267339538027 
Val : 9.54850671412889 
Val : 23.4151559081666 
Val : 37.6256063218913 

valは私秒の正しい値をrappresents追求するつもりはない。 悪い英語で申し訳ありません、私はイタリア語です

答えて

4

遊びの時間を聞かせる方法があります。この方法のための

player.seekToTime(<#time: CMTime#CMTime#>) 

、プレイヤーはすぐにseekingTimeしようが、seekingTimeがある場所を正確に、それはいくつかのseekingTimeのオフセットがあるでしょう意味を求めていません。

Appleのドキュメント

このメソッドを使用し、現在のプレーヤーの項目を指定された時間をシークします。

検索された時間は、効率のために指定された時間と異なる場合があります。

正確なサンプルを検索するには、seeToTime:toleranceBefore:toleranceAfter:を参照してください。この方法のための

player.seekToTime(<#T##time: CMTime##CMTime#>, completionHandler: <#T##(Bool) -> Void#>) 

、プレイヤーはオフセットで、あなたはcompletionHandler

に求める

Appleのドキュメント

このメソッドを使用して何かを行うことができ、迅速かつもseekingTimeに努めてまいります現在のプレイヤアイテムのための特定の時間、シーク操作が完了したときに通知される。

プロセス中である、任意の前のシーク要求に対する完了ハンドラはNOに完成パラメータ

セットですぐに呼び出されます。新しい要求が別のシーク要求またはその他の操作によって中断されずに完了した場合、指定された

完了ハンドラが完了パラメータをYESに設定して呼び出されます。

あなたは、より正確な追求したい場合は、

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>) 

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>, completionHandler: <#T##(Bool) -> Void#>) 

代わりに以下の方法を使用し、この方法はうまく(あなたが求めて指定した時刻に求めているプレイヤーをさせますが、遅くなります。..ほとんど

Appleのドキュメント

使用現在のプレーヤーの項目に指定された時間をシークするには、このメソッドは、現在のメディアに)依存します。

シークした時間は[time-toleranceBefore、time + toleranceAfter]の範囲内になり、効率のために指定された時間と異なる場合があります。

追加のデコード遅延を招く可能性があるサンプルの正確なシークを要求するには、toleranceBeforeとtoleranceAfterの両方にkCMTimeZeroを渡します。

このメソッドはbeforeToleranceでメッセージします。kCMTimePositiveInfinityとafterTolerance:kCMTimePositiveInfinityは、メッセージのseekToTime:と同じです。

私は願いをuを助けることができるあなたが

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate)) 

を使用している現在、指定した時間 (もちろん、より遅い)を探しに、このメソッドを使用しようとすることができた旨の通知

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 

をしました

1

実際に提供された回答のいずれかが疑わしいです。これを試してください:

テクニカルQ & A QA1820 AVPlayerでスムーズなビデオスクラブを実現するにはどうすればよいですか?

Q:私のアプリでは、AVPlayerのseekToTimeと組み合わせてスライダーコントロールを使用してビデオファイルをスクラブできますが、ビデオフレームの表示にはかなりの遅れがあります。よりスムーズなスクラブを実現するにはどうすればよいですか?

A:AVPlayerのseekToTimeへの呼び出しを、急速に続けないでください。これにより、進行中のシークがキャンセルされ、多くのシークが発生し、ターゲットフレームが表示されなくなります。代わりに、AVPlayerのseekToTime:の完了ハンドラバリアントを使用して、進行中のシークが完了するのを待ってから別のイベントを発行してください。リスト1とリスト2は、このテクニックの例を示しています(注:これらの例では、有効なプレーヤーオブジェクトが作成され、プレーヤーの現在のアイテムステータスがキー値観測によって維持されていることを前提としています)。

AVPlayerの完了ハンドラバリアントの使用seekToTime:スムーズなスクラビング(Swift)。

import AVFoundation 

class MyClass { 

    var isSeekInProgress = false 
    let player = <#A valid player object #> 
    var chaseTime = kCMTimeZero 
    // your player.currentItem.status 
    var playerCurrentItemStatus:AVPlayerItemStatus = .Unknown 

    ... 

    func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime) 
    { 
     player.pause() 

     if CMTimeCompare(newChaseTime, chaseTime) != 0 
     { 
      chaseTime = newChaseTime; 

      if !isSeekInProgress 
      { 
       trySeekToChaseTime() 
      } 
     } 
    } 

    func trySeekToChaseTime() 
    { 
     if playerCurrentItemStatus == .Unknown 
     { 
      // wait until item becomes ready (KVO player.currentItem.status) 
     } 
     else if playerCurrentItemStatus == .ReadyToPlay 
     { 
      actuallySeekToTime() 
     } 
    } 

    func actuallySeekToTime() 
    { 
     isSeekInProgress = true 
     let seekTimeInProgress = chaseTime 
     player.seekToTime(seekTimeInProgress, toleranceBefore: kCMTimeZero, 
       toleranceAfter: kCMTimeZero, completionHandler: 
     { (isFinished:Bool) -> Void in 

      if CMTimeCompare(seekTimeInProgress, chaseTime) == 0 
      { 
       isSeekInProgress = false 
      } 
      else 
      { 
       trySeekToChaseTime() 
      } 
     }) 
    } 

} 
関連する問題