我是从名为AVMovieEditor的苹果演示应用开始的。我试图添加播放速度的可视化显示。没有任何修改,AVMovieEditor响应J,K& L键像视频编辑应用程序。 J反向播放,J再次反向播放速度更快,K暂停播放,L播放,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时它会上升到60ish。这将解决我的问题,但有2个细节。首先,当按下L时,第三次视频播放增加,但currentVideoFrameRate
仍然悬挂在60岁左右。第二个问题是currentVideoFrameRate
仅显示正值。如果按下J两次并且AVPlayer.rate
从-1返回到0,则无法知道帧是否以相反的顺序遍历!
我发现有一件事我认为没有任何关于解决方案的信息是实体正在捕捉J,K& L键盘事件,以及正在应用的响应?
Edit2:Apple的quicktime播放器具有我正在寻找的功能。它响应J,K& L喜欢AVMovieEditor,但它显示2x,5x,10x,30x&分别为60x的播放速度,并在左侧显示以进行反向播放。这是仅为Apple保留的东西,还是我也可以拥有它?
编辑3:基于答案(谢谢!)我已经开始查看另一个属性AVplayerItem.timebase.rate
但是这会给出类似错误的结果。
我可以通过每次按下" L"键。我希望这也是"请求率" (AVplayer.rate
)我以前使用的也会增加,因为我看到它在播放时直观地表示,但不是在报告的"请求率"中。 (它转到0)
"播放实际发生率"表现相似。除了当我按下一个停止键时,它仍然显示1的速率,大概是因为玩家在请求停止时正在播放。但AVplayerItem.timebase.rate
也报告"播放实际发生率"当回放速率大于1或小于-1时,为0。
这是我目前用于查看费率的代码。它由观察者触发,该观察者观察所请求的速率的变化。我如何看待这些是否有问题?
NSLog(@"RequestedPlaybackRate:%f",myAVPlayer.rate);
NSLog(@"OccuringPlaybackRate:%f",CMTimebaseGetRate(myAVPlayerItem.timebase));
我还将澄清"请求率"实际上是我想要的,而不是" Playback Actually Occurring Rate"。
Edit4:
创建了一个github项目,可以轻松复制此问题并向Apple提交错误报告。
答案 0 :(得分:0)
AVPlayer.rate是应用程序请求的播放速度。
使用AVPlayerItem.timebase.rate
可以找到实际播放的速率这在WWDC 2016 Session中有详细解释," AVFoundation播放的进展"
https://developer.apple.com/videos/play/wwdc2016/503/?time=378