6

У меня был хотя бы неделю. Я пытаюсь записать видеофайл в AMS. Он отлично работает почти все время, за исключением 1 из 10 или 15 сеансов записи, я никогда не получаю «NetStream.Unpublish.Success» в моем сетевом потоке от AMS, когда я закрываю поток. Я подключаюсь к AMS, используя rtmpt, когда это происходит, кажется, что он работает нормально над rtmp. Кроме того, похоже, что это происходит только в сафари на Mac, но, поскольку он настолько прерывистый, я на это не верю. Вот мой основной поток: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 

} 

Update Я сейчас, используя новый NetConnection за попытку подключения, а также не форсирует порт 80 (см мой «ответ» ниже). Это не разрешило мои проблемы с подключением, только делали случаи более нечастыми. Теперь, как каждую неделю или около того, у меня все еще есть случайный сбой ams или flash. Совсем недавно кто-то сделал запись, а затем флеш-плеер не смог загрузить видео для воспроизведения. Журналы ams показывают попытку подключения, а затем ничего. По крайней мере, должно быть событие воспроизведения, зарегистрированное для загрузки метаданных. Это довольно сложно и невозможно отладить.

+0

Вы пробовали использовать wirehark и на самом деле проверить? – bond

+0

Может ли это быть «слишком быстро проверить» ** вопрос? Можете ли вы попробовать/поймать, где, если он не выполнит команду unublish, которую вы ждете, прежде чем повторять попытку отменить публикацию ...? Я думаю, что характер RTMPT (являющийся HTTP-оберткой для RTMP и др.) Иногда вызывает икоты, поэтому возможно временная повторная попытка может помочь. –

+0

У меня точно такая же проблема, вы когда-нибудь находили решение? Как насчет вызова close() снова через какое-то время, если 'NetStream.Unpublish.Success' не получен? – SoftForge

ответ

0

Я бы попробовал 2 различных объекта NetConnection, один для записи и один для воспроизведения. Это позволит устранить сложности, связанные с добавлением/удалением слушателей, подключением/повторным подключением/отключением логики и будет ли ИМО более чистым. NetConnections дешевы, и я всегда использовал один на одну задачу. Другим преимуществом является то, что вы можете подключиться как при запуске, так и соединение воспроизведения готово мгновенно.

Я не видел обещание, используемое здесь раньше, но я не имею права комментировать, может ли это вызвать проблему или нет.

0

Я думаю, что моя проблема связана с портом 80. Первоначально мне казалось, что мне нужно использовать порт 80 с rtmpt, поэтому я установил переменную Settings.recordServer в rtmpt://myamsserver.net:80/app. Теперь я использую подход с дробовиком, где я сразу же запускаю группу портов/протоколов и выбираю первый для подключения. Он почти всегда выбирает порт 443 по сравнению с rtmpt, который выглядит намного быстрее и стабильнее всего на 80, и с тех пор у меня не было этой проблемы. Это также может быть связано с тем, что повторно не использовал тот же объект NetConnection, как предложил Стефан, его трудно сказать.