我将在可可应用程序中使用 AVPlayer 开始视频慢动作。示例:我可以选择该视频的开始位置和结束位置。如果我再次播放该视频只想慢动作开始和结束位置。任何人请技术我如何实施。如何使用 AVPLAYER 选择开始位置和结束位置以及慢动作。
3 回答
最好使用 改变轨道速度的scaleTimeRange:toDuration:
方法。AVMutableComposition
AVPlayer
变化的速度不再有魔力。
只需创建另一个组合(AVMutableComposition
是 的子类AVAsset
),AVPlayerItem
使用它并将其设置为您的AVPlayer
实例。
您需要为玩家添加时间观察者 - addPeriodicTimeObserverForInterval:queue:usingBlock:
。这将在您指定的定期间隔内调用。您将使用它来了解玩家何时到达开始或结束位置。
对于开始和结束位置,您必须将它们存储在代码中的某个位置并在该方法的块中进行比较。请记住,观察者需要CMTime
,许多人对此感到有些困惑。以下是一些答案:
我个人更喜欢使用CMTime
而不是秒,但这取决于你。
然后对于慢动作,您只需rate
将播放器的属性设置为您需要的任何值 - 0.5 将使其比原始速度慢两倍,0.25 将使其慢四倍等。值为 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];
}];