Pregunta

Esta es una pregunta compleja, porque hay muchas partes móviles. Mis disculpas por adelantado.

Estoy tratando de escribir un control de Silverlight que contenga una cámara Flash y un micrófono (ya que Silverlight no admite estas cosas de forma nativa, peor suerte). He escrito una pequeña aplicación Flex (" WLocalWebCam.swf ") que maneja la cámara y expone dos métodos externos: connect (uri: String, streamName: String), y desconecte (). Puedo llamarlos correctamente a través de JavaScript de la siguiente manera (simplificado para eliminar el manejo de errores, 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);
}

Cuando llamo a estas funciones desde otra fuente de JavaScript (por ejemplo, un controlador de clic de botón), la cámara web se conecta correctamente al servidor RTMP (estoy usando Wowza). Sin embargo, cuando llamo exactamente a estas mismas funciones en la misma página desde Silverlight, la cámara Flash no se conecta al servidor 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);
}

Sin embargo, falla de una manera interesante. Se llama al método ActionScript connect (), se llama con éxito a getConnection (), pero el método del controlador de eventos handleNetStatus nunca se llama, y ??el servidor Wowza nunca ve un intento de conexión.

Aquí está el código ActionScript que estoy usando, esta vez con los bits de depuración que quedan.

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

Esto me ha hecho rascarme seriamente la cabeza.

¿Alguien sabe por qué exactamente el mismo ActionScript se comportaría de manera diferente si se llamara desde Silverlight en lugar de ser llamado desde JavaScript? ¿Alguna sugerencia para solucionarlo?

¿Fue útil?

Solución

Suspiro. No importa. Resulta que hace una diferencia si intenta conectarse a " http : // localhost / videochat " en lugar de " rtmp: : // localhost / videochat " ;. Todo funciona como se espera cuando le das los parámetros correctos. Debo haber mirado ese código cientos de veces antes de ver lo que hice mal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top