Как проверить наличие FLV-файла перед воспроизведением с помощью FLVPlayback в Action Script 3?

Я новичок в сценариях действий, я использую класс FLVPlayback для воспроизведения файлов FLV.

Если я пытаюсь воспроизвести FLV-файл, которого еще не существует, я получаю «VideoError: 1000» с сообщением Unable to make connection to server or to find FLV on server.

Я хочу проверить существование FLV-файла, используя URL-адрес или путь к файлу, прежде чем воспроизводить этот FLV с помощью FLVPlayback. Может ли кто-нибудь предложить способ сделать это.

Спасибо


person Siva    schedule 26.07.2010    source источник


Ответы (2)


Единственный способ безопасно отловить ошибку — это прослушивать fl.video.VideoEvent.STATE_CHANGE и действовать соответствующим образом. Вот небольшой фрагмент кода о том, как это сделать:

import fl.video.FLVPlayback;
import fl.video.VideoEvent;
import fl.video.VideoState;

var videoPlayer:FLVPlayback;
videoPlayer.addEventListener( VideoEvent.STATE_CHANGE, onVideoStateChange );
/** Bad source  **/
videoPlayer.source = "http://www.helpexamples.com/flash/video/caption_video_error.flv";
/** Good source **/
//videoPlayer.source = "http://www.helpexamples.com/flash/video/caption_video.flv";

function onVideoStateChange( evt:VideoEvent ):void
{
    var videoPlayer:FLVPlayback = evt.target as FLVPlayback;
    switch( evt.state )
    {
        case VideoState.CONNECTION_ERROR:
            trace( 'Connection error' );
            /**
             * Once you hit this event, you should run some logic to do one or more of the following:
             *   1. Show an error message to the user
             *   2. Try to load another video
             *   3. Hide the FLVPlayback component
             */
            break;
        default:
            trace( 'Player is: ' + evt.state );
    }
}

Полный список возможных констант VideoState см. на странице fl.video.VideoState.

person Rudisimo    schedule 26.07.2010
comment
Кстати, для того, чтобы этот фрагмент работал правильно, вам нужно иметь экземпляр компонента FLVPlayback на временной шкале с именем «videoPlayer». - person Rudisimo; 26.07.2010
comment
Спасибо, Рудисимо, ваш код ясен и очень полезен для меня. Есть ли какое-либо VideoState (например, CONNECTION_ERROR), после которого я могу воспроизвести видео с помощью метода play ()? - person Siva; 28.07.2010
comment
Я отредактировал ответ, чтобы включить список в полный список констант VideoState. - person Rudisimo; 01.08.2010

Я думаю, вы сможете использовать stateChange. Одним из возможных типов событий является VideoState.CONNECTION_ERROR. и еще один — VideoState.DISCONNECTED, который также может работать.

Попробуйте дать этому шанс.

Если это не сработает, единственный способ, который я могу придумать, - это выполнить запрос HEAD или GET для FLV, прежде чем пытаться его загрузить. Только успешный ответ вызовет загрузку видео обычным способом. Я не помню, поддерживает ли Flash запросы HEAD, но если да, то это, безусловно, лучший вариант.

Если Flash не поддерживает запросы HEAD, вам может быть лучше иметь простой серверный скрипт, который мог бы проверить существование FLV, прежде чем вы действительно запросите его. Таким образом, вы можете использовать простой запрос GET без необходимости извлечения всего файла.

ВНУТРЕННЕЕ МЫШЛЕНИЕ
Я просто думаю, что другим возможным решением с использованием GET может быть отмена загрузки, как только bytesLoaded > 1K (например), или что-то в этом роде. Пока вы проверяете размер, превышающий полученный вами ответ 404, вы должны быть в состоянии предположить, что FLV загружается.

person sberry    schedule 26.07.2010
comment
Большое спасибо sberry2A, ваши решения очень хороши для решения моей проблемы. Я использовал «VideoState.CONNECTION_ERROR», чтобы исправить свою проблему. - person Siva; 28.07.2010