Fdream's Blog
专注于WEB前端开发
Powered by Google
1 2 3 4 5 6

Silverlight对视频流HTTP请求头的要求很BT,折腾了一天才发现这个问题。

Silverlight播放视频时,视频源可以是其他域的,即是可以跨域的。读取其他数据是不可以跨域的,比如XML数据等。

Silverlight是集成了Windows Media Player的解码器的,在没有安装Windows Media Player的情况下,只要安装了Silverlight就可以在Silverlight中播放WMV、ASF、MP3等格式的视频和音频文件。Silverlight 1.1 Alpha版安装包总共不到5M,是WPF的精简版,因此解码器精简的程度也可见一斑。

自己弄了个HTTP服务,HTTP响应头并不规范,但这些视频流能在Windows Media Player或者WPF下播放,却不能在Silverlight下播放。但是如果是放在IIS下则能正常播放,于是开始观察HTTP请求,看看二者有什么不一样。然后按照IIS下的HTTP请求头重写了HTTP服务,使其HTTP响应头与IIS下的一样,结果发现果然能够正常播放了!再经仔细测试,发现HTTP响应头中只要含有协议、状态和Content-Length就可以了。

由于Silverlight有DownloadProgressChanged和BufferingProgressChanged等事件,不知是不是因为没有Content-Length导致Silverlight无法判断当前视频流的下载状况而不能正常播放。

当浏览器里只有一个Silverlight,没有其他内容时,我们会希望它能够自适应浏览器大小(屏幕大小),flash在解决这个问题时很为难,而用Silverlight则可以轻松解决自适应大小的问题。

首先,在你的HTML页面中,修改这一行CSS代码:

引用内容:

.silverlightHost { width: 640px; height: 480px; }

改为:

引用内容:

.silverlightHost { width: 100%; height: 100%; }

那么,你现在的Silverlight就是自适应大小的了,但是还有很多问题要解决的,比如你的背景图片大小也得跟着改变了,还有元件布局也得跟着变……因为现在Silverlight还不能像WPF那样自动布局,只能指定绝对位置。不过还好,当Silverlight大小发生变化的时候存在BrowserHost.Resize这样一个事件,我们为这个事件写一个EventHandler就好了,而当前Silverlight的尺寸大小则可以通过BrowserHost.ActualWidth和BrowserHost.ActualHeight来获取,那么手动布局也就还算方便了,不过要是能使用相对位置自动布局就更方便了,不知道Silverlight 1.1以后是不是会增加这个功能。

在网页中浏览视频,使用全屏播放往往能够给用户更好的体验,Silverlight对全屏支持很好,简单几行代码就能搞定全屏的问题。

BrowserHost对象有个属性就是IsFullScreen,设置其为True时就可以实现全屏,设置为False就可以退出全屏,默认情况下按ESC时就可以退出全屏。后来发现,按Alt+Tab也可以...

Beta版终究是Beta版
20 未知 2007-8
Fdream 发表于 Silverlight, 已被阅读 20241 次评论 0 条
关键词:Silverlight

先是Silverlight升级不能正常使用,后来一冲动把Visual Studio也升级到了2008 Beta 2,然后把SilverlightTools也换成了对应的Alpha版本,再装了个最新的Silverlight 1.1,自以为没有什么问题了,建了个Silverlight项目,却发现找不到引用,摸索了半天,最后在网上搜到说要更新SivlerlightTools,微软不久前才发布了一个补丁,于是呼哧呼哧地跑过去下那个补丁,发现它的发布时间是8月10日,而我下载这个东西的日子恰好是8月9日!真是fz(发指)啊!

还好,网速比较快,没用多久,SilverlightTools下载下来了,按照要求,先装Silverlight 1.1,再装Silverlight Tools,好吧,总算装好了,引用也可以找到了,只是TNND写代码的时候没有代码提示和自动完成了……软件不可以fz到这种程度!

也许是我系统的问题,我们到测试服务器上也装一个吧,看会不会有代码提示和自动完成。还好安装的过程不需要人工干预,今天来看,已经装好了,嗯,还有代码提示,那好吧,我用远程控制……

打开星期五建的网站项目,编译,发现找不到引用System.Core了,wk~!我服了,我用VS 2005做Web行了吧?

