2009-07-03 8 views
4

Mit NetStream Pufferung Inhalt von http zu streamen, ich habe bemerkt, dass esp mit bestimmten exportierten h264 der, wenn der Spieler einen leeren Puffer trifft, wird es auf die gewünschte Länge stoppen und Puffer (wie erwartet).Action: NetStream stottert nach

Sobald jedoch der Puffer voll ist, wird die Wiedergabe nicht fortgesetzt, sondern springt als solche voraus - sofort wird die gepufferte Dauer in einem kurzen Moment abgespielt und somit erneut ein leerer Puffer ausgelöst. Dies wird dann fortgesetzt und über.

Vermutlich, wenn der Netstream puffert, wird die Abspielposition fortgesetzt, und der Spieler versucht, auf diese Position aufzuspielen - aber es könnte 5 Sekunden dauern, um einen 2 Sekunden Puffer zu bauen - es endet mit einem nutzlosen Puffer wieder ..

(dies ist eine Annahme)

ich versucht habe durch das hören für ein leeres Puffer netstatus Ereignis, Unterbrechen des Stroms, und zur gleichen Zeit der Einrichtung eine Schleife, um dieses Werk zu überprüfen die aktuelle Pufferlänge gegenüber der angeforderten Pufferlänge .. und wieder aufnehmen, sobald die Pufferlänge größer oder gleich dem angeforderten Puffer ist .. dies verursacht jedoch Probleme, wenn nicht genug von th ist e Video übrig .. zum Beispiel, ein 10-Sekunden-Puffer mit nur noch 5 Sekunden, sitzt die Schleife nur dort auf eine Pufferlänge von 10 Sekunden warten, wenn es nur noch 5 übrig ...

Sie würden denken, dass Sie einfach überprüfen Sie, welche kleiner war, die verbleibende Zeit oder die angeforderte Pufferlänge .. aber die Zeiten Flash gibt sind nicht genau ..

Wenn Sie den aktuellen Zeitindex der Net-Streams hinzufügen, plus die gepufferte Zeit, ist die Summe nicht die gesamte Dauer des Films (wenn am Ende) .. es ist nahe, aber nicht das Gleiche.

Das bringt mich zurück zum ursprünglichen Problem, und wenn es eine andere Möglichkeit gibt, dies zu beheben, weiß Flash eindeutig, wenn der Puffer bereit ist, also wie kann ich Flash-Pause beim Puffern, und wieder aufnehmen, sobald der Puffer bereit ist ? zur Zeit ist es nicht .. es pausiert und dann, sobald der Puffer voll ist - es spielt den gesamten gepufferten Inhalt in etwa 0,1 Sekunde.

Vielen Dank im Voraus, Stephen.

Antwort

4

Okay gut, viele der Suche um (wow, wie schwer es ist, dieses Problem zu beschreiben) .. Ich denke, zusätzlich das Problem zu geringer Bandbreite und eine Menge Leute dieses Szenario kann nicht testen .. zusammenhängt

wie auch immer, viele Menschen diese themen- erleben scheint auf den Codec abhängig settings- vielleicht Keyframing oder wie die Streaming-Hinweise arbeiten .. ich habe keine Ahnung.

Was ich weiß, ist dies kein Problem für den Spieler sein sollte, Flash noch einmal ein großer Stich lassen wird ..

ABER, ich habe es geschafft, ein Hack, um dieses Problem zu beheben, wenn Sie hören Sie die netstatus Ereignis, und für einen leeren Puffer Ereignis warten, können Sie den Strom unterbrechen .. ideal jetzt Sie einen Puffer voll Ereignis zu hören, und wieder it- aber da der Strom in den Puffer paused- nicht bauen (aber Natürlich wird das Video immer noch geladen).

Wenn Sie nun einen Timer einstellen (set ich ein Ereignis auf dem Rahmen eingeben), und achten Sie auf eine von zwei Bedingungen erfüllt werden:

  • a) die bufferLength größer als oder gleich der buffer (tatsächliche Puffer wird mindestens angeforderten Puffer size)
  • b) die geladenen Bytes zählen gleich der Gesamtanzahl der Bytes

Zustand A zählen, ist nicht genug bec Am Ende des Videos kann die bufferLength nicht in der Lage sein, die angeforderte Puffergröße anzupassen, da die verbleibende Zeit geringer ist, und die aktuelle Abspielkopfposition + tatsächliche Pufferlänge zu diesem Zeitpunkt nicht gleich der Dauer des Films ist Aus diesem Grund ist Bedingung B erforderlich. Sie überprüfen, ob der Film vollständig geladen und somit spielbar ist.

Hier ist mein Code, wenn überhaupt nützlich für alle:

function onNetStatus(e:NetStatusEvent):void 

    if (e.info.code == "NetStream.Buffer.Empty") { 

     ns.pause(); 

     playerRoot.addEventListener(Event.ENTER_FRAME, function() { 
      if (ns.bufferLength >= ns.bufferTime || ns.bytesLoaded == ns.bytesTotal) { 
       playerRoot.removeEventListener(Event.ENTER_FRAME, arguments.callee); 
       ns.resume(); 
      } 
     }); 
    } 
} 

Beifall.

0

begegnete ich nie das Problem, das Sie beschrieben. Tritt es bei jedem Video auf?

Eine Sache, die Sie versuchen können, ist Ihr Video mit JW Player Streaming zu sehen, ob das gleiche Problem tritt (http://www.longtailvideo.com/players/jw-flv-player/). Dies ist ein Open-Source-Video-Player in AS3 gebaut.

+0

Hallo David, nein, es passiert nicht bei jedem Video - also vermutlich ein Kodierungsproblem ... was ein Alptraum ist. Es ist codiert als h264 von Camtasia, Keyframes jede Sekunde .. Ich denke, ich werde ein paar verschiedene Exporte versuchen, um das Problem zu nageln - wenn ich es finde, werde ich zurück posten. Vielen Dank – meandmycode

Verwandte Themen