Question

C'est une question complexe, car il y a beaucoup de pièces mobiles. Mes excuses par avance.

J'essaie d'écrire un contrôle Silverlight qui héberge une caméra Flash et un microphone (car Silverlight ne prend pas en charge ces éléments de manière native, pire chance). J'ai écrit une petite application Flex ("WLocalWebCam.swf") qui gère la caméra et expose deux méthodes externes: connect (uri: String, streamName: String) et disconnect (). Je peux les appeler avec succès via JavaScript comme suit (simplifié pour supprimer le traitement des erreurs, etc.):

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

Lorsque j'appelle ces fonctions à partir d'une autre source JavaScript (par exemple, un gestionnaire de clic sur un bouton), la webcam est correctement connectée jusqu'au serveur RTMP (j'utilise Wowza). Cependant, lorsque j'appelle exactement les mêmes fonctions sur la même page à partir de Silverlight, la caméra Flash ne parvient pas à se connecter au serveur RTMP.

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

Cependant, cela échoue de manière intéressante. La méthode ActionScript connect () est appelée, elle appelle avec succès getConnection (), mais la méthode du gestionnaire d'événements handleNetStatus n'est jamais appelée et le serveur Wowza ne voit jamais de tentative de connexion.

Voici le code ActionScript que j'utilise, cette fois avec les bits de débogage restants.

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

Cela m'a fait me gratter sérieusement la tête.

Quelqu'un sait-il pourquoi le même ActionScript se comporterait différemment s'il était appelé depuis Silverlight ou par JavaScript? Des suggestions sur le dépannage?

Était-ce utile?

La solution

Soupir. Ça ne fait rien. Il s'avère que cela fait une différence si vous essayez de vous connecter à & <;> b / <> b>: // localhost / videochat " au lieu de " rtmp: : // localhost / videochat". Tout fonctionne comme prévu lorsque vous lui donnez les bons paramètres. J'ai dû regarder ce code cent fois avant de découvrir ce que j'avais mal fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top