AVFoundation でビデオを再生しようとしています。再生を 1 フレーム進めるボタンに次のコードを使用しています。
断続的に動作し、一部の実行では正しいことを実行して 1 フレーム進みますが、ほとんどの場合、フレームを進める前にボタンを 3 回または 4 回押す必要があります。
これは、ある種の精度の問題だと思いますが、それが何であるかはわかりません。実行されるたびに、新しい CMTime は同じ量だけ進んでいるように見えます。
私の他の理論は、 currentTime がフレームレートで正確なフレーム境界に設定されていないことが原因である可能性があります(ビデオをシークすることが原因です)。しかし、自分のフレーム レートで最も近いフレームに「スナップ」する方法がわかりません。
AVAssetTrack *videoTrack = ...;
Float64 frameRate = [videoTrack nominalFrameRate];
CMTime currentTime = [self.playerItem currentTime];
CMTime oneFrame = CMTimeMakeWithSeconds(1.0 / frameRate, currentTime.timescale);
CMTime added = CMTimeAdd(currentTime, oneFrame);
[self.player seekToTime:added toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
ご協力いただきありがとうございます!