这是一个复杂的问题,因为有许多活动部分。我提前道歉。

我正在尝试编写一个支持Flash摄像头和麦克风的Silverlight控件(因为Silverlight本身不支持这些东西,运气更糟)。我编写了一个处理相机的简短的小Flex应用程序(“WLocalWebCam.swf”),并公开了两个外部方法:connect(uri:String,streamName:String)和disconnect()。我可以通过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源(例如,按钮单击处理程序)调用这些函数时,Web cam正确连接到RTMP服务器(我正在使用Wowza)。但是,当我从Silverlight在同一页面上调用这些相同的功能时,Flash摄像头无法连接到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;
    }
}

这让我头疼不已。

有没有人知道为什么如果从Silverlight调用而不是从JavaScript调用,那么完全相同的ActionScript会有不同的行为?有关排除故障的建议吗?

有帮助吗?

解决方案

叹息。没关系。事实证明,如果您尝试连接到“ http :// localhost / videochat”,则会有所不同。而不是“ rtmp::// localhost / videochat”。当你给它正确的参数时,它都按预期工作。在我发现我做错了之前,我必须已经看了一百遍这段代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top