2016-06-22 3 views
3

Ich verwende AVPlayers -(id)addPeriodicTimeObserverForInterval: queue: usingBlock: Methode, um UI bis zum Wiedergabefortschritt zu aktualisieren. Mein Fortschrittsbalken erreicht jedoch niemals das Ende.CMTime in AVPlayers addPeriodicTimeObserverForInterval: Callback erreicht nie die Dauer des Elements

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); 

               }]; 

Protokolle:

App[2373:792179] duration: 3968.00 

Hit Play-Taste

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

Sollte ich nicht erwarten, dass letzte Nummer 3968.0 sein?

Audio wird vom Server gestreamt.

EDIT

Letzte Fortschritte Zahl ist IMMERduration - 0.264 sec was tatsächliche Dauer lang ist.

Das ist so seltsam, ich wünschte, wir könnten Emoticons auf SO verwenden.

Antwort

0

Gute Frage. Versuchen Sie es mit CMTimeGetSeconds(time) anstatt die gesamten Sekunden selbst zu berechnen.

Versuchen Sie außerdem, CMTimeMakeWithSeconds(10.0, NSEC_PER_SEC) zu verwenden, um die Zeit für den periodischen Zeitbeobachter zu erstellen.

Dieser Beitrag hat mir sehr geholfen, meinen Kopf zu wickeln um das Rätsel, das cmtime ist: https://warrenmoore.net/understanding-cmtime

+0

Gleiches (anderes Stück): 'duration: 4.736 maxProgress: 4.472'. Was kann der Grund sein? EDIT: Just sah Sie aktualisierte Antwort, ich werde versuchen, andere Optionen – kerd

+0

Ok, ich habe beide versucht - das gleiche Ergebnis – kerd

+0

@ kerd Das ist sehr interessant. Können Sie auch 'CMTimeGetSeconds' verwenden, um die Dauer zu drucken? Und noch etwas: Versuchen Sie einen feinkörnigeren Rückrufwert. Versuchen Sie anstelle von 10 Sekunden '1.0/30.0'. –

0

Die klar Zustand docs:

Sie müssen so lange den zurückgegebenen Wert behalten, wie Sie die Zeit wollen Beobachter, der vom Spieler aufgerufen werden soll.

+0

Entschuldigung, aber könnten Sie bei der weiteren Klärung helfen, wie diese Informationen helfen können? Übrigens, ist der Beobachter nicht schon aufgerufen? – kerd

+0

Er sagt, dass Sie eine starke Referenz auf das Objekt des Beobachters haben müssen, sonst wird es freigegeben. Zum Beispiel könnte Ihr UIViewController eine Eigenschaft namens playerTimeObserver haben. – user3344977

Verwandte Themen