получение размера видео в видеодисплее

#flash #apache-flex #video #dimensions #videodisplay

#flash #apache-flex #Видео #размеры #видеодисплей

Вопрос:

Я пытаюсь получить размеры видеоисточника в видеодисплея:

 private function loadMovie () : void {
    vid = new VideoDisplay();
    vid.source = _item.itemLg;
    vid.play();
    vid.addEventListener ( MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, onVideoPlay );
    addElement(vid);
}

private function onVideoPlay ( event : MediaPlayerStateChangeEvent ) : void {
    if ( event.state == MediaPlayerState.PLAYING ) {
           trace (vid.videoObject.width   " "   vid.videoObject.height);
    }
}
 

Но результат всегда равен 0.

Я получил тот же результат с:

 trace (vid.videoObject.videoWidth   " "   vid.videoObject.videoHeight);
 

Есть еще идеи?

Спасибо

Ответ №1:

Предполагая, что это mx.controls.ВидеоДисплей, после загрузки видео вы сможете использовать:

 trace (vid.videoWidth   " "   vid.videoHeight);
 

Без видеообъекта в середине.

Вы также можете попробовать прослушать событие ready, которое должно срабатывать при успешной загрузке видео, а не при каждом изменении состояния:

 mx.events.VideoEvent.READY 
 

Комментарии:

1. Я использую spark.components. ВидеоДисплей. с помощью mx.controls. ВидеоДисплей Я получил ошибку: Error: 1000: Unable to make connection to server or to find FLV on server.

2. Я также попробовал VideoEvent. ГОТОВ, но я этого не понимаю private function loadMovie () : void { vid = new VideoDisplay(); vid.source = _item.itemLg; vid.addEventListener ( mx.events.VideoEvent.READY, onVideoReady ); addElement(vid); } private function onVideoReady ( event : mx.events.VideoEvent ) : void { trace (vid.videoObject.videoWidth " " vid.videoObject.videoHeight); vid.play(); }

Ответ №2:

Я нашел решение, но я не знаю, почему это работает:

 import org.osmf.events.MediaPlayerStateChangeEvent;
import org.osmf.media.MediaPlayerState;

import spark.components.VideoDisplay;

private var vid : VideoDisplay;
private var videoLoadCompleteTimer : Timer = new Timer (1, 5);

private function loadMovie () : void {
    vid = new VideoDisplay();
    vid.source = _item.itemLg;
    vid.autoPlay = false;
    vid.addEventListener ( MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, onVideoPlay );
          addElement(vid);
}

private function onVideoPlay ( event : MediaPlayerStateChangeEvent ) : void {
    if ( event.state == MediaPlayerState.PLAYING ) {
        videoLoadCompleteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onVideoStart );
        videoLoadCompleteTimer.start();
    }
}

private function onVideoStart ( event : TimerEvent ) : void {
    trace(vid.videoObject.videoHeight   " "   vid.videoObject.videoWidth);
    vid.play();
    videoLoadCompleteTimer.reset();
}
 

Я думаю, что это немного грязно…

Комментарии:

1. Да, использование таймера — не самое чистое решение. Возможно, попробуйте MediaPlayerState. Готово. Решение с таймером работает, потому что к моменту срабатывания таймера onVideoStart() видеоОбъект полностью загружен. Я не возился с компонентами spark, но в целом, когда я работаю с видео, я нахожу, что все дело в поиске правильных событий для прослушивания

Ответ №3:

Я попробовал использовать событие READY, но оно работает только иногда. В основном на второй или третий клик.

 private function loadMovie () : void {
    vid = new VideoDisplay();
    vid.source = _item.itemLg;
    vid.autoPlay = false;
    vid.addEventListener ( MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, onVideoPlay );
    addElement(vid);
}

private function onVideoPlay ( event : MediaPlayerStateChangeEvent ) : void {
    if ( event.state == MediaPlayerState.READY ) {
        vid.play();
    } else if ( event.state == MediaPlayerState.PLAYING ) {
        trace ("VidDimensions: "   vid.videoObject.videoWidth   " "   vid.videoObject.videoHeight);
        this.height = vid.videoObject.videoHeight;
        this.width = vid.videoObject.videoWidth;
        vid.move ( -vid.videoObject.videoWidth/2, -vid.videoObject.videoHeight/2 );
    }
}