6

이 사람이 저에게 적어도 일주일 간 가도록했습니다. AMS에 비디오 파일을 녹화하려고합니다. 거의 모든 시간 동안 작동하지만 10 또는 15 회의 녹화 세션 중 1 회를 제외하고는 스트림을 닫을 때 AMS의 넷 스트림에서 'NetStream.Unpublish.Success'를받지 못합니다. 이 문제가 발생하면 rtmpt를 사용하여 AMS에 연결하고 있는데 rtmp보다 정상적으로 작동하는 것 같습니다. 또한, 이것은 단지 Mac에서 사파리에서 발생하는 것처럼 보이지만 그 간헐적 인 이후로 나는 그것을 정말로 신뢰하지 않습니다. 지금 연결 시도마다 새로운 NetConnection을을 사용하고 있습니다 (아래에있는 내 '대답'참조) 포트 (80)를 강제하고 있지 않다 AMS는 게시 취소 명령을받지 못합니다. rtmpt보다 가끔

// just a way to use promises with netStatusEvents 
private function netListener(code:String, netObject:*):Promise { 
    var deferred:Deferred = new Deferred(); 

    var netStatusHandler:Function = function (event:NetStatusEvent):void { 
     if (event.info.level == 'error') { 
      deferred.reject(event); 
     } else if (event.info.code == code) { 
      deferred.resolve(netObject); 
      // we want this to be a one time listener since the connection can swap between record/playback 
      netObject.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
     } 

    }; 

    netObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 

    return deferred.promise; 
} 

// set up for recording 
private function initRecord():void { 

    Settings.recordFile = Settings.uniquePrefix + (new Date()).getTime(); 

    // detach any existing NetStream from the video 
    _view.video.attachNetStream(null); 

    // dispose of existing NetStream 
    if (_videoStream) { 
     _videoStream.dispose(); 
     _videoStream = null; 
    } 

    // disconnect before connecting anew 
    (_nc.connected ? netListener('NetConnection.Connect.Closed', _nc) : Promise.when(_nc)) 
    .then(function (nc:NetConnection):void { 

     netListener('NetConnection.Connect.Success', _nc) 
     .then(function (nc:NetConnection):void { 

      _view.video.attachCamera(_webcam); 
      // get new NetStream 
      _videoStream = getNetStream(_nc); 

      ExternalInterface.call("CTplayer." + Settings.instanceName + ".onRecordReady", true); 

     }, function(error:NetStatusEvent):void { 
      ExternalInterface.call("CTplayer." + Settings.instanceName + ".onError", error.info); 
     }); 

     _nc.connect(Settings.recordServer); 

    }); // end ncClose 

    if (_nc.connected) _nc.close(); 

} 

// stop recording 
private function stop():void { 

    netListener('NetStream.Unpublish.Success', _videoStream) 
    .then(function (ns:NetStream):void {   
     ExternalInterface.call("CTplayer." + Settings.instanceName + ".onRecordStop", Settings.recordFile); 
    }); 

    _videoStream.attachCamera(null); 
    _videoStream.attachAudio(null); 
    _videoStream.close(); 
} 

// start recording 
private function record():void { 

    netListener('NetStream.Publish.Start', _videoStream) 
    .then(function (ns:NetStream):void { 
     ExternalInterface.call("CTplayer." + Settings.instanceName + ".onRecording"); 
    }); 

    _videoStream.attachCamera(_webcam); 
    _videoStream.attachAudio(_microphone); 
    _videoStream.publish(Settings.recordFile, "record"); // fires NetStream.Publish.Success 

} 

업데이트 : 여기 내 기본 흐름이다. 이것은 나의 연결 비참함을 해결하지 못했고 단지 인스턴스를 드물게 만들었습니다. 지금 매주마다 또는 이렇게 나는 암 또는 섬광의 어떤 무작위 실패가 아직도있다. 최근에 누군가가 녹음을 한 다음 플래시 플레이어가 재생을 위해 동영상을로드 할 수 없었습니다. ams 로그에 연결 시도가 표시되고 아무 것도 표시되지 않습니다. 최소한 메타 데이터를로드 할 때 재생 이벤트가 기록되어야합니다. 이것은 매우 실망스럽고 디버깅이 불가능합니다.

+0

wireshark를 사용하여 실제로 시도 했습니까? – bond

+0

** "확인하기에는 너무 빠름"** 문제 일 수 있습니까? try/catch를 할 수 있습니까? 게시 취소 명령을 실패하면 다시 게시를 시도하기 전에 잠시 기다려주세요. RTMPT (RTMP 외의 HTTP 래퍼가되는)의 특성으로 인해 때로는 딸꾹질이 발생하여 시간이 초과 된 시도가 도움이 될 수 있다고 생각합니다. –

+0

정확히 같은 문제가 발생했는데 해결책을 찾았습니까? 'NetStream.Unpublish.Success'가 수신되지 않으면 일정 기간 후에 close()를 다시 호출하는 방법은 무엇입니까? – SoftForge

답변

0

두 개의 서로 다른 NetConnection 객체를 시도합니다. 하나는 레코드 용이고 다른 하나는 재생 용입니다. 이렇게하면 청취자 주변의 복잡성이 제거/제거되고 연결/재 연결/연결 해제 논리가 제거되어 IMO가 더 깨끗해집니다. NetConnections는 저렴하며 항상 작업 당 하나씩 사용했습니다. 다른 장점은 시작할 때 두 가지를 연결하여 재생 연결이 즉시 준비 될 수 있다는 것입니다.

전 여기에 사용 된 약속은 보지 못했지만 문제가 발생할 수 있는지에 대해서는 언급 할 자격이 없습니다.

0

내 문제는 포트 80을 통해 연결되었다고 생각합니다. 원래 원래 포트 80을 rtmpt와 사용해야한다고 생각 했으므로 Settings.recordServer 변수를 rtmpt://myamsserver.net:80/app으로 설정했습니다. 지금 포트/프로토콜 조합을 한꺼번에 시도하고 연결할 첫 번째 포트를 선택하는 샷건 접근 방식을 사용하고 있습니다. 그것은 거의 항상 rtmpt에서 443 번 포트를 선택합니다. 80보다 훨씬 빠르고 안정적으로 보입니다. 이후로이 문제가 없었습니다. 스테판 (Stefan)이 제안한 것과 같은 NetConnection 객체를 재사용하지 않기 때문일 수도 있습니다.