• 前言

MediaElement是Windows Phone中播放本地或者网络视频文件和音乐文件的常用控件,支持的格式可以从这里看。通过Play,Pause,Stop,Position方法或属性可以方便的控制文件的播放暂停或快进。MediaElement包含6种状态,分别是buffering、opening、playing、closed、stopped、pause。可以通过注册MediaElement的CurrentStateChanged事件来获取CurrentState来对UI做出不同的响应。需要注意的是,MediaElement在某些特定状态下对于API的调用不会立即反应。比如,当MediaElement的状态在buffering的时候,如果调用Play事件,MediaElement要等到缓冲结束后才能执行Play操作。在这种场景下就需要我们针对特定的CurrentState做出UI上的交互来填补缓冲时间带来的程序无响应问题。下面就来给出一个XAML的例子。

<MediaElement
x:Name="media"
Source="xbox.wmv"
CurrentStateChanged="media_state_changed"
Width="300" Height="300"/>

Source是控制播放文件路径的属性,上面给出一个播放本地文件的例子,也可以指定网络上的文件路径。当更改或设置Source的值后,MediaElement的状态会进入opening,如果设置Source为null,则会进入closed状态。今天我们重点要说的是,如何使用MediaElement播放网络的视频流,即直播的场景。

  • MediaStreamSource

    MediaStreamSource是用于将视频流直接送入MediaElement的媒体管道中的类,也可以作为用于MediaElement不支持的视频格式的中转站。通过MediaElement的SetSource方法指定,SetSource方法也可以用来播放本地的视频流。为了完成网络视频流的转换等处理,通常我们自定义一个继承MediaStreamSoure的类,再实现一些必要的方法。比如,OpenMediaAsync、GetSampleAsync、SeekAsync等。下面我们就来看看一个简单的自定义类实现的步骤。

protected override void OpenMediaAsync()
{
//描述媒体示例
_mediaSampleAttributes[MediaSampleAttributeKeys.FrameHeight] = _height.ToString();
_mediaSampleAttributes[MediaSampleAttributeKeys.FrameWidth] = _width.ToString();
//描述媒体流
_mediaStreamAttributes[MediaStreamAttributeKeys.Height] = _height.ToString();
_mediaStreamAttributes[MediaStreamAttributeKeys.Width] = _width.ToString();
_mediaStreamAttributes[MediaStreamAttributeKeys.CodecPrivateData] ="";
_mediaStreamAttributes[MediaStreamAttributeKeys.VideoFourCC] ="H264";
//详尽描述媒体流
_mediaStreamDescriptions.Add(new MediaStreamDescription(MediaStreamType.Video, _mediaStreamAttributes));
//描述媒体源
Dictionary<MediaSourceAttributesKeys, string> mediaSourceAttributes =new Dictionary<MediaSourceAttributesKeys, string>();
mediaSourceAttributes[MediaSourceAttributesKeys.CanSeek] ="false";
mediaSourceAttributes[MediaSourceAttributesKeys.Duration] = _duration.ToString(CultureInfo.InvariantCulture);
ReportOpenMediaCompleted(mediaSourceAttributes, _mediaStreamDescriptions);
}

当MediaElement的Source被指定后将进入opening状体,这时将调用OpenMediaAsync方法。这个方法用来描述将要播放的视频流的流体,高宽,格式,长短等信息。VideoFourCC属性代表要播放的流的视频格式,它是由一个四个字符的字符串指定,比如:"H264","MP43","YV12"等。通过调用ReportOpenMediaCompleted方法告知MediaElement视频流已经打开可以继续进行下面的操作。

protected override void GetSampleAsync(MediaStreamType mediaStreamType)
{
var msd =new MediaStreamDescription(MediaStreamType.Video, _mediaStreamAttributes);
//详尽描述媒体示例
var mediaSample =new MediaStreamSample(
msd,
_mediaStream,
_offect,
_count,
_timeStamp,
_mediaSampleAttributes);
ReportGetSampleCompleted(mediaSample);
}

在MediaStreamSource打开之后,将调用GetSampleAsync方法。上面的代码通过ReportGetSampleCompleted方法将组织好的视频流装入到媒体管道中。如果这个时候视频流由于网络原因或者需要转码等操作还没有准备好,那么我们可以调用ReportGetSampleProgress方法来通知MediaElement缓冲的进度,这时MediaElement将进入到buffering状态,如果当前的CurrrentState是Playing,那么视频播放将暂停播放进入到buffering状态。GetSampleAsync方法会被调用多次,直到再次受到来自ReportGetSampleCompleted的视频流才继续播放。

protected override void SeekAsync(long seekToTime)
{
ReportSeekCompleted(seekToTime);
}

在播放网络媒体视频流的过程中常常需要进度条的功能。如果将MediaSourceAttributesKeys.CanSeek的属性值设成false,那么SeekAsync的参数seekToTime将是0。如果你要实现进度条的功能,那么必须要确保seekToTime的值在视频的duration之内。如果改触发了进度,那么我们就需要重新组织视频流,直到重新调用ReportGetSampleCompleted方法,MediaElement才会继续播放。

