应用于: Windows Phone 8 | Windows PhoneOS 7.1

你可以为winphone编写在后台播放音乐的app。这表示即使当用户点击返回或开始按钮离开你的应用界面时,你的应用依然可以继续播放音乐。本文讨论后台音乐应用的组成以及它们如何一起工作。

本文包含以下几节。

·        后台音频架构

·        后台音乐的最佳实践

后台音频架构

后台音频应用利用了后台代理作为基础。后台代理是从Windows Phone OS 7.1引入的。更多信息见Multitasking for Windows Phone.

Windows Phone上的所有媒体都是通过Zune Media队列播放的。你的后台音频应用发送命令到Zune Media队列来设置当前音轨、开始回放、暂停、快进、从头播放、等等之类。你通过调用BackgroundAudioPlayer类中的方法两做这些事情。实例对象然后与Zune Media队列通信以管理音频回放。

全局音量控制(UVC)是一个控制集,当播放音乐时或用户按下音乐控制开关时,它就出现在锁屏上。UVC也管理着Zune Media队列。因此,当开始从你的应用播放某些东西时,音频就可以通过使用UVC控制进行。UVC发送事件到你的应用中的AudioPlayerAgent ,使得你可以实现播放列表逻辑。

共有两种后台音频应用。一种是实现了一个简单的播放列表,并传一个包含了媒体文件的地址的Uri给Zune Media 队列来设置当前的Track。Uri 可以是一个本地地址也可以是一个远程地址。同时这也要求音频必须是WindowsPhone支持的类型。见Supported media codecs for Windows Phone 查看有效的音频文件类型。

另一种是使用MediaStreamSource实现一个音频流,向回放系统提供音频样点。此种流的格式可以随意,因为你自己从MediaStreamSource 实现一个派生类来处理流和音频解码。如何实现一个MediaStreamSource 超出了本文的范围。

这两种应用有很多共通点。我们将先讨论实现一个播放列表的应用,再讨论使用MediaStreamSource(MSS)实现流的一些内容。

播放列表应用

要创建一个后台音频播放列表应用,你必须实现两部分:一个提供用户界面来控制回放的应用,和一个实现了AudioPlayerAgent的派生类的assembly。

应用界面

如果你使用Visual Studio模板来创建你的应用,你的应用界面就存放于MainPage.xaml 和MainPage.xaml.cs 文件中。你的主应用使用Instance 来设置Zune Media队列的当前track、初始化回放,等等之类。

AudioPlayerAgent

你的AudioPlayerAgent 是被操作系统实例化的。用于处理用户发出的动作。动作可能通过你的应用界面发出也可能通过UVC。

你的AudioPlayerAgent 运行于后台并且调用一个BackgroundAudioPlayer的实例,BackgroundAudioPlayer又调用Zune Media 队列来实际播放音频。

当你的agent 处理完成OnUserAction(BackgroundAudioPlayer, AudioTrack, UserAction,Object)OnPlayStateChanged(BackgroundAudioPlayer, AudioTrack,PlayState)、或OnError(BackgroundAudioPlayer, AudioTrack, Exception,Boolean),就调用NotifyComplete来通知操作系统你已经完成了,然后agent就可以安全的从内存中删除。

使用Windows Phone Audio Playback Agent 模板来创建一个新的AudioPlayerAgent 工程,然后把它添加到你的解决方案中。然后还要设置引用关系。

音频流应用

要创建一个音频流应用,你必须实现与Playlist Application相同的部分。典型地,你必须创建一个带有用户界面的主应用,和一个AudioPlayerAgent。 对于一个音频流应用,你还需要实现一个从AudioStreamingAgent派生的类和一个从MediaStreamSource派生的类。你要实现的部分是下表中的绿色部分。

音频流Agent

AudioStreamingAgent 负责创建MediaStreamSource 并指定Zune Media 队列到这个MediaStreamSource 。这通过调用传给OnBeginStreaming(AudioTrack, AudioStreamer) 方法的参数AudioStreamerSetSource(MediaStreamSource) 方法来指定。

使用Windows Phone Audio Streaming Agent 模板来创建一个新的AudioStreamingAgent 工程并添加到你的解决方案。

MediaStreamSource

Zune Media Queue 调用你的MediaStreamSource 来获取音频样点。创建MediaStreamSource 超出本文讨论范围。更多信息请见MediaStreamSourcesample

后台Agent 生命期

