Flex实例【Shangle.net】解析【视频篇】
??????? 还有两次课课程就结束了。前面关于评论的讨论基本上已经完结了,剩下的就是一些自我完善,有兴趣的同学可以考虑如何实现多篇日记的功能了,这里就暂时不再解析了,那么剩下的时间干嘛呢?明天的课是准备进行作业答辩的,所以也属于收尾的内容,如果有时间的话就把这个视频开个头,没时间的话就放到下周了。 ??????? 在shangle的实例中有个Module是关于视频的,这里就对这个视频的功能模块做个简单的解析。首先例子中的视频是采用的播放指定文件的方式来进行的,这个我就简单讲下这个过程: ??????? 1、需要用到的控件主要就是一个文件列表List,一个视频播放VideoDisplay,其他的一些分页相关按钮就不特意提了,自己看代码吧。 ??????? 2、在初始化时加载文件列表(init函数),这里不是自动去读指定文件夹并返回列表,而是和前面评论一样用了ArrayCollection写死的,所以大家可以自由发挥,将这个列表加载过程写成一个数据库或者XML文件的读取并自动加载的过程。 ??????? 3、加载完成后List添加了一个playVideo事件监听(在net.shangle.event包中),主要就是点击List后的播放,然后设置VideoDisplay的source为List的当前点击项。因为设置过autoPlay所以直接播放。 ??????? 4、返回按钮清空VideoDisplay的source属性 ??????? 这个是原来的功能解析,说的挺简单的,大家自己看看代码应该不难。 ??????? 下面我们进行些升级,这个升级的辅助环境需要先配置好,这里需要一个ADOBE的Flash Media Live Encoder和一个ADOBE的Flash Media Server。前一个用来编码推送,推送到后一个搭建的流媒体服务器中。然后在外部利用RTMP协议来获取推送内容。这里需要额外的三个对象:NetConnection、NetStream和Video对象。NetConnection对象用来连接到RTMP指定资源,NetStream对象用来获取连接成功后的数据流,Video对象用来加载NetStream数据,最后在VideoDisplay控件中append前面的Video对象来播放视频。这里粗糙的实现下这个功能代码: videoInfoArr = new ArrayCollection([{videoID:1,catName:"默认",addTime:"2011年3月26日",title:"旅程的终点",content:"湿父,不给力啊",fileName:"201102221614.jpg",source:"upLoad/video/1.flv"},{videoID:2,title:"VS2010宣传片E1",content:"做你的下一行Code",fileName:"201102221636.jpg",source:"upLoad/video/2.flv"},{videoID:3,title:"十胜石",content:"为爱至死不渝",fileName:"201102221702.jpg",source:"upLoad/video/3.flv"},{videoID:4,title:"在线监控",addTime:"2014年5月29日",content:"摄像头监控",fileName:"video.jpg",source:"online"}]);??????? 这里比原来的代码就多了最后videoID为4的一个条目,最后的source随便设置,当然也可以这里设定,后面获取,我这里采取了这里随意,后面指定的方式。 this.currentState = "play"; if(event.videoID<4) videoDisplay.source = searchVideoByID(event.videoID); else { connection = new NetConnection(); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler); connection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); connection.connect("rtmp://172.16.1.2:1935/live"); //本机IP }??????? 这里加了个IF判断,主要为了区分开这个videoID为4的,也就是在线流媒体的视频。或者我们可以自定义添加一个属性用来区分各种类型的视频,如文件、VOD、LIVE等。如果是最后一条也就是流媒体视频,则进行connection连接。这里添加两个监听事件,一个是安全错误事件,一个是网络状态事件,安全错误事件代码就是显示错误信息: private function securityErrorHandler(event:SecurityErrorEvent):void { Alert.show("securityErrorHandler: " + event); }??????? 主要是后面这个状态判断事件,查询后获知事件返回值列表如下:
??????? 所以我这里就判断下返回的CODE里有没有“Success”(当然这个判断很粗糙,自己完善下),如果Success则进行下一步的数据获取和加载: private function netStatusHandler(event:NetStatusEvent):void{ if(event.info.code.toString().indexOf("Success")>0) { video = new Video(); video.width = 240; video.height = 320; stream = new NetStream(connection); video.attachNetStream(stream); stream.play("audioStream"); videoDisplay.addChild(video); } }?????? 测试后发现返回按钮无效了,这个应该是因为原来的退出是用清空videoDisplay 的source属性来实现的,而这里采用了网络流,所以修改返回事件: private function returnToListHandler() : void { if(connection!=null && connection.connected) { connection.close(); stream.close(); stream.dispose(); video.clear(); videoDisplay.removeChild(video); playAndStop.selected = false; this.currentState = 'list'; } else { videoDisplay.stop(); videoDisplay.source = null; playAndStop.selected = false; this.currentState = 'list'; } } ??????? 这里的判断主要是判断当前的连接是否有实例存在,并且该实例是连接着的,如果是就清空所有资源,然后返回list状态;否则的话就是普通文件视频,直接清空videoDisplay,并返回列表。以前用过windows的media server,功能类似,甚至连界面也类似(我能说ADOBE借鉴微软吗?),好处就是视频格式可以直接输出flv,因为现在的FLV格式比window下的WMV更为流行,所以我们就当这个好吧。 ??????? 到这里本学期课程收工,若有后续,纯属杂谈……并衷心祝愿大家学有所得,再简单再少的得也是一种成就…… ???????(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |