문제

움직이는 부분이 많기 때문에 이것은 복잡한 질문입니다. 미리 사과드립니다.

나는 플래시 카메라와 마이크를 호스팅하는 Silverlight 컨트롤을 쓰려고 노력하고 있습니다 (Silverlight는 이러한 것들을 기본적으로 지원하지 않기 때문에 운이 좋지 않기 때문에). 카메라를 처리하는 짧은 작은 Flex 응용 프로그램 ( "wlocalwebcam.swf")을 작성하고 두 가지 외부 방법 인 Connect (uri : string, streamname : String) 및 Disponnect ()를 노출시킵니다. 다음과 같이 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의 동일한 페이지에서 동일한 기능을 정확하게 호출하면 플래시 카메라가 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