Flex + Puffer + live-stream per RTMP = Katastrophe
Kann nicht bekommen keine Liebe überall auf dieser und es ist ziemlich schwer zu glauben. Live-streaming und einen Puffer auf ein NetStream nicht mischen. Warum? Die docs nicht sagen, Sie können das nicht tun.
Die Wiedergabe wird abgespritzt. Puffer füllt, was Sie möchten, bevor Sie spielen. Anstatt, obwohl, etwa die Hälfte der Zeit, die der player startet die Wiedergabe sofort, und missachtet die buffer-Zeit, die Sie festgelegt haben. Dann erhalten Sie gefangen in kurzen Pufferung und rebuffering Zyklen, verschlechtert sich die Wiedergabequalität.
Give it a shot selbst. Hier ist die einfachste live-streaming-video-Player. Kein Schnickschnack. Schließen Sie es einfach an Ihren live-stream durch die änderung der defaultURL string-und stream-Namen in der ns.play () - Anweisung.
Führen Sie es in der Flex-debug-Modus. Überprüfen und drucken Sie die ns.bufferLength-Eigenschaft jede Sekunde. Der Puffer eingestellt ist, um 20 Sekunden aktuell. Letzte mal ich lief es, ich habe nie hat es über 2 Sekunden im Puffer. Spieler spielen begann sofort, anstelle von Puffern die vollen 20 Sekunden ersten. Manchmal bekommen Sie die vollen 20 und manchmal nicht. Warum? Keine Ahnung.
Können Sie nicht Puffer einen live-stream zuverlässig oder gibt es etwas falsch mit dem code?
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
initialize="init()">
<mx:Script>
<![CDATA[
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import mx.core.UIComponent;
private var vid:Video;
private var videoHolder:UIComponent;
private var nc:NetConnection;
private var defaultURL:String="rtmp://your_streaming_server_url_here";
private var ns:NetStream;
private var msg:Boolean;
private var intervalMonitorBufferLengthEverySecond:uint;
private function init():void
{
vid=new Video();
vid.width=864;
vid.height=576;
vid.smoothing = true;
//Attach the video to the stage
videoHolder = new UIComponent();
videoHolder.addChild(vid);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
this.addChild(videoHolder);
connect();
}
public function onSecurityError(e:SecurityError):void
{
trace("Security error: ");
}
public function connect():void
{
nc = new NetConnection();
nc.client = this;
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect(defaultURL);
}
public function netStatusHandler(e:NetStatusEvent):void
{
switch (e.info.code) {
case "NetConnection.Connect.Success":
trace("Connected successfully");
createNS();
break;
case "NetConnection.Connect.Closed":
trace("Connection closed");
connect();
break;
case "NetConnection.Connect.Failed":
trace("Connection failed");
break;
case "NetConnection.Connect.Rejected":
trace("Connection rejected");
break;
case "NetConnection.Connect.AppShutdown":
trace("App shutdown");
break;
case "NetConnection.Connect.InvalidApp":
trace("Connection invalid app");
break;
}
}
public function createNS():void
{
trace("Creating NetStream");
ns=new NetStream(nc);
//nc.call("FCSubscribe", null, "live_production"); //Only use this if your CDN requires it
ns.addEventListener(NetStatusEvent.NET_STATUS, netStreamStatusHandler);
vid.attachNetStream(ns);
//Handle onMetaData and onCuePoint event callbacks: solution at http://tinyurl.com/mkadas
//See another solution at http://www.adobe.com/devnet/flash/quickstart/metadata_cue_points/
var infoClient:Object = new Object();
infoClient.onMetaData = function oMD():void {};
infoClient.onCuePoint = function oCP():void {};
ns.client = infoClient;
ns.bufferTime = 20;
ns.play("your_stream_name");
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
function asyncErrorHandler(event:AsyncErrorEvent):void {
trace(event.text);
}
intervalMonitorBufferLengthEverySecond = setInterval(monPlayback, 1000);
}
public function netStreamStatusHandler(e:NetStatusEvent):void
{
switch (e.info.code) {
case "NetStream.Buffer.Empty":
trace("Buffer empty: ");
break;
case "NetStream.Buffer.Full":
trace("Buffer full:");
break;
case "NetStream.Play.Start":
trace("Play start:");
break;
}
}
public function monPlayback():void {
//Print current buffer length
trace("Buffer length: " + ns.bufferLength);
}
public function onBWDone():void {
//Do nothing
}
public function onFCSubscribe(info:Object):void {
//Do nothing. Prevents error if connecting to CDN.
}
public function onFCUnsubscribe(info:Object):void {
//Do nothing. Prevents error if connecting to CDN.
}
]]>
</mx:Script>
</mx:Application>
Mein letzten run:
Connected successfully
Creating NetStream
Play start:
Buffer length: 0.001
Buffer full: //Obviously the buffer is not full here. Bogus.
Buffer length: 2.202
Buffer length: 2.369
Buffer length: 2.102
Buffer length: 2.402
Buffer length: 2.302
Buffer length: 2.369
Buffer length: 2.269
Buffer length: 2.269
Buffer length: 2.302
Buffer length: 2.369
Buffer length: 1.926
Buffer length: 2.336
Buffer length: 2.286
Buffer length: 2.336
Buffer length: 2.336
Buffer length: 2.403
Buffer length: 2.388
Buffer length: 2.402
Buffer length: 2.335
Buffer length: 2.369
Buffer length: 2.336
Buffer length: 2.339
Buffer length: 2.369
Buffer length: 2.402
Buffer length: 2.369
Buffer length: 2.396
Buffer length: 2.436
Buffer length: 2.336
Buffer length: 2.269
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den AS3-Referenz ausdrücklich, dass Sie dies nicht tun:
Gegeben, dass, wenn Sie uns sagen, was Sie zu erreichen versuchen, dann können wir vielleicht vorschlagen, eine andere Lösung.
Mehr von einem Gedanken, aber hier geht: Flash Player-internen streaming-Uhrwerk sich weigern, Puffer, nicht mehr von live-streams als das, was es hält "notwendig". Die Idee ist, dass, wenn Sie einen live-stream, Sie haben einen live-stream. In den meisten Situationen, mit Verzögerung durch Puffer (denken Sie one-on-one video-chat) wäre lächerlich und frustrierend.
Diese Dinge können tatsächlich kontrolliert vom server, aber ich könnte falsch sein, auf diese. Hoffe Sie finden eine gute Lösung für das problem 🙂