显示AVplayer播放速度在macOS应用程序



我从一个名为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/AVPlayerRateBug

AVPlayer。Rate是应用程序请求的播放速率。

使用AVPlayerItem.timebase.rate

查找实际发生的播放速率

这在WWDC 2016会议"AVFoundation回放的进展"中有详细的解释

https://developer.apple.com/videos/play/wwdc2016/503/?time=378

相关内容

最新更新