Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   pseudo streaming (http://www.flasher.ru/forum/showthread.php?t=149133)

banji 19.01.2011 19:31

pseudo streaming
 
Добрый вечер!
Не могу разобраться с псевдо стримингом.

Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.events.NetStatusEvent;
        import flash.events.TimerEvent;
        import flash.media.Video;
        import flash.net.NetConnection;
        import flash.net.NetStream;
        import flash.utils.Timer;
 
        public class videocanvas extends MovieClip
        {
                public function videocanvas()
                {
                        super();
                        _init();
                }
 
                /**
                * Initialize the videocanvas
                */

                private function _init():void{
                        //initialize variables
                        this._netConnection = new NetConnection();
                        this._netConnection.connect(null);
 
                        this._netStream = new NetStream(this._netConnection);
                        this._netStream.client = {};
                        this._netStream.client.onMetaData = onMetaDataHandler;
                        this._netStream.client.onCuePoint = onCuePointHandler;
                        this._netStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
 
                        this._video = new Video();
                        this._video.attachNetStream(this._netStream);
                        this._video.smoothing = true;
 
                        this._netStream.bufferTime = 5;
                        this._netStream.play("http://localhost/xxx.flv");               
 
                        this._video.width = this.width;
                        this._video.height = this.height;                       
                        this._video.x = -(this._video.width/2);
                        this._video.y = -(this._video.height/2);
 
                        this.addChild(this._video);
 
                        this.updateDisplay = new Timer(3,10);
                        this.updateDisplay.addEventListener(TimerEvent.TIMER,updateTic);
                }
 
 
                private function updateTic(event:TimerEvent){
                }
 
                /**
                * Metadata callback
                * */

                public function onMetaDataHandler(metaInfo:Object){       
                        this._netStream.play("http://localhost/xxx.flv?start=254389343");                       
                }
 
                public function onCuePointHandler(item:Object){
                        trace(1);
                }
 
                private function netStatusHandler(e:NetStatusEvent){
 
                }
 
                //variables section ============================================
 
                //NetStream
                private var _netStream:NetStream;
                /*NetConnection*/
                private var _netConnection:NetConnection;
                /*The video variable*/
                private var _video:Video;
                /*Client variable*/
                private var _stremClient:Object;
                //timer
                private var updateDisplay:Timer;
                //meta object
                private var videoMeta:Object;
        }       
}

В функции:
Код AS3:

                public function onMetaDataHandler(metaInfo:Object){        
                        this._netStream.play("http://localhost/xxx.flv?start=254389343");                       
                }

в параметре start указываю байт и все работает.
Вопрос - откуда взять этот байт?
Если вставляю туда произвольный байт, то ничего не воспроизводиться. Как мне расчитать нужные байты?

Этот байт я спарсил с longtail JWPlayer.

cleptoman 19.01.2011 21:50

насколько помню для псевдострима нужны конкретные таймы (не от балды), которые ловятся как массив в метадате (т.е. в файл должна быть заинжектена правильная метадата))

banji 19.01.2011 23:22

в файл заинжектена карта метаданных с ключами и значениями:
-ключевые кадры
-секунды.

Но тогда не могу обратиться к ним с помощью метода seek().
Все-таки тут надо наверное что-то написать, переопределить может методы, я уже не знаю как, разбираю исходники longtail JWPlayer, но пока не могу понять.
Однако, логи nginx мне говорять что JWPlayer обращается к .flv с параметром start=254389343 или каким-либо другим в зависимости от того куда я нажму. Использовать JWPlayer не могу. Мне важно разобраться в этом вопросе. Если кто-нибудь поможет, буду признателен. Спасибо.

Mighter 20.01.2011 20:14

Код AS3:

for (var i:int = 0; i < info['keyframes']['times'].length; i++) 
{
        if (videoStart < info['keyframes']['times'][i])
        {
                jumpTo = ((info['keyframes']['times'][i] - videoStart < videoStart - info['keyframes']['times'][i - 1]) ? info['keyframes']['filepositions'][i] : info['keyframes']['filepositions'][i - 1]);
                i = info['keyframes']['filepositions'].length + 1;                                               
        }
}
 
stream.play(path + '?start=' + jumpTo);

Что происходит?
videoStart - некое значение времени в секундах на которое мы хотим перейти.
info - объект, приходящий в onMetaDataHandler, у Вас это metaInfo
Пробегаем по всему массиву времен, содержащемуся в метаданных, и находим точку, ближайшую к нашей.
Присваиваем переменной jumpTo значение из массива info['keyframes']['filepositions'], соответствующее найденной ранее точке. Формируем запрос на проигрывание потока, в качестве параметра указываем найденное значение.

banji 21.01.2011 11:34

Спасибо тебе))) Вроде заработало.
Так вот оно как делается. Теперь буду знать.
Спасибо!


Часовой пояс GMT +4, время: 15:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.