私のアプリにはAVPlayer
、ビデオ ファイルの再生、スクラブなどに使用される があります。次の機能を実装しようとしていますが、まだ良い解決策が思い浮かびません...
ビデオファイルの長さが3000フレームで、再生ヘッドがフレーム1000にあるとします。ユーザーが「再生」ボタンを押すと、フレーム1000を中心としたビデオの10フレームセクション、つまりフレーム995を再生するビデオが必要です- 1005。プレーヤーがフレーム 995 または 1005 に達したら、再生を逆方向にします。つまり、フレームの順序は次のようになります。
1000-1001-1002-1003-1004-1005-1004-1003-1002-1001-1000-999-998-997-996-995-996-997-998-999-1000
と無限に繰り返します。
最初-addBoundaryTimeObserverForTimes:queue:usingBlock:
に、ビデオ セクションの開始点と終了点を定義し、ブロック内のプレーヤー レートの符号を切り替えるために使用しようとしました。これは時々機能しましたが、ビデオ セクションが小さい場合、最終的に境界の 1 つが「見落とされ」、ビデオはファイルの先頭または末尾に到達するまでその方向に再生され続けます。
–addPeriodicTimeObserverForInterval:queue:usingBlock:
境界が失われたかどうかを確認し、そうであればループ再生をリセットする別の時間オブザーバーを追加することで、これを軽減しようとしました。繰り返しますが、これは時々機能しますが、再生領域の開始または終了がたまたまビデオ ファイルの最初または最後のフレームでもある場合は失敗します (それぞれ)。
次にAVPlayerItemDidPlayToEndTimeNotification
、ビデオ ファイルの境界に達した場合に再生を再度リセットするためのコールバックを設定しようとしました。繰り返しますが、これは時々機能しましたが、最終的に再生を停止するか、再生がファイルの終わりから離れた方向に無期限に再生されました。
私はここで何をすべきか途方に暮れています。効果をシミュレートするために を作成することもできますAVMutableComposition
が、ビデオ プレーヤーの正確な時間に依存するオブジェクトが他にもたくさんあり、適切なビデオをシミュレートするために個別の処理システム全体を実装する必要があるため、アプリの大規模なオーバーホールが必要になります。構成からのプレーヤーの時間(この時点ではあまりやりたくありません)。何か案は?