Воспроизведение двух последовательных видео с использованием VideoPlayer без «черной рамки между ними» - PullRequest
0 голосов
/ 10 февраля 2011

Я играю несколько коротких видеоклипов друг за другом, и я хочу, чтобы это выглядело как одно непрерывное видео. Есть ли способ склеить их так, чтобы это было незаметно при установке нового источника видео.

В данный момент у меня проблема с вставкой черной рамки при установке нового видеоисточника. Порядок событий выглядит примерно так

-> Видео заканчивается -> Завершено событие отправлено -> Установить источник для нового видео -> Экран становится пустым (этого не должно происходить, вместо этого он должен сохранять последний кадр видео до тех пор, пока не будет загружено новое видео) -> Прошло несколько миллисекунд -> начинает воспроизводиться новое видео.

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

Спасибо

Dennis

Ответы [ 2 ]

0 голосов
/ 10 февраля 2011

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

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
    <fx:Metadata>
        [Event(name="complete", type="org.osmf.events.TimeEvent")]
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import org.osmf.events.MediaPlayerStateChangeEvent;
            import org.osmf.events.TimeEvent;
            import org.osmf.media.MediaPlayer;
            import org.osmf.media.MediaPlayerState;

            import spark.components.VideoPlayer;

            var _source:String = "";
            var activePlayer:VideoDisplay = null;
            var otherPlayer:VideoDisplay = null;
            var playerIndex:int = 0;

            public function set source (value:String) {
                trace('set source: ' + value)
                if(value == '' || value == null || value == _source) {
                    trace('rejected source');
                    return;
                }

                if(activePlayer != null) {
                    activePlayer.depth = 3;
                }
                activePlayer = getElementAt(playerIndex) as VideoDisplay;
                playerIndex = playerIndex == 0?1:0;
                otherPlayer = getElementAt(playerIndex) as VideoDisplay;
                trace('active player: ' + activePlayer.id);
                activePlayer.addEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, player1_mediaPlayerStateChangeHandler);
                activePlayer.source = value;
                _source = value;

            }
            public function get source ():String {
                return _source;
            }

            protected function player1_mediaPlayerStateChangeHandler(event:MediaPlayerStateChangeEvent):void
            {
                trace('state change: ' + event.state + ', player: ' + (event.currentTarget.id));
                if(event.state == MediaPlayerState.READY) {
                    player1.removeEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE,player1_mediaPlayerStateChangeHandler);
                    player2.removeEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE,player1_mediaPlayerStateChangeHandler);

                    activePlayer.play();
                    activePlayer.depth = 2;
                    otherPlayer.depth = 1;
                }
            }

            protected function completeHandler(event:TimeEvent):void
            {
                if(event.currentTarget == activePlayer) {
                    trace('video complete');
                    dispatchEvent(event);
                }
            }

        ]]>
    </fx:Script>

    <s:VideoDisplay id="player1"  autoRewind="false" complete="completeHandler(event)" autoPlay="true" opaqueBackground="false"/>
    <s:VideoDisplay id="player2"  complete="completeHandler(event)" autoRewind="false" autoPlay="true" opaqueBackground="false" />

</s:Group>
0 голосов
/ 10 февраля 2011

Технически это выполнимо, однако я сомневаюсь, что вы сможете сделать это правильно в 100% случаев. Вот как вам нужно это сделать.

Непосредственно перед тем, как закончится первое (или предыдущее) видео, вам нужно будет загрузить следующее видео в новом экземпляре плеера. Конечно, в зависимости от ряда факторов, от того, как скоро до того, как первый закончит работу, нужно загрузить следующий, зависит ряд факторов. 1. Битрейт следующего видео 2. Пропускная способность интернета клиентского компьютера. 3. Если предыдущее видео не было загружено полностью, прежде чем вам нужно будет загрузить следующее, вам придется учитывать это, чтобы не мешать воспроизведению текущего воспроизводимого видео. 4. Некоторые клиентские компьютеры могут не справиться с этим без заиканий и глюков.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...