我将在cocoa应用程序中使用AVPlayer开始视频慢动作。 示例:我可以为该视频选择开始位置和结束位置。如果我再次播放该视频只想慢动作开始和结束位置。任何人请技术我如何实现。如何使用AVPLAYER选择开始位置和结束位置以及慢动作。
答案 0 :(得分:1)
你需要为玩家添加时间观察者 - addPeriodicTimeObserverForInterval:queue:usingBlock:
。这将按您指定的定期间隔调用。您将使用它来了解玩家何时达到开始或结束位置。
对于开始和结束位置,您必须将它们存储在代码中的某个位置,并在该方法的块中进行比较。请记住,观察者需要CMTime
,许多人对此感到有些困惑。以下是一些答案:
我个人更喜欢使用CMTime
代替秒,但这取决于你。
然后对于慢动作你只需要将玩家的rate
属性设置为你需要的任何东西 - 0.5会使它比原始速度慢两倍,0.25会使它慢四倍等等。 0将暂停播放,值1将正常播放。负值将与播放将反转(朝向乞讨)的差异相同,而高于1(或-1)的值将比正常情况更快地设置播放。
所以...在观察播放器的currentTime
属性(或块中的time
参数)在开始和结束位置之间时,观察播放时,将速率设置为所需的速率。然后当currentTime超出你的范围时,设置速率回到1并且视频播放正常速度。
我认为这是最简单的方法。您也可以使用合成然后缩放时间范围,但它更复杂,如果您只是播放视频而不需要在之后处理它,我认为最好坚持使用更简单的解决方案。
希望它有所帮助但是我建议更深入地阅读文档,因为AVFoundation是一个几乎无限可能的伟大框架,但是当你处理它时,你不应该错过一些重要的事情。
答案 1 :(得分: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];
}];
答案 2 :(得分:0)
最好使用AVMutableComposition
AVPlayer
方法来改变曲目的速度。
改变AVMutableComposition
的速度不再具有魔力。
只需创建另一个合成(AVAsset
是AVPlayerItem
的子类),使用它AVPlayer
并将其设置为{{1}}实例。