21

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

これはしません:

ビデオを最初から開始するのではなく、特定の位置で再生したいと考えています。そのため、KVO を使用してアセットが Play の準備が整うまで待ちます。

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

そして、指定された時間にシークします

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

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

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

私が観察すると、ととしてself.player.currentItem.duration取得し続けます。0valuetimescale

4

1 に答える 1

51

あなたを助けるかもしれないいくつかのこと:

  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];
    
于 2012-08-27T02:23:04.950 に答える