你的AudioPlayerAgent 是被BackgroundAudioPlayer创建的,当BackgroundAudioPlayer需要处理从你的应用界面或UVC发来的UserAction 请求时就会创建它。

你的AudioStreamingAgent也是被BackgroundAudioPlayer创建的,当BackgroundAudioPlayer需要一个新的流时就创建它。当你的agent被创建后,BackgroundAudioPlayer调用AudioStreamingAgent中的OnBeginStreaming(AudioTrack, AudioStreamer) 方法。

后台代理会在调用了AbortNotifyComplete后被清理掉。

其它的后台音频类

后台音频应用使用了其它一些类来完成音频播放器体验。

BackgroundAudioPlayer

BackgroundAudioPlayer 面向Zune Media队列。在其Instance上的调用会影响设备上音频的播放。

AudioTrack

AudioTrack 代表了一个track的元数据,包括title、artist、album、和URI。如果URI被设置为null,系统就认为你把track设置为一个MediaStreamSource。此时,你可以使用Tag 属性从AudioPlayerAgentAudioStreamingAgent传递信息。

AudioStreamer

AudioStreamer 的实例被传给OnBeginStreaming(AudioTrack, AudioStreamer)。在你的OnBeginStreaming实现中,调用SetSource(MediaStreamSource) 来指定一个从MediaStreamSource派生的类,这个类提供音频样点。

[置顶] Windows Phone后台音乐详解一的更多相关文章

  1. [置顶] Isolation Forest算法实现详解

    本文算法完整实现源码已开源至本人的GitHub(如果对你有帮助,请给一个 star ),参看其中的 iforest 包下的 IForest 和 ITree 两个类: https://github.co ...

  2. [置顶] Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  3. [置顶] ANT build.xml文件详解

    Ant的优点 跨平台性.Ant是用Java语言编写的,所示具有很好的跨平台性. 操作简单.Ant是由一个内置任务和可选任务组成的. Ant运行时需要一个XML文件(构建文件). Ant通过调用targ ...

  4. [置顶] Android系统五大布局详解Layout

    我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前,视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit等 ...

  5. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  6. Redis for Windows(C#缓存)配置文件详解

    Redis for Windows(C#缓存)配置文件详解   前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...

  7. Windows WMIC命令使用详解2

    Windows WMIC命令使用详解(附实例) https://blog.csdn.net/aflyeaglenku/article/details/77878525 第一次执行WMIC命令时,Win ...

  8. Windows GTK+ 环境搭建(详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc901017ygy.html Windows GTK+ 环境搭建 最近要做界面的一些东西,但是对微软提供的类库MFC不 ...

  9. Windows驱动——读书笔记《Windows驱动开发技术详解》

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

随机推荐

  1. Qt 技巧: 解决未解析的SSL问题

    因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...

  2. ThinkPHP 3.1.2 控制器的模块和操作

    本节课大纲: 一.空模块和空操作 1.空操作 function _empty($name){ $this->show("$name 不存在 <a href='__APP__/In ...

  3. perl 处理json 数组格式

    [root@dr-mysql01 ~]# cat a1.pl use Encode; use JSON; use URI::Escape; use LWP::Simple; my $host = &q ...

  4. MFC基础,MFC自绘控件学习总结.---转

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  5. 怎么在Ubuntu Scope中获取location地址信息

    Location信息对非常多有地址进行搜索的应用来说非常重要.比方对dianping这种应用来说.我们能够通过地址来获取当前位置的一些信息.在这篇文章中,我们来介绍怎样获取Scope架构中的位置信息. ...

  6. Lucene 实例教程(二)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  7. 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论

    背景 背景是设计一个实时数据接入的模块,负责接收client的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(兴许提供HBase上的查询),或先持久化到Kafka里.方便兴许进行一些 ...

  8. 友盟iOS微信登陆没有回调的原因

    1.在友盟文档中这样说: 链接 7.4 微信登录 添加配置文件参考文档:添加微信及朋友圈,添加相关库文件,配置URL schemes及添加系统回调 注意微信登录必须先在微信开放平台申请微信登录权限 在 ...

  9. c++, 虚基派生 : 共同基类产生的二义性的解决办法

    虚基派生 //虚继承 #include <iostream> using namespace std; #include <string> //---------------- ...

  10. chapter3习题

    // 2013年11月4日21:47:21 # include <stdio.h> # include <math.h> int main() { int n; double ...