NetConnectは、SilverLightから呼び出されたときにFlashでサイレントに失敗します
-
03-07-2019 - |
質問
これは複雑な質問です。なぜなら、多くの可動部分があるからです。事前におMyび申し上げます。
FlashカメラとマイクをホストするSilverlightコントロールを作成しようとしています(Silverlightはこれらの機能をネイティブにサポートしていないため、運が悪いです)。カメラを処理し、connect(uri:String、streamName:String)とdisconnect()の2つの外部メソッドを公開する短いFlexアプリケーション(" WLocalWebCam.swf")を作成しました。次のように、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カムは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が異なる動作をする理由を誰もが知っていますか?トラブルシューティングに関する提案はありますか?
解決
ため息。気にしないで。 &quot; http :// localhost / videochat&quot;に接続しようとすると、違いが生じることがわかりました。 &quot; rtmp::// localhost / videochat&quot;の代わりに。適切なパラメーターを指定すると、すべて正常に機能します。間違ったことを発見する前に、そのコードを数百回見ていたはずです。