PDA

Просмотр полной версии : Нет loop для netStream


in4core
07.10.2013, 20:58
Вот от руки набросал по-быстрому, почему не робит не могу понять. Тоесть первое воспроизведение есть - дальше нет.


nc.connect(null);
private function onConnect(e:NetStatusEvent):void
{

ns = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS , stateNs);
var sf:Object = new Object();
sf.onMetaData = function(data:Object):void { };
ns.client = sf;

var cls:Class = this["s" + vIndex];
var file:ByteArray = new cls();
ns.play(null);
ns.appendBytes(file);
video.attachNetStream(ns);
addChild(video);

}

private function stateNs(e:NetStatusEvent):void
{
if (e.info.code == "NetStream.Buffer.Empty")
{
trace("ok") // происходит как раз по окончанию видео. Но лупинга нет.
var cls:Class = this["s" + vIndex];
var file:ByteArray = new cls();
ns.play(null);
ns.appendBytes(file);
video.attachNetStream(ns);
}
}
И чего только не пробовал в stateNs - не хочет играть второй раз и все тут!

И еще, задам сразу вопрос, между лупингом ( если и получится ) - есть небольшая задержка в 0.5 сек, видимо с буфферизацией связано, я хз. От нее никак избавится нельзя?

cleptoman
08.10.2013, 10:49
почекай статусы..на конец видео другой статус..."NetStream.Play.Stop"

gloomyBrain
08.10.2013, 12:30
И еще, задам сразу вопрос, между лупингом ( если и получится ) - есть небольшая задержка в 0.5 сек, видимо с буфферизацией связано, я хз. От нее никак избавится нельзя?

Думаю, есть смысл использовать appendBytes (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#appendBytes()) и просто посылать один и тот же ByteArray небольшими порциями в поток, зацикливая таким образом воспроизведение.

in4core
08.10.2013, 13:38
cleptoman - почекал. да и в гугле почитал. BufferEmpty вылазит последним. Тут самое главное, что видео не потоковое , а именно обычное embed flv.

gloomyBrain - так в примере и есть appendBytes. Покажите на примере, что Вы имеете ввиду, я с видео редко работал, поэтому пока , что не понимаю разговора про порции для embed

Psycho Tiger
08.10.2013, 13:57
Ключевое словосочетание здесь "небольшими порциями".

AlexCooper
08.10.2013, 14:29
in4core сам недавно плясал с бубном над appendBytes, да и проблем там намного больше, как с перемоткой потока так и с воспроизведением. Всё как оказалось лучше всего работает только с момента первого запуска. Что я только не чудил и посылал в нетстрим события но в итоге остановился на таком вот костыльке
swc (https://code.google.com/p/flvslicer/)
package smart {

import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.Loader;
import flash.utils.ByteArray;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.NetStreamAppendBytesAction;
import flash.events.MouseEvent;
import org.bytearray.video.FLVSlicer;
import org.bytearray.video.FLVSlice;
import org.bytearray.video.events.SlicedEvent;
import flash.media.SoundTransform;

public class Player extends Sprite {

private var nc:NetConnection = new NetConnection();
private var ns:NetStream;

private var _client: Object = new Object();
private var _bytes:ByteArray;

private var video:Video = new Video(240,120);

public function Player() {

addChild(video);

nc.connect(null);

ns = new NetStream(nc);
ns.client = _client;

_client.onMetaData = metaDataHandler;

video.attachNetStream(ns);

ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
ns.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event) { trace(event) } );
ns.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event:Event) { trace(event) } );

ns.play(null);

addChild(video);
}

public function seek(time:Number):void {

ns.appendBytesAction(NetStreamAppendBytesAction.END_SEQUENCE);

var slicer:FLVSlicer = new FLVSlicer(_byteArray);
slicer.addEventListener( SlicedEvent.COMPLETE, onSliced );
slicer.slice(time*1000, 298000)
// slicer.slice( start time , stop time) // miliseconds
}

private function onSliced(e:SlicedEvent):void {

e.target.removeEventListener( SlicedEvent.COMPLETE, onSliced );

ns = new NetStream(nc);
ns.soundTransform = new SoundTransform(_volume);
ns.client = _client;

_client.onMetaData = metaDataHandler;

video.attachNetStream(ns);

ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
ns.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event) { trace(event) } );
ns.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event:Event) { trace(event) } );

ns.play(null);
ns.appendBytes( e.stream );

}

private var _volume:Number = 1;

public function set volume(vol:Number):void {
_volume = vol;

if (ns) ns.soundTransform = new SoundTransform(_volume);
}

private var _byteArray:ByteArray;

public function set byteArray(byteArray:ByteArray):void {
_byteArray = byteArray;
}

public function play():void {

ns.appendBytesAction(NetStreamAppendBytesAction.END_SEQUENCE);
ns.appendBytes( _byteArray );

}

private function metaDataHandler(info:Object):void
{
/*for ( var i in info) {
trace(i+" >> "+info[i]);
}*/
}



private function netStatusHandler(e:NetStatusEvent):void
{

trace(e.info.code);
switch (e.info.code)
{
case "NetStream.Seek.InvalidTime" :

break;
case "NetStream.Play.Stop" :

break;
case "NetStream.Seek.Notify":

ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
ns.appendBytes(_bytes);

break;
}
}

}

}
Теперь всё работает так как нужно. Создаем экземпляр класса Player и передаем байтаррей в сеттер Player.byteArray. Для воспроизведения вызываем Player.play(), перемотка Player.seek(seconds_var);

in4core
08.10.2013, 18:19
AlexCooper - ну и как лупинг работает? А что касается задержки ее тоже нет? Все плавно начало-конец-начало ? Видео же одно и тоже будем крутить.

Psycho Tiger мне как человеку не сведущему работы с видео - слово порциями - мало чего дает. Я не понимаю, как можно подавать порциями embed video. Это же не поток блин! В примере AlexCooper - немного сказано про FLVSlicer - это уже что то, видимо он и режет на пачки. Но это не нативная либра - чтобы говорить так просто : ВОЗЬМИ да пореж да пусти.

gloomyBrain
08.10.2013, 18:35
Я не понимаю, как можно подавать порциями embed video. Это же не поток блин!

Ну ты можешь заэмбедить его как массив байтов, указав MIME-тип application/octet-stream. И потом создать экземпляр типа ByteArray. Из которого читать байты порциями и отправлять эти порции в netStream.

AlexCooper
08.10.2013, 18:48
AlexCooper - ну и как лупинг работает? А что касается задержки ее тоже нет? Все плавно начало-конец-начало ? Видео же одно и тоже будем крутить.

Может быть стоит попробовать использовать приведённый мной код и ответить на все ответы самому?

in4core
08.10.2013, 20:44
Я проверил. Лупинга нет. Либо я неверно запускаю.
назвал вашу либо как VideoUtil
vUtil.byteArray = new this["s" + vIndex];
addChild(vUtil);
vUtil.play();
Один раз играет и все.

Пробовал и так - безрезультатно.
case "NetStream.Play.Stop" :
ns.seek(0);
break;

Добавлено через 2 минуты
case "NetStream.Buffer.Empty" :
seek(0)
break;
Вот так попрело - но с таким жутким дрыгньем перед новым началом, что ужас. Такое ощущ , что начинается не с первого кадра видео, а с 10 например.

AlexCooper
08.10.2013, 21:53
дык вы постоянно режете. Просто используйте play() если он не хочет перегружать видео, пересоздавайте netStream ( поаналогии в seek )

in4core
09.10.2013, 03:39
Всем спасибо.