Я знаю, что есть много способов, чтобы играть файл FLV, но с учетом моих требований проекта, мне нужно играть FLV, используя URLStream и NetStreamиграть FLV с помощью Netstream appendBytes
Вот полный пример кода, который я делаю мои тесты по:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.NetStatusEvent;
import flash.events.ProgressEvent;
import flash.utils.ByteArray;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.NetStreamAppendBytesAction;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.media.Video;
import flash.net.URLStream;
/**
* ...
* @author Hadi Tavakoli
*/
public class Main extends Sprite
{
private var netConnection:NetConnection;
private var netStream:NetStream;
private var ul:URLStream;
private var video:Video;
private var bytes:ByteArray = new ByteArray();
private var _isSeek:Boolean = false;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
video = new Video();
addChild(video);
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionStatusHandler);
netConnection.connect(null);
}
private function netConnectionStatusHandler(ev:NetStatusEvent):void
{
switch(ev.info.code)
{
case 'NetConnection.Connect.Success':
ul = new URLStream();
ul.addEventListener(ProgressEvent.PROGRESS, onProgress);
ul.load(new URLRequest('01.flv'));
break;
}
}
private function onProgress(e:ProgressEvent):void
{
ul.readBytes(bytes, bytes.length);
if (!netStream)
{
netStream = new NetStream(netConnection);
netStream.client = { };
video.attachNetStream(netStream);
netStream.play(null);
trace("BEGIN")
netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
}
else
{
if (!_isSeek)
{
trace("SEEK")
netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);
_isSeek = true;
}
}
if (bytes.length == e.bytesTotal)
{
trace("END")
netStream.appendBytesAction(NetStreamAppendBytesAction.END_SEQUENCE);
}
netStream.appendBytes(bytes);
trace("-")
}
}
}
Я не уверен, что я правильно использую метод «appendBytes»? видео показывается, но будет воспроизводиться только несколько первых кадров, а затем прекратится видео!
в моих глазах кажется все в порядке! есть ли у вас какие-либо советы о том, где моя проблема?
Относительно "..in' ul.readBytes (bytes, bytes.length); 'строка, есть ошибка, о которой я думаю. Это никогда не срабатывало и для меня ..". ** Нет ошибки **. Вы кормите неполные байты кадра и это замявает декодер. Каждый цикл progressEvent автоматически не останавливается/не запускается в байтах следующего кадра, поэтому, если вы получаете только кадры 8 и половину байтов байта в цикле 1, тогда цикл 2 включает в себя несколько полных байтов (из 8), которые не являются полными кадровыми данными, они будут застревать , Любой из них добавляет за x-число кадров количество байтов или ждет всех байтов, а затем добавляет, когда progressEvent завершает –
В этой функции progressEvent используйте appendbytes только в этой строке 'if (bytes.length == e.bytesTotal) {trace (" END «); NetStream.appendBytes (байты); } 'Это будет добавляться, когда все байты доступны и, следовательно, не будут замораживаться. –