0

我将在可可应用程序中使用 AVPlayer 开始视频慢动作。示例:我可以选择该视频的开始位置和结束位置。如果我再次播放该视频只想慢动作开始和结束位置。任何人请技术我如何实施。如何使用 AVPLAYER 选择开始位置和结束位置以及慢动作。

4

3 回答 3

2

最好使用 改变轨道速度的scaleTimeRange:toDuration:方法。AVMutableComposition

AVPlayer变化的速度不再有魔力。

只需创建另一个组合(AVMutableComposition是 的子类AVAsset),AVPlayerItem使用它并将其设置为您的AVPlayer实例。

于 2017-07-20T08:10:09.627 回答
1

您需要为玩家添加时间观察者 - addPeriodicTimeObserverForInterval:queue:usingBlock:。这将在您指定的定期间隔内调用。您将使用它来了解玩家何时到达开始结束位置。

对于开始结束位置,您必须将它们存储在代码中的某个位置并在该方法的块中进行比较。请记住,观察者需要CMTime,许多人对此感到有些困惑。以下是一些答案:

我个人更喜欢使用CMTime而不是秒,但这取决于你。

然后对于慢动作,您只需rate将播放器的属性设置为您需要的任何值 - 0.5 将使其比原始速度慢两倍,0.25 将使其慢四倍等。值为 0 将暂停播放,值为1 可以正常播放。负值的作用相同,不同之处在于播放将反转(朝向乞求),高于 1(或 -1)的值将设置播放比正常速度更快。

所以......在观察播放器的currentTime属性(或time块中的参数)在您的开始和结束位置之间时,您将速率设置为所需的速率。然后,当 currentTime 超出您的范围时,将速率设置回 1 并且视频播放正常速度。

我认为这是最简单的方法。您也可以使用合成然后缩放时间范围,但它更复杂,如果您只是播放视频并且不需要事后处理它,我认为最好坚持使用更简单的解决方案。

希望它有所帮助,但是我建议您更深入地阅读文档,因为 AVFoundation 是一个很棒的框架,具有几乎无限的可能性,但是在处理它时您不应该错过一些重要的事情。

于 2014-04-13T12:45:53.367 回答
0
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];
                                                               }];
于 2015-03-14T03:09:38.643 回答