NetConnect беззвучно завершает работу во Flash при вызове из SilverLight

StackOverflow https://stackoverflow.com/questions/808137

Вопрос

Это сложный вопрос, потому что существует множество движущихся частей.Заранее приношу свои извинения.

Я пытаюсь написать элемент управления Silverlight, в котором размещены камера со вспышкой и микрофон (поскольку Silverlight не поддерживает эти вещи изначально, к несчастью).Я написал короткое гибкое приложение ("WLocalWebCam.swf"), которое управляет камерой и предоставляет два внешних метода:подключайтесь(uri: строка, имя_поТока: строка) и отключайтесь().Я могу успешно вызвать их через JavaScript следующим образом (упрощено для удаления обработки ошибок и т.д.):

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

Когда я вызываю эти функции из другого источника JavaScript (например, обработчика нажатия кнопки), веб-камера корректно подключается к RTMP-серверу (я использую Wowza).Однако, когда я вызываю точно такие же функции на той же странице из Silverlight, флэш-камере не удается подключиться к 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);
}

Однако это терпит неудачу интересным образом.Вызывается метод ActionScript connect(), он успешно вызывает getConnection(), но метод обработчика событий handleNetStatus никогда не вызывается, и сервер Wowza никогда не видит попытки подключения.

Вот код ActionScript, который я использую, на этот раз с оставленными отладочными фрагментами.

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

Это заставляет меня серьезно почесать в затылке.

Кто-нибудь знает, почему точно такой же ActionScript вел бы себя по-другому, если бы вызывался из Silverlight противвызывается из JavaScript?Есть какие-нибудь предложения по устранению неполадок?

Это было полезно?

Решение

Вздох.Не бери в голову.Оказывается, это имеет значение, если вы попытаетесь подключиться к "http://локальный хостинг/видеочат" вместо"rtmp:://локальный хостинг/видеочат".Все это работает должным образом, когда вы задаете ему правильные параметры.Я, должно быть, просмотрел этот код сотню раз, прежде чем понял, что я сделал не так.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top