使用Silverlight,制作简单播放器的一点点心得。

首先介绍什么是Silverlight(网上copy的,只知道是和flash差不多的东西):
Silverlight是一个跨浏览器的、跨平台的插件,为Web带来下一代媒体体验和丰富的交互式应用程序体验。
做为微软出品的一个浏览器增强模块,它使得浏览器可以在HTML中渲染丰富的内容。它兼容于IE6和IE7,以及Firefox 1.5.0.8+和2.0+。
Silverlight使用WMV格式,支持从低分辨率的移动媒体到全屏HD视频,并支持VC-1编码。
Silverlight基于.NET Framework,更方便程序员进行开发,提供高速媒体编码、硬件加速、支持Windows Server “Longhorn”等特性。
Silverlight的开发代号WPF/E全称为Windows Presentation Foundation Everywhere,是微软新Windows图形子系统“Windows Presentation Foundation”(代号Avalon)的一个子集。WPF/E基于跨浏览器网络技术,依赖XAML语言和JavaScript脚本创建页面,与 Flash一样作为浏览器插件工作,同样能显示矢量图形、动画和视频,可以运行在多种操作系统甚至移动设备上。
好了切入正题:
我用Silverlight也只是做个类似Mediaplay一样的简单播放器而已,只是用到了它的一小部分功能而已。
前期,摸索做还比较顺利。下面只说几个被卡的地方:
1.Silverlight做的东西和网页有什么关系。
这 是开始的时候的疑惑。因为生成一个Silverlight项目,在解决方案下面有2个子项目,一个是Silverlight设计项目,一个是web项目。 以为WEB子项目里面的Defult.aspx里面什么都没有,而且运行起来也和Silverlight没关系。不过还好,Web项目里面还有 个.aspx文件,里面有一句:<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/SilverlightApplication3.xap" MinimumVersion="2.0.31005.0" Width="100%" Height="100%" />就是这个,和Silverlight联系起来了。
2.全屏后的恢复的时候,播放窗口恢复不了。
最后解决是,全屏后恢复,需要添加:
Application.Current.Host.Content.FullScreenChanged += new EventHandler(fullScreenChange); // 全屏或者恢复的时候触发
事件,其中fullScreenChange是函数,在里面需要手动调整播放窗口的大小。之前,一直想,是不是要在ESC按键事件里面写。结果查资料发现加个事件很容易搞定。
3.全屏后按钮还停留在画面上,而不是自动隐藏起来。
按 照一贯经验,应该有个A.Visible = false or A.Visible=true 的东西。可是,怎么搞都没这个东西,只有:A.Visibility = Visibility.什么个东西。NND,英文不好,看属性没看明白,以为那些按钮是做到web页上去的,所以准备修改,但是太麻烦了。需要移植很多东 西,所以就慢慢摸索,结果发现:play.Visibility = Visibility.Collapsed; 可以隐藏,play.Visibility = Visibility.Visible;可以显示。总算全屏有全屏的样子了。
4.于拉动进度滑块来调整播放进度的问题。
这 是最后解决的,直到第一版本的Demo出来,都没解决这个问题。因为我用时间函数,每500毫秒会修改一次滑块的位置,从而会触发滑块的 Value_Changed事件,而拉动滑块也会修改其Value,从而也会触发Value_Changed事件。两者都会触发 Value_Changed事件,播放的时候会出现跳跃播放的情况,显然是不行的。查资料,说可以通过鼠标的 MouseLeftButtonDown,MouseMove,MouseLeftButtonUp 3个连续事件来完成一次鼠标拉动的动作,看起来虽然麻烦一点,但是也有道理,就尝试着写,可是开始就遇到麻烦了,滑块控件Slider根本就不进 MouseLeftButtonDown事件里面,我之前以为层的关系,或者什么原因,因为点上面的滑块确确实实是能点上的。最后查资料才知道,根本就触 发不了这个事件(鸟微软,触发不了的事件,也能添加,强烈鄙视一把)。一下子晕了,摸索再三,决定自己写个滑块控件,继承Slider,可是不行啊,现在 是触发不了啊,即使重写里面的鼠标事件也没用,看网上有的是自己绘制滑块来做的,我靠,那多复杂,自己画线,写事件。觉得应该不是这样。我就想,在时间函 数里什么时候触发的Value_Changed事件呢?因为如果避开时间函数触发应该就行了(也想过为什么跳着播放,就因为那500毫秒)。而手拉动的时 候把时间_timeclock暂停了。所以就要知道时间函数里什么时候触发的,分析,尝试,结果是:执行playSlider.Value = (fNow / fAll)*100; 修改值的时候调用了Value_Changed事件的。所以在之前,如果设置一个信号量,根据这个信号量不执行Value_Changed事件的内容就可 以了。尝试了一下,果然可以。至此,搞定。
5.Demo放到服务器上,其他人打开,提示要安装Silverlight 2.0,这是正常的,没这个插件是看不了的。可下下来之后,打开还是提示要安装该插件。晕了,怎么会这样呢。幸好有个同事前段时间玩过 Silverlight,他传了个版本在服务器上,其他人安装一次就行了。而我传的,却只有我能打开,所以怀疑是版本问题,结果卸载原本安装好的SDK, 换了同事了,移植了一下版本,放上去,终于解决。(鸟微软,再次鄙视,居然不向下兼容,或者什么鸟原因也不知道,我觉得我用的就是2.0版本啊,见鬼。最 可惜的是我装的版本,工具多一些,而且是英文版本的!)。

具体就前面一些。其实看起来也没什么,只是网上资料比较少,而且耽误了我好多时间,中间还重做了次系统(第一天跑好好的,第二天来就跑不起来了,鸟微软, 第三次鄙视)。所以就写点东西。开发SDK版本最好用最新的。而且要多尝试摸索,一个简单的功能,不可能要你用复杂的方法去解决。

做的Demo比较简单,也比较丑,只是一些基本功能而已。

地址:
(功能:播放,暂停,停止,拉动到想看的位置【因为要下载下来,有时候拉动可能会卡住】,调节声音大小,调节声道,可以静音,可以全屏,可以看到总播放时间和当前播放时间)【还有很多功能没做进去。很强大】

你可能感兴趣的:(应用服务器,windows,浏览器,silverlight,WPF)