zoukankan      html  css  js  c++  java
  • Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器

    今天折腾了大半天,总算搞出了一个功能简单的视频播放器,可以向公司领导交差了 :)

    步骤:

    1.Flash CS4 中 先拖一个"FLVPlayback"组件到舞台上

    注:FLVPlayback本身已经具备了flv播放的基本功能,简单设置下属性就能播放视频了

    2.加载xml数据源

    xml数据源格式如下:

    <?xml version="1.0" encoding="utf-8"?>
    <data>
      <item flv="flv地址1" photo="缩略图1" url="点击路径1" name="名称1"></item>
      <item flv="flv地址2" photo="缩略图2" url="点击路径2" name="名称2"></item>        
      ...
    </data>
    

    ActionScript加载XML的核心代码:

    var _xml:XML ;//声明一个XML类型的变量,用于后面接收数据
    var _urlReq:URLRequest = new URLRequest();
    _urlReq.url="xml文件地址";
    var _loader:URLLoader=new URLLoader(_urlReq);//(异步)开始加载xml
    _loader.addEventListener(Event.COMPLETE,loadCompleted);//配置加载完成后的回调函数
    
    //加载完成后的处理函数
    function loadCompleted(e:Event):void {
    	_xml=XML(_loader.data);
    	for each (var item in _xml.item) {
    		trace(item.@flv + "," + item.@photo + "," + item.@url + "," + item.@name});//AS中用@来访问xml节点元素的属性
    	}	
    }
    

    3.将TileList组件与xml数据绑定起来

    TileList有点类似于Silverlight中的WrapPanel,在"Flash/Flex学习笔记(2):捕获摄像头"中最下面的截图列表就是TileList组件的应用,关于它的使用不重复贴代码了

    至于tileList与xml的绑定,主要是通过DataProvider来完成


    关键As3源代码:

    import fl.events.ListEvent;
    import fl.video.VideoEvent;
    import fl.video.VideoProgressEvent;
    
    lblDebug.visible = false; //关闭调试
    flv1.play();//先默认播放第一个
    
    var _xml:XML ;
    var _urlReq:URLRequest = new URLRequest();
    _urlReq.url="xml文件地址";
    var _loader:URLLoader=new URLLoader(_urlReq);
    _loader.addEventListener(Event.COMPLETE,loadCompleted);
    
    var _dp:DataProvider = new DataProvider();
    var _currentIndex:uint=0;
    
    function loadCompleted(e:Event):void {
    	_xml=XML(_loader.data);
    	for each (var item in _xml.item) {
    		_dp.addItem({flv:item.@flv,source:item.@photo,url:item.@url,name:item.@name});
    	}
    
    	if (_dp.length>0) {
    		playflv(_currentIndex);
    		flv1.addEventListener(VideoEvent.COMPLETE,playCompleted);
    		flv1.addEventListener(VideoEvent.BUFFERING_STATE_ENTERED,buffered);
    		flv1.addEventListener(VideoEvent.STOPPED_STATE_ENTERED,stopEntered);
    		flv1.addEventListener(VideoEvent.PAUSED_STATE_ENTERED,pauseEntered);
    		flv1.addEventListener(VideoEvent.PLAYING_STATE_ENTERED,playingEntered);
    		flv1.addEventListener(VideoProgressEvent.PROGRESS,progressHandler);
    	}
    }
    
    lst1.dataProvider=_dp;
    lst1.addEventListener(ListEvent.ITEM_CLICK,clickBaby);
    
    //点击宝贝时,播放对应的视频
    function clickBaby(e:ListEvent) {
    	_currentIndex=e.index;
    	//trace(_currentIndex);
    	playflv(_currentIndex);
    }
    
    //播放完成后,插放下一个
    function playCompleted(e:VideoEvent) {
    	trace("播放完成:" + e);
    	playflv(_currentIndex + 1);
    }
    
    function buffered(e:VideoEvent){
    	/*trace("缓冲中..." + e);
    	lblDebug.text = "缓冲中...";	*/
    	flv1.playWhenEnoughDownloaded();
    }
    
    function stopEntered(e:VideoEvent){
    	//trace("已停止...");
    	//lblDebug.text = "已停止...";
    }
    
    function pauseEntered(e:VideoEvent){
    	//trace("已暂停...");
    //	lblDebug.text = "已暂停...";
    	pause1.visible = true;
    	
    }
    
    function playingEntered(e:VideoEvent){
    	//trace("播放中...");
    //	lblDebug.text = "播放中...";
    	pause1.visible = false;
    }
    
    function progressHandler(e:VideoProgressEvent){
    	//trace(e);
    	//flv1.playWhenEnoughDownloaded();
    	//trace("缓冲时间:" + flv1.bufferTime);
    	//trace("flv1.buffering=" + flv1.buffering + ",flv1.paused=" + flv1.paused)
    	
    	if (flv1.buffering || flv1.paused){//这个地方有点问题,会使用户的点击暂停失效(目前还没找到因“网速过慢导致进入缓冲的自动暂停” 与“用户自主点击暂停”如何用代码区分)
    		flv1.playWhenEnoughDownloaded();
    	}
    }
    
    //播放指定索引的视频
    function playflv(flvIndex:uint) {
    	//trace("flvIndex=" + flvIndex + ",_currentIndex=" + _currentIndex);
    	if (flvIndex>=_dp.length) {
    		flvIndex=0;
    	}
    	var item:Object=_dp.getItemAt(flvIndex);
    	flv1.load(item.flv);	
    	flv1.play();
    	pause1.visible = false;
    	_currentIndex=flvIndex;
    	lst1.scrollToIndex(_currentIndex);
    }
    
    stop();
    

    在线演示:

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    if、else if 、else及switch...case使用小记(C#)
    c#基础知识
    流与文本文件操作(C#)
    .NET中的异常处理机制(一)
    .NET中的异常处理机制(二)
    在引用类型变量上调用虚方法和非虚方法的区别
    各位客官!鼠标点击一个Button之后究竟发生了什么?您知道么?(C#)
    接口和抽象类的使用场景以及多类继承存在的问题(c#)
    面向对象SOLID设计原则之Open-Closed原则
    stack和stack frame
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1682909.html
Copyright © 2011-2022 走看看