これは機能します:ロードされた直後にビデオを再生するAVPlayer
があります。そして、これはうまくいきます。
これはしません:
ビデオを最初から始めるのではなく、任意の位置で再生したい。そのため、KVOを使用してアセットをPlayの準備ができるまで待ちます。
BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay)
そして、与えられた時間を求めて
[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];
ただし、プレーヤーは常に最初のシークでビデオの先頭から開始します。
更新数秒でdispatch_afterを試しましたが、それも機能しません。再生後は機能しますが、最初は機能しません。
私が観察するときself.player.currentItem.duration
引き続き取得します0
をvalue
およびtimescale
として。
あなたを助けるかもしれないもののカップル:
プレイヤーがプレイする準備ができているかどうかをチェックするとき、プレイヤー自体とプレイヤーの現在のアイテムの両方をチェックします。
if(self.player.status == AVPlayerStatusReadyToPlay &&
self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
[self.player play];
}
たとえば、 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];