2016-09-13 6 views
0

私はアップルのデモアプリAVMovieEditorから始めています。私は、再生速度の視覚的な表示を追加しようとしています。私の修正なしに、AVMovieEditorはビデオ編集アプリケーションのようなJキー、K &のLキーに応答します。 Jは逆に再生し、Jは逆に早く再生し、Kは一時停止し、Lは再生し、Lは再び早く再生するなど...macOSアプリでAVplayerの再生速度を表示

私はAVplayer.rateをチェックするたびに、リアルタイムよりも速く再生していますが、1,0または1です。実際にLを押すと、レートは0から1になりますが、Lを2回押すと再生速度が1から0に戻ります。結果は、Jと似ており、当時私は便利な再生レートを見つけることができる方法として困惑していますずっと検索した後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 
    }]; 
} 

に-1にレートの変動を除いて再生を逆にして?

再生の実際のフレームレートを知りたいのですが、GUIで現在の再生レートを知らせるインジケータを作成します。


編集:私は、データの別の興味深いビットを見つけたが、それは私の問題を解決していません...

self.movieViewController.playerView.player.currentItem.tracks[0].currentVideoFrameRate

上記は、それがランプアップ再生を開始する際に観察されます0から30ishまで、Lを2回押すと、60inchまでランプアップします。これは私の問題を解決するだろうが、2つの詳細については。最初にLを押すと3回目のビデオ再生が増えますが、currentVideoFrameRateはまだ60ish前後でハングします。第2の問題は、currentVideoFrameRateが正の値のみを示すことです。 Jを2回押して、AVPlayer.rateが-1から0に戻った場合、フレームが逆順にトラバースしていることを知る方法がありません!

解決策を明らかにする可能性があると私は思っていたことの1つは、エンティティがJ、K & Lキーボードイベントをキャプチャしていることと、どのような応答が適用されているかということです。


Edit2:AppleのQuicktimeプレーヤーには、私が探している機能があります。それはJのK &Lに対応し、AVMovieEditorのように表示されますが、それぞれ再生速度が2x、5x、10x、30x & 60xと表示され、逆再生のために左に表示されます。これはAppleのためだけに予約されているものか、それとも私もそれを持つことができますか?


EDIT3:(!おかげで)回答に基づいて、私は、しかし、これは同様に誤った結果を与えている別のプロパティ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)); 

私は、「要求されたレートは、」「再生が実際に発生レート」、私が欲しいもの、実際にはないことも明らかになります。


Edit4:

この問題を簡単に再現のためのgithubのプロジェクトを作成し、Appleとバグレポートを提出しました。

https://github.com/markjwill/AVPlayerRateBug

+1

プログラマー疼痛!私はこれが一点で機能していると思ったが、現在は機能していない。私は私の忘れた自分の投稿を見つけるためだけの解決策を探し始める: - (.... – markjwill

答えて

0

AVPlayer.rateは、アプリケーションの要求再生レートです。

実際に発生している再生速度をAVPlayerItem.timebase.rate

で発見されたこれは、WWDC 2016セッションで詳しく説明されている「AVFoundation再生の進歩」

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

関連する問題