最近在研究Flex读取流媒体的相关技术。最初用FMS作为流媒体服务器。感觉在网络较差的情况下,即便是是自适应下载情况也比较不理想。预加载和Buffer的设置不是很尽如人意。而且FMS的成本也很高。所以改变思路研究了下流媒体的数据生成模式。变通的解决相关系列的问题。
废话不多说。开始上代码。
第一步:首先我们要确定读取的文件位置。这里可用FileReference定位你本地计算机的视频文件 也可用直接用流读取到缓存里。
private function GetVideoToStreamByte(url:String):ByteArray
{
var file:File = File.applicationDirectory .resolvePath(url);
var stream:FileStream = new FileStream;
stream.open(file, FileMode.READ);
var bytes:ByteArray = new ByteArray;
stream.readBytes(bytes, 0, stream.bytesAvailable);
stream.close();
return bytes;
}
第二步:视频文件转换成字节的方法OK后。在页面初始化的时候调用此方法转换视频文件
var bytes:ByteArray = GetVideoToStreamByte("sample");
第三部:将视频加载到VideoDisplay中
private function PlayLocalVideo(bytes:ByteArray):void
{
nc = new NetConnection();
nc.connect(null);
if(ns)
{
ns.close();
ns.client.onMetaData = null;
ns = null;
}
video = new Video();
video.smoothing = true;
video.width = 200;
video.height = 200;
ns = new NetStream(nc);
video.attachNetStream(ns);
ns.client.onMetaData= function(info:Object):void{};
ns.client.onCuePoint= function(info:Object):void{};
ns.play(null);
ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
ns.appendBytes(bytes);
vd.addChild(video);
}
最后补充一点。如果想判断上一个视频文件是否播放完毕。可用netStatusHandler中的状态NetStream.Buffer.Empty判断。
private function netStatusHandler(event:NetStatusEvent):void {
switch (event.info.code) {
case "NetStream.Buffer.Empty" :
index++;
if(index>=N)index =0;
PlayLocalVideo(videoBytes.getItemAt(index) as ByteArray);
break;
}
}
到现在为止 视频就可用播放了。如果想在服务端播放视频 可用用Socket将视频切分成N个小视频。以流的形式传输到客户端。
高手如果有更高性能的解决方案。请留言交流