這是一個複雜的問題,因爲有很多移動部件。我提前道歉。從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調用?有任何解決它的建議嗎?