Posts Tagged ‘Windows Phone’
由于一些很[哔——]的原因,微软在WinRT中移除了获取操作系统版本号的API,再也没有Environment.OSVersion.Version这种东西用了。但是这挡不住程序员们……目前据我所知有两种黑科技可以获取操作系统版本号:
在进行Windows Phone 8.1 Runtime应用开发中需要注意的地方第一话:
在Silverlight中我们可以使用ImageTools库的AnimatedImage控件来播放GIF图片,但是AnimatedImage目前还不支持WinRT应用,所以我实现了一个简单的控件来播放本地GIF文件。原理很蛋疼,首先用各种工具把GIF拆成单独的PNG文件,然后放到同一个文件夹下面,加载到内存中后用Timer来控制循环显示。
在Silverlight中我们可以通过设置HttpWebRequest.AllowReadStreamBuffering为false,或者使用HttpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)来实现在回调函数中不必等到Stream完全下载完成后才能读取数据,以便计算下载速度或进行其他处理。然而在WPRT应用中(WinRT未受影响)这两种方式都失去了效果,见示例:
微软搞出的这个Universal应用本意是不错的,但是只是方便了WinRT应用到WPRT应用的移植,从WP8 Silverlight应用移植的话有很多坑,而且MSDN上面又没有一个完整详尽的说明,大部分新的实现方法都需要开发者自行摸索。所以我打算写这个系列文章来记录一些我的发现和经验,以帮助后来者少走一些弯路,节省一些时间。
实现GetSampleAsync()
接下来需要实现MediaStreamSource.GetSampleAsync()。当系统解码器需要新的视频或音频sample的时候会调用这个函数,这个函数需要根据MediaStreamType返回相应的下一个sample。至于是预加载所有的sample还是用on demand的方式获取下一个sample都可以,前者可能会在播放视频的头几秒有所卡顿,后者可能会导致seek的过程略长。
众所周知,Windows Phone SDK自带的MediaElement不支持FLV容器。但是根据MSDN所言[1],实际上Windows Phone在硬件上支持AAC音频和H264视频的播放。恰巧大部分网络FLV视频都是AAC+H264编码的,于是理论上我们就可以通过实现MediaStreamSource来让MediaElement认识和播放FLV视频。我在开发哔哩哔哩客户端的时候就采用了这个技术。
本文同时适用于Windows Phone 7/7.1和Windows Phone 8。在本文之前,你不会在互联网上获得任何关于如何在Windows Phone上使用MediaStreamSource播放FLV视频的完整关键代码。