我从一个名为AVMovieEditor的苹果演示应用程序开始。我在尝试添加播放速度的视觉显示。没有经过我的任何修改,AVMovieEditor响应J,K &L键像一个视频编辑应用程序。
我已经成功地创建了一个观察者,但是每次我检查AVplayer.rate
时,它要么是-1,要么是0或1,尽管玩得比实时快。实际上,当按下L时,速率从0变为1,但是当第二次按下L时,回放加速了速率从1变为0?结果与J和反向播放相似,除了速率变为-1然后返回0。
- (void)addPeriodicTimeObserver {
// about 30 times pr second
CMTime interval = CMTimeMake(33, 1000);
// Queue on which to invoke the callback
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// Add time observer
self.timeObserverToken =
[self.movieViewController.playerView.player addPeriodicTimeObserverForInterval:interval
queue:mainQueue
usingBlock:^(CMTime time) {
NSLog(@"%f %f",
self.movieViewController.playerView.player.rate
// only shows -1,0,1 despite playback faster then 100%
[[self.movieViewController.playerView.player.currentItem.tracks[0] assetTrack] nominalFrameRate]);
// Always shows 29.97
}];
}
经过多次搜索,我被难住了,我如何才能找到一个有用的播放率?
我想知道播放的实际帧率,然后我将在我的GUI中做一个指示器来通知最终用户当前的播放速率。
编辑:我发现了另一个有趣的数据,但它并不能解决我的问题…
self.movieViewController.playerView.player.currentItem.tracks[0].currentVideoFrameRate
当在开始播放时观察到上面的内容时,它从0上升到30,然后当第二次按L时,它上升到60。这将解决我的问题,但2个细节。第一次当按下L第三次视频播放增加,但currentVideoFrameRate
仍然挂在60左右。第二个问题是currentVideoFrameRate
只显示正值。如果J被按了两次并且AVPlayer.rate
从-1返回到0,就没有办法知道帧是反向遍历的!
有一件事我没有找到任何信息,我认为可能会对解决方案有所帮助,那就是什么实体正在捕获J,K &L键盘事件,应用了什么响应?
编辑2:苹果的quicktime播放器有我正在寻找的功能。它对J,K, amp;我喜欢AVMovieEditor,但它显示2x, 5x, 10x, 30x &60x分别为它的播放速度,并显示在左边的反向播放。这是苹果专用的还是我也可以拥有?
编辑3:基于一个答案(谢谢!)我已经开始看另一个属性AVplayerItem.timebase.rate
,然而这是给出同样不正确的结果。
我可以确认,从视觉上看,玩家的比率随着每次按下"L"键而增加。我也希望我之前使用的"请求速率"(AVplayer.rate
)也会增加,因为我看到它在播放中直观地表示,而不是在报告的"请求速率"中。(趋于0)
"播放实际发生率"的行为类似。除了当我按下停止键时,它仍然显示1的速率,这可能是因为玩家在请求停止时正在播放。但是当播放率大于1或小于-1时,AVplayerItem.timebase.rate
报告的"播放实际发生率"为0。
这是我目前用来查看利率的代码。它是由监视请求速率变化的观察者触发的。我对这些的看法有问题吗?
NSLog(@"RequestedPlaybackRate:%f",myAVPlayer.rate);
NSLog(@"OccuringPlaybackRate:%f",CMTimebaseGetRate(myAVPlayerItem.timebase));
我还将澄清"请求速率"实际上是我想要的,而不是"播放实际发生速率"。
标:
创建了一个github项目,以便轻松重现此问题,并向Apple提交了错误报告。
https://github.com/markjwill/AVPlayerRateBugAVPlayer。Rate是应用程序请求的播放速率。
使用AVPlayerItem.timebase.rate
查找实际发生的播放速率这在WWDC 2016会议"AVFoundation回放的进展"中有详细的解释
https://developer.apple.com/videos/play/wwdc2016/503/?time=378