2009-04-30 28 views
0

這是一個複雜的問題,因爲有很多移動部件。我提前道歉。從SilverLight撥打電話時,NetConnect在Flash中靜默失敗

我想寫一個Silverlight控件,它承載一個Flash攝像頭和麥克風(因爲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源(例如,單擊按鈕的處理程序),網絡凸輪正確地連接直到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調用?有任何解決它的建議嗎?

回答

0

嘆息。沒關係。原來它的確與衆不同,如果你試圖連接到「HTTP://本地主機/視頻聊天」而不是「RTMP:://本地主機/視頻聊天」。當您爲其提供正確的參數時,這一切都按預期工作。在發現我做錯了什麼之前,我一定已經看過這個代碼了一百次。