2016-06-22 10 views
3

AVPlayerの-(id)addPeriodicTimeObserverForInterval: queue: usingBlock:メソッドを使用してUIを再生進捗まで更新します。しかし、私のプログレスバーは決して終わりに達しません。AVPlayerのaddPeriodicTimeObserverForIntervalのCMTime:コールバックがアイテムの再生時間に達することはありません

CMTime duration = self.player.currentItem.asset.duration; 
float totalSeconds = (Float64)(duration.value * 1000)/(Float64)(duration.timescale); 
NSLog(@"duration: %.2f", totalSeconds); 

__weak __typeof(self) welf = self; 

_mTimeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(10, 1000) 
               queue:NULL // main queue 
             usingBlock:^(CMTime time) { 

    float totalSeconds = (Float64)(time.value * 1000)/(Float64)(time.timescale); 
    NSLog(@"progress %f", totalSeconds); 

               }]; 

ログ:

App[2373:792179] duration: 3968.00 

ヒット再生ボタン

App[2373:792179] progress 0011.176 
App[2373:792179] progress 0021.175 
... 
App[2373:792179] progress 3701.319 
App[2373:792179] progress 3704.000 

私は最後の数は3968.0ことを期待すべきではありませんか?

オーディオはサーバーからストリーミングされます。

EDIT

最終進捗番号は常にduration - 0.264 sec実際の期間の長さがあるものは何でもです。

これは非常に奇妙なので、私はあなたの上で顔文字を使うことができたらいいと思います。

答えて

0

良い質問です。自分で合計秒数を計算する代わりにCMTimeGetSeconds(time)を試してみてください。

さらに、CMTimeMakeWithSeconds(10.0, NSEC_PER_SEC)を使用して、定期的なオブザーバの時刻を作成してみます。

このポストはCMTIMEある謎のまわりで私の頭をラップするために私をたくさん助けた:https://warrenmoore.net/understanding-cmtime

+0

同じもの(他の音): '再生時間:4.736 maxProgress:4.472'。理由は何でしょうか?編集:ちょうどあなたの更新答えを見た、私は他のオプションを試してみましょう – kerd

+0

私は両方を試してみました - 同じ結果 – kerd

+0

@kerdそれは非常に興味深いです。また、 'CMTimeGetSeconds'を使用して期間を印刷できますか?さらにもう1つ:細かいコールバック値を試してみてください。 10秒の代わりに '1.0/30.0'を試してください。 –

0

ドキュメントはっきり状態:

あなたは限り、あなたは時間を必要と返された値を保持しなければなりませんプレイヤーによって呼び出されるオブザーバー。

+0

申し訳ありませんが、この情報がどのように役立つかをさらに詳しく調べることができますか? Btw、オブザーバーはすでに呼び出されていませんか? – kerd

+0

彼はオブザーバーオブジェクトを強く参照する必要があると言っていますが、それ以外の場合は解放されます。たとえば、UIViewControllerにはplayerTimeObserverというプロパティがあります。 – user3344977

関連する問題