Domanda

Questa è una domanda complessa, perché ci sono molte parti in movimento. Mi scuso in anticipo.

Sto cercando di scrivere un controllo Silverlight che ospita una videocamera e un microfono Flash (poiché Silverlight non supporta queste cose in modo nativo, peggio ancora). Ho scritto una piccola applicazione Flex ("WLocalWebCam.swf") che gestisce la fotocamera ed espone due metodi esterni: connect (uri: String, streamName: String) e disconnect (). Posso chiamarli con successo tramite JavaScript come segue (semplificato per rimuovere la gestione degli errori, ecc.):

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

Quando chiamo queste funzioni da un'altra fonte JavaScript (ad es. un gestore di clic sui pulsanti), la web cam si collega correttamente al server RTMP (sto usando Wowza). Tuttavia, quando chiamo esattamente queste stesse funzioni sulla stessa pagina di Silverlight, la fotocamera Flash non riesce a connettersi al server 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);
}

Tuttavia, fallisce in modo interessante. Il metodo ActionScript connect () viene chiamato, chiama correttamente getConnection (), ma il metodo del gestore eventi handleNetStatus non viene mai chiamato e il server Wowza non vede mai un tentativo di connessione.

Ecco il codice ActionScript che sto usando, questa volta con i bit di debug rimasti.

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

Questo mi ha fatto seriamente grattare la testa.

Qualcuno sa perché lo stesso identico ActionScript si comporterebbe diversamente se chiamato da Silverlight rispetto a essere chiamato da JavaScript? Qualche suggerimento su come risolverlo?

È stato utile?

Soluzione

Sigh. Non importa. Si scopre che fa la differenza se provi a connetterti a " http : // localhost / videochat " invece di " rtmp: : // localhost / videochat " ;. Funziona come previsto quando gli dai i parametri giusti. Devo aver esaminato quel codice centinaia di volte prima di scoprire cosa avevo fatto di sbagliato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top