cocoaアプリでAVPlayerを使ってスローモーション動画を作ってみます。例: そのビデオの開始位置と終了位置を選択できます。そのビデオをもう一度再生すると、開始位置と終了位置のみのスローモーションが必要になります。誰でもそれを実装する方法を教えてください。AVPLAYERを使った開始位置と終了位置の選択方法とスローモーション。
3 に答える
プレーヤーのタイム オブザーバーを追加する必要があります - addPeriodicTimeObserverForInterval:queue:usingBlock:
。これは、指定した定期的な間隔で呼び出されます。これを使用して、プレーヤーがいつ開始位置または終了位置に到達したかを知ることができます。
開始位置と終了位置については、コードのどこかに保存し、そのメソッドのブロックで比較する必要があります。オブザーバーが必要CMTime
であり、多くの人がそれについて少し混乱していることを覚えておいてください。ここにいくつかの答えがあります:
私は個人的CMTime
に秒ではなく作業することを好みますが、それはあなた次第です.
スロー モーションの場合rate
は、プレーヤーのプロパティを必要な値に設定するだけです。0.5 を指定すると元の速度より 2 倍遅くなり、0.25 を指定すると 4 倍遅くなります。値 0 は再生を一時停止し、値1は普通に再生します。負の値は同じことを行いますが、再生が逆方向 (開始方向) になり、値が 1 (または -1) より大きいと再生が通常より速く設定されます。
そのため...currentTime
プレーヤーのプロパティ(またはtime
ブロックのパラメーター)が開始位置と終了位置の間にあると、再生を観察しながら、レートを目的の位置に設定します。次に、 currentTime が範囲外になるとレートを 1 に戻し、ビデオは通常の速度で再生されます。
これは、私が思うに、最も簡単な方法です。コンポジションを使用して時間範囲をスケーリングすることもできますが、より複雑です。ビデオを再生するだけで、後で処理する必要がない場合は、より単純なソリューションを使用することをお勧めします。
AVFoundation はほぼ無限の可能性を秘めた優れたフレームワークですが、それを扱っているときに見逃してはならない重要な点がいくつかあるため、ドキュメントをより深く読むことをお勧めします。
NSObject *time_observer;
CMTime interval = CMTimeMakeWithSeconds(1.0, NSEC_PER_SEC); // 1 second
__unsafe_unretained typeof(self) weakSelf = self;//necessary to calm compiler
time_observer = [video_player addPeriodicTimeObserverForInterval:interval
queue:NULL usingBlock:^(CMTime time) {
int cur_vid_time = CMTimeGetSeconds([weakSelf.video_player currentTime]);
NSLog(@"vid player time: %d",cur_vid_time);
//vid will play in slow-mo
//beginning at the second second (lol) of the video
if(cur_vid_time >= 2)
[weakSelf.video_player setRate:0.0001];
else
[weakSelf.video_player setRate:1.0];
}];