#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 );
}
}