سؤال

هذا سؤال معقد، لأن هناك الكثير من الأجزاء المتحركة.اعتذاري مقدما.

أحاول كتابة عنصر تحكم Silverlight الذي يستضيف كاميرا فلاش وميكروفون (نظرًا لأن Silverlight لا يدعم هذه الأشياء محليًا، فهذا حظ سيئ).لقد قمت بكتابة تطبيق Flex قصير ("WLocalWebCam.swf") والذي يتعامل مع الكاميرا ويكشف عن طريقتين خارجيتين:الاتصال (uri:String،streamName:String)، وقطع الاتصال ().يمكنني استدعاء هذه بنجاح من خلال جافا سكريبت على النحو التالي (مبسطة لإزالة معالجة الأخطاء، وما إلى ذلك):

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 vs.يتم استدعاؤها من جافا سكريبت؟هل هناك أي اقتراحات حول استكشاف الأخطاء وإصلاحها؟

هل كانت مفيدة؟

المحلول

تنهد.لا تهتم.اتضح أنه يحدث فرقًا إذا حاولت الاتصال بـ "http//localhost/videochat" بدلاً من "رتمب://localhost/videochat".كل شيء يعمل كما هو متوقع عندما تعطيه المعلمات الصحيحة.لا بد لي من إلقاء نظرة على هذا الرمز مائة مرة قبل أن أكتشف الخطأ الذي ارتكبته.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top