Flex 流媒体模式读取视频

最近在研究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个小视频。以流的形式传输到客户端。

 

高手如果有更高性能的解决方案。请留言交流

 


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值