14

私は Cocoa アプリで AVPlayer を使用しており、ビデオの最後にジャンプするコマンドを実装しました。

問題は、AVPlayer が指定した場所に移動しないことです。

たとえば、私が持っているビデオの 1 つは 4 分 14 秒の長さです。最後までシークすると、AVPlayer は 4 分 12 秒までシークします。2 秒短いのです。次に再生を押すと、プレーヤーは 2 秒間再生し、最後到達します。

私の最初の試みはこれでした:

[self.player seekToTime:self.player.currentItem.duration];

私はこれに切り替えました:

[self.player seekToTime:self.player.currentItem.duration
        toleranceBefore:kCMTimePositiveInfinity
         toleranceAfter:kCMTimeZero];

どちらも他よりもうまく機能しません。

も求めてみましたkCMTimePositiveInfinity。それはちょうど私を無視しました。

プレーヤーがビデオのその部分をまだ読み込んでいるかどうかは問題ではないようです。途中までシークし、真の最後まで再生してから、もう一度最後までシークを試みると、最後まで戻ってジャンプすることさえできます。

不足は常に 2 秒ではありません。私のビデオのいくつかでは、それは多かれ少なかれ正確に機能し、正確ではないにしても、真の終わりに非常に近くジャンプします. 少なくとも 1 つは、3 秒短くなります。長さは重要ではないようです。これらはすべてほぼ同じ長さですが、1 時間以上の長さで 2 秒短くしようとしている 1 つを除きます。

では、なぜ AVPlayer は、私が指示した場所から 3 秒もジャンプしないのでしょうか? また、私が要求した瞬間にジャンプするように説得するにはどうすればよいでしょうか?

4

2 に答える 2

28

私は公差を誤解し、逆にしました。

各許容値は、AVPlayer が要求された時間からその方向に移動できる距離です。したがって、正の無限大を に渡すtoleranceBeforeことは「好きなだけ早くできます」ということであり、ゼロを渡すことtoleranceAfterは「遅刻しないでください」ということです (これは、最後までシークするときの巧妙なトリックです)。

したがって、解決策は値を切り替えることです。

[self.player seekToTime:self.player.currentItem.duration
        toleranceBefore:kCMTimeZero
         toleranceAfter:kCMTimePositiveInfinity];

または、英語で「早くなるな、でも遅刻はいくらでもできる」</p>

于 2013-01-05T04:30:38.483 に答える