改天我还是要把这个Beta给装上!我还不信这个邪了!

奇怪,Frame类有个Opacity属性,设置其值为0.2一点反应都没有,又貌似没有其他属性可以设置透明度,难道是bug?如果是这样,那么Frame肯定是不能实现有透明度变化的动画了……

用Google搜了一下,找到这样两个帖子:

引用内容:

The animation worked when applied on other elements in a test project I made, including a Frame element with just a solid red background. I think it's just a limitation of the Frame element when rendering HTML. It uses the WebBrowser control which is just a wrapper around the MSHTML ActiveX control, I believe.

Hmm, it might be fun to write a Web browser in WPF...

引用内容:

Frame element is wrapping window with handle, thus it can not have animated opacity. However, you can create VisualBrush over Frame and Animate it

看来对HTML页面是真的没办法了,自己另外想办法实现咯:(

在设置了一个对象的Opacity动画之后,再为该对象设置一个Opacity值将会无效,奇怪的是也没有异常抛出,而且在该语句之后的语句也都不执行了。例如:

引用内容:

DoubleAnimation myDA = new DoubleAnimation(0.8, 0.0, new Duration(TimeSpan.FromMilliseconds(800)));

Storyboard.SetTargetName(myDA, "myObj");

Storyboard.SetTargetProperty(myDA, new PropertyPath(Canvas.OpacityProperty));

Storyboard mySB = new Storyboard();

mySB.Children.Add(myDA);

mySB.Begin(myObj);

若在此后再设置该对象的Opacity值将会无效,例如:

引用内容:

myObj.Opacity = 1.0;

且该句之后的语句都不会执行。想想可能是因为动画把该值给锁定了,于是尝试在动画完成之后remove掉该动画,于是把代码改成如下的样子...

写了两个多星期的WPF Application,今天需要在界面上增加点东西,想到用Blend 2来编辑XAML文件(画图还是比写代码方便很多),但是只有在Silverlight项目中才能方便地用Blend 2打开XAML文件,于是打开了一个最开始接触Silverlight时的几个例子,习惯性地Ctrl+F5,浏览器却给了我一个很大的惊奇:弹出了一个错误提示框:

引用内容:

The WPF/E installed on your system is no longer valid. Please go to

“http://go.microsoft.com/fwlink/?LinkID=81210&clcid=0x409e” for the latest version.

怏怏地跑到Silverlight官方网站去看看最新版本,找了半天还是只有Silverlight 1.1 Alpha-_-。好吧,我就当这个是最新版本了,重新下载了一遍,安装,按要求重启,打开项目,再编译运行,这次更是诡异了,浏览器一片空白,状态栏提示有JS错误。看看页面源代码,发现document.getElementById后的参数和div的id名称不一致了,我没有改过代码的呀!再开两个项目,发现还是这样,诡异的Orcas(Visual Studio 2008 Beta)……

不管了,继续编译,没有报错了,但是浏览器这次很直接告诉我我还没有装Silverlight……我ft!这么久白忙活了……

MS老大,alpha版也不是这么...

WPF中的定时器类
6 多云 2007-8
Fdream 发表于 Silverlight, 已被阅读 18067 次评论 5 条
关键词:WPF

刚开始接触WPF不久,也是第一次尝试开始写C#,写定时器的时候以为C#中System.Timer中的Timer类,结果发现老是抛出个很奇怪的异常:

引用内容:

The calling thread cannot access this object because a different thread owns it.

后来才发现,其实WPF是有自己的定时器类的,那就是System.Windows.Threading中的Timer类,使用起来也很简单:

引用内容:

//构造一个DispatcherTimer类实例

DispatcherTimer dTimer = new System.Windows.Threading.DispatcherTimer();

//设置事件处理函数

dTimer.Tick += new EventHandler(dTimer_Tick);

//定时器时间间隔1s

dTimer.Interval = new TimeSpan(0,0,1);

//启动定时器

dTimer.Start();

在上例中,也可以使用dTimer.IsEnabled = true;来启动定时器。

1 2 3 4 5 6
Copyright © 2005-2008,Fdream All Rights Reserved
Processed in 0.2187472 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号