ActionScript 3 NetStream немедленно приостановлен не получает метаданные

Я пишу базовый видеопроигрыватель в Flash CS5 и ActionScript 3. Для этого базового плеера я присоединяю свой NetStream к своему NetConnection, а затем вызываю метод потока .play (), чтобы начать загрузку. Хотя я хочу, чтобы метаданные и поток начали буферизоваться, я не хочу сразу начинать воспроизведение, поэтому немедленно вызываю метод потока .pause (). К сожалению, когда я немедленно останавливаюсь, событие onMetaData моего клиента потока не всегда вызывается, поэтому я не обязательно получаю общее время воспроизведения загруженного видео.

В качестве обходного пути я помещаю вызов метода «pause» внутри прослушивателя onMetaData, но иногда мое видео будет воспроизводиться немного до получения его метаданных, и поэтому будет продолжать воспроизведение до тех пор, пока оно не появится.

Есть ли хороший способ остановить воспроизведение моего потока и при этом получить метаданные моего видео?


person Slobaum    schedule 28.09.2010    source источник


Ответы (2)


Хорошо, вот небольшой изящный способ подумать об этом по-другому ... Не присоединяйте свой видеообъект к объекту потока сразу. Начните воспроизведение потока при отображении визуального элемента "пожалуйста, подождите" БЕЗ отображения вашего видеообъекта. В прослушивателе onMetaData посмотрите, сохраняли ли вы ранее продолжительность. Если нет, предположим, что это первый вызов onMetaData, сохранение продолжительности, приостановка воспроизведения, поиск потока до 0, ЗАТЕМ присоединение видеообъекта.

Пользователь увидит сообщение «пожалуйста, подождите» всего на секунду, затем видео появится, будет приостановлено и готово к воспроизведению с ожидаемой продолжительностью. Пользователь будет совершенно не подозревать, что поток проигрывается немного вперед, пока он ждал.

person Slobaum    schedule 30.09.2010
comment
если вы это сделаете, вам также необходимо установить для параметра SoundTransform NetStream значение 0, иначе вы можете услышать звук из видео во время его воспроизведения, чтобы получить метаданные. - person DanK; 30.09.2010
comment
Ха! Спасибо @DanK, я работаю над системой без аудиовыхода (динамики или наушники), так что это определенно была неприятная небольшая оплошность. ;) - person Slobaum; 30.09.2010

Вы должны вызвать паузу при возникновении NetStatusEvent.STATUS события NetStream.Play.Start.

Обновление:

Для очень коротких потоков (например, buffer> duration) NetStream.Play.Start скорее всего будет запущен непосредственно перед обратным вызовом onMetaData.

Перед приостановкой на NetStream.Play.Start проверьте, предоставлены ли метаданные, если нет, не делайте паузу прямо, а подождите onMetaData, чтобы приостановить (просто установите флаг, например pauseOnMetaData = true).

person Theo.T    schedule 30.09.2010
comment
Проблема в том, что событие NetStream.Play.Start может срабатывать до получения метаданных. Я не думаю, что это гарантирует, что у меня будут метаданные, когда я вызову паузу, а пауза помешает их получению. - person Slobaum; 30.09.2010
comment
даже несмотря на то, что в этот момент вы вызываете паузу, поток продолжает буферизоваться, и вы все равно будете получать метаданные. Оба события следует обрабатывать отдельно. - person Theo.T; 30.09.2010
comment
Хммм. Я чувствовал, что когда я делал паузу в этот момент, я никогда не получал метаданные. Спасибо, я попробую. - person Slobaum; 30.09.2010