Frage

Dies ist eine komplexe Frage, denn es gibt viele bewegliche Teile. Ich entschuldige mich im Voraus.

Ich versuche, ein Silverlight-Steuerelement zu schreiben, die eine Flash-Kamera und Mikrofon beherbergt (da Silverlight nativ nicht, diese Dinge unterstützen, schlimmes Glück). Ich habe eine kurze kleine Flex-Anwendung geschrieben ( "WLocalWebCam.swf"), die die Kamera übernimmt, und stellt zwei externe Methoden: connect (uri: String, stream: String) und disconnect (). Ich kann diese erfolgreich durch JavaScript aufrufen wie folgt (vereinfacht die Fehlerbehandlung zu entfernen, usw.):

function connectWebCam(webCamID, rtmpUri, streamName) {
    var flashCam = getWebCam(webCamID);
    flashCam.Connect(rtmpUri, streamName);
}

function disconnectWebCam(webCamID) {
    var flashCam = getWebCam(webCamID);
    flashCam.Disconnect();
}

function getWebCam(id) {
    return document.getElementById(id);
}

Wenn ich diese Funktionen von einer anderen JavaScript Quelle nenne (zum Beispiel eines Button-Klick-Handler), verbindet der Web-Cam auf den RTMP-Server richtig (Ich bin mit Wowza). Allerdings, wenn ich genau dieselben Funktionen auf der gleichen Seite von Silverlight nennen, die Flash-Kamera nicht auf den RTMP-Server verbinden.

/// <summary>
/// Connect() invokes the connectWebCam() JavaScript function contained in the WebCam.js file on the website.
/// The connectWebCam() method in turn calls the Connect() method on the contained Flash web cam object.
/// </summary>
public void Connect()
{
    ScriptObject connectWebCam = (ScriptObject)HtmlPage.Window.GetProperty("connectWebCam");
    connectWebCam.InvokeSelf(CameraID, RtmpUri.ToString(), CameraID);
}

Sie vermag jedoch nicht auf eine interessante Art und Weise. Die Actionscript-Methode connect () aufgerufen wird, es erfolgreich ruft getConnection (), aber die handleNetStatus Event-Handler-Methode wird nie genannt, und der Wowza Server sieht nie einen Versuch zu verbinden.

Hier ist der Actionscript-Code verwende ich, diesmal mit den Debug-Bits nach links in.

public function connect(uri:String, name:String):void
{
    rtmpUri = uri;
    streamName = name;
    logMessage("Beginning attempt to open connection; rtmpUri=" + rtmpUri + "; streamName = " + streamName);
    logMessage("Retrieving camera.");
    cam = Camera.getCamera();
    if( cam != null )
    {
        logMessage("Retrieved camera.");
        cam.setMode( 320, 240, 20 );
        cam.setQuality( 0,0 );          
    }
    else
    {
        logMessage("Unable to retrieve camera instance.");
    }

    logMessage("Retrieving microphone.");
    mic = new Microphone();
    if (mic == null)
    {
        logMessage("Unable to retrieve microphone instance.");
    }
    logMessage("Retrieving NetConnection.");
    chatNC = getConnection(); 
}

private function getConnection(): NetConnection
{
    var nc: NetConnection = new NetConnection();    
    if (nc != null)
    {
        logMessage("Retrieved NetConnection().");
        nc.client = this;
        nc.objectEncoding = ObjectEncoding.AMF0;
        nc.addEventListener( NetStatusEvent.NET_STATUS, this.handleNetStatus );
        logMessage("Connecting to " + rtmpUri);
        nc.connect(rtmpUri); // <-- We get successfully to this point.
    }
    else
    {
        logMessage("Unable to retrieve new NetConnection()");
    }               
    return nc;
}

private function handleNetStatus( event:NetStatusEvent ):void
{
    logMessage("[SYSTEM MESSAGE] net status " + event.info.code + "  type " + event.type); // <-- We never get this far.  This bit never gets called.

    switch( event.info.code )
    {
        case "NetConnection.Connect.Success":
            publishVideoStream();
            break;
        default:
            Alert.show("Error connecting: " + event.info.code, "Error Connecting");
            break;
    }
}

Das bin ich bekam ernsthaft meinen Kopf kratzen.

Hat jemand wissen, warum genau die gleiche Actionscript anders verhalten würde, wenn von Silverlight genannt vs. von JavaScript aufgerufen wird? Irgendwelche Vorschläge zur Fehlerbehebung oder?

War es hilfreich?

Lösung

Sigh. Keine Ursache. Stellt sich heraus, es macht einen Unterschied, wenn Sie versuchen, eine Verbindung herstellen " http : // localhost / Videochat" anstelle von " rtmp: : // localhost / Videochat". Es funktioniert alles wie erwartet, wenn Sie es, die richtigen Parameter geben. Ich muss hundertmal an diesem Code ausgesehen haben, bevor ich entdeckte, was ich falsch gemacht habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top