web-dev-qa-db-ja.com

アセットが読み込まれた直後にAVPlayerの特定の位置に移動します

これは機能します:ロードされた直後にビデオを再生するAVPlayerがあります。そして、これはうまくいきます。

これはしません

ビデオを最初から始めるのではなく、任意の位置で再生したい。そのため、KVOを使用してアセットをPlayの準備ができるまで待ちます。

BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay)

そして、与えられた時間を求めて

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

ただし、プレーヤーは常に最初のシークでビデオの先頭から開始します。

更新数秒でdispatch_afterを試しましたが、それも機能しません。再生後は機能しますが、最初は機能しません。

私が観察するときself.player.currentItem.duration引き続き取得します0valueおよびtimescaleとして。

19
Besi

あなたを助けるかもしれないもののカップル:

  1. プレイヤーがプレイする準備ができているかどうかをチェックするとき、プレイヤー自体とプレイヤーの現在のアイテムの両方をチェックします。

    if(self.player.status == AVPlayerStatusReadyToPlay &&
       self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
        [self.player play];
    }
    
  2. たとえば、 15秒、それが最も近いキーフレームの位置である場合、代わりにビデオの最初から開始する場合があります。プレーヤーに正確な場所を探すように強制するには(注:これには数秒かかります)、次のようにします。

    Float64 seconds = 500.0f;
    CMTime targetTime = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
    [self.player seekToTime:targetTime
     toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
    

    または、引数の1つを無限大として指定することにより、指定されたポイントの前後に明示的にキーフレームをシークできます。

    [self.player seekToTime:targetTime
     toleranceBefore:kCMTimePositiveInfinity toleranceAfter:kCMTimeZero];
    
48
darvids0n