实际上这篇文章也可以叫做如何在windows phone8中支持除官方支持格式之外的视频格式的播放,这里挑选一种格式,即FLV协议格式做一个导引,这也是我遇到的问题,即我怎么样才能够在wp8上播放flv格式。
1, 是否默认播放器支持?
默认官方支持的格式比较有限,目前可知为3gp, .3g2, .mp4, .wmv (Windows Media Video 9), .avi (MP4 ASP 及 MP3),当然上面格式有些我也不理解,但是重点的是,没有flv,那如何使得播放器支持非官方的格式呢?在MediaElement的类定义中,我们发现了public void SetSource(MediaStreamSource mediaStreamSource);
2, 如何使用public void SetSource(MediaStreamSource mediaStreamSource)?
首先我们回到视频播放的本质,视频播放从流程上可以分为下面几个流程,a,读取视频流(即读取到一段经过格式编码的数据流,当然如果你不知道内部格式,对你来讲就是乱码);b,分离视频帧和音频帧(视频帧和音频帧是带有格式的一段数据);c,解码视频帧和音频帧(将视频帧和音频帧数据解码成一幅图像或者一段数据音轨);d,硬件渲染+音频通道输出。
如果你觉得我们接下要做这么多事情,才能播放flv,那就错了,系统播放器控件,c+d已经默认支持,目前主流的视频格式H264协议,和音频格式AAC从系统层面已经支持了,所以我们要做的事情变得和简单,就是a+b两个流程。
3, 如何读取视频流?
在wp8中网络流的读取可以使用HttpWebRequest。
4, 如何分离视频帧+音频帧?
首先我们得先看下WP8中队帧的定义,MediaStreamSample
Attributes//帧描述信息,内部是字典序列,比如描述帧类型,采样率等
Stream//帧内容,即实际的数据
Offset//和Stream配对,即数据从Offset开始读取
Count//从Offset读取Count
Timestamp//帧对应的时间戳,即和开始播放时的偏移时间值,以Tick计量。
知道这些信息那我们接下去的工作就是把FLV数据流变成一个音频序列+一个视频序列,这又得 需要知道FLV格式的定义。
5, FLV格式到底是一个什么样的格式?
我也是从上面了解到的。
简单点说FLV对视频和音频格式都采用了一个结构叫Tag,分为Script Tag,音频Tag和视频Tag,所以FLV格式的解析实际上就是把数据流分解成两个Tag序列,即音频Tag序列和视频Tag序列,由于视频播放时按时间流前进的,我们就假定我们的结构为FlvTag,而序列分别为Queue<FlvTag> _audioSamples; Queue<FlvTag> _videoSamples;
6, 如何支持在线的播放?
在线播放方式和本地播放不一样的地方在于,本地播放,所有的数据均已经确定,即整个Flv的数据在播放之前是可知的,而在线播放则是你在播放的开始,一般不知道结尾的数据是什么。所以与本地播放可以初始化时构建Queue<FlvTag>不同的是,在线播放要一边下载,一边增加Queue<FlvTag>中的Tag,当然也不能无限增加,考虑到资源的使用,我们可以假定增加到500个就暂停。然后视频播放过程中会逐步消灭Queue<FlvTag>中的Tag来使得播放持续进行。这就用到了常用的生产者和消费者模式了。
查看示例,谢谢各位,以上就是在WP8上实现FLV视频格式播放的思路,如果你现在遇到或者未来遇到,希望能帮忙,当然如果你想把它们迁移到Windows8.1上(Windows8上面不可用,比较( ╯□╰ ))也是可以用的。
这里非常感谢这篇文章,这篇文章描述的是在Silverlight中实现对FLV的支持,我这篇算是对上面的一个补充吧(1,迁移到wp8上,2,实现了在线播放)。