当视频播放接受后我们需要插入一个空的MediaStreamSample来告知MediaElement视频播放结束,这时CurrentState将进入到closed状态。

  • 总结

    以上我们简单的介绍了在Windows Phone中播放视频流的方法,播放音频流的方法也是如此,需要修改MediaStreamType属性的值。流的来源可以通过Socket或者Http。格式转换是一个在视频播放中很复杂的问题,这里就不进行介绍了,有需要的同学可以留言讨论或者自行研究。

Windows Phone播放视频流的更多相关文章

  1. RTSP Windows专用播放器EasyPlayer : 稳定、兼容、高效、超低延时

    EasyPlayer RTSP Windows专用播放器 EasyPlayer RTSP Windows 播放器是由EasyDarwin团队开发和维护的一个完善的RTSP流媒体播放器项目,视频编码支持 ...

  2. EasyPlayer windows RTSP播放器OCX插件使用说明

    鉴于大家对于EasyPlayer插件的使用还不太熟悉,特此写一篇插件的使用文档,供大家参考:EasyPlayer插件有两种,一种是基于IE的ActiveX控件,一种是基于FireFox(也支持多浏览器 ...

  3. html5 video标签播放视频流

    从文件服务器读取音视频文件,以流的方式传给前台,并能够播放视频. 做了一个demo,用html5的video,audio标签实现. 后台实现代码: @GetMapping(value = " ...

  4. windows下Qt播放flash

    Qt  版本:5.1.0 32bit 代码部分,参考1即可.配置发行时,需要将NPSWF32放在项目的plugins\目录中. 否则,可能找不到,导致无法运行. QWebSettings *setti ...

  5. Windows下如何禁止优盘自动播放、自动运行

     造冰箱的大熊猫@cnblogs 2019/1/28 为了防范层出不穷的病毒和木马,如何禁止插入优盘后Windows自动播放优盘或运行优盘程序? 运行环境:Windows 7 1)点击Windows开 ...

  6. EasyNVR互联网监控直播分发出RTMP、HLS、HTTP-FLV视频流说明介绍

    背景需求 需求比视频流协议更重要,你想要什么,什么可以满足你的需求,这个很大程度上是需求在前,选择使用什么视频流是比较靠后的. 目前Easy系列互联网直播服务将全线支持HLS.RTMP.HTP-FLV ...

  7. Windows Server 2012 为什么没有“磁盘清理”选项了?

    用习惯了客户端版的Windows,对于磁盘清理想必大家都不会陌生,他具有安全.快捷.准确.集中化的删除系统中的临时文件.管理系统还原卷影副本.添加删除程序的快捷入口等便捷功能,而在Server版的Wi ...

  8. Windows server 2008系统基本优化

    前几天用上了Windows server 2008刚开始还真不习惯,毕竟是做服务器用的系统和娱乐操作系统有很大区别.先总结几点,以后慢慢更新 安装Win2008驱动: 大部分支持vista系统的驱动都 ...

  9. delphi 插入 HTML代码 播放器

    Delphi在Webbrowser中插入 HTML/java script代码 使用方法将下面的代码赋值到1个记事本里保存,然后保存为xxx.htm就可以看到效果使用PasteHtml实现功能 的事件 ...

随机推荐

  1. socket学习笔记——获取域名与IP(linux)

    gethostbyname.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #includ ...

  2. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  3. 仅显示INPUT下边框

    最近在倒腾前端的页面,在某次的需求中我想要这样的一个效果——仅显示INPUT输入框的下边框,和我想象的编写方式不一致,每个标签都有其对应的默认样式,不同的浏览器也有其不同的渲染方式,当然这些知识现在我 ...

  4. 洛谷P1472 奶牛家谱 Cow Pedigrees

    P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备 ...

  5. JS跳转到顶部的方法

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>J ...

  6. 使用SSL确保通信中的数据安全

    #region Server /// <summary> /// 用于保存非对称加密(数字证书)的公钥 /// </summary> private string public ...

  7. 【.NET】MD5的用法(对文件、字符串)

    using System;using System.IO;using System.Security.Cryptography;using System.Text;namespace ConsoleA ...

  8. solr5.5教程-solrconfig.xml,加载schema.xml

    布署完成后,接下来要更深入的研究solr的原理和使用. 首先进入testcore这个文件夹下面,发现这个core的conf里并没有schema.xml.那么数据格式是在哪里定义的呢? 打开 solr_ ...

  9. C++三大库boost、loki、stlport

    转: STL是一个标准,各商家根据这个标准开发了各自的STL版本.而在这形形色色的STL版本中,SGI STL无疑是最引人瞩目的一个.这当然是因为这个STL产品系出名门,其设计和编写者名单中,Alex ...

  10. Windows 10 LNK File分析

    前情提要:警方接获线报,黑道份子阿强涉及制造与贩卖毒品,警方在其住处扣得笔记本电脑及数个U盘,送往实验室进行取证分析. 取证人员对证物进行证物镜像制作,并进行证物处理(Evidence Process ...