与众不同windows phone (15) Media(媒体)之后台播放音频

介绍

与众不同 windows phone 7.5 (sdk 7.1) 之媒体

通过 AudioPlayerAgent 实现在后台播放音频

示例

演示如何通过后台代理的方式来实现音频在后台的播放

1、后台代理

MyAudioPlayerAgent/AudioPlayer.cs

/*
 * 本例演示如何播放后台音频(以 AudioPlayerAgent 为例,另 AudioStreamingAgent 用于流式播放音频)
 * 建议使用 AudioPlaybackAgent 类型的模板创建此项目
 *
 * BackgroundAgent - 后台代理类,抽象类,它是 ScheduledTaskAgent、AudioPlayerAgent 和 AudioStreamingAgent 的基类
 *     NotifyComplete() - 用于通知系统,代理已经完成了当前的任务,调用此方法后,系统才会去准备执行下一次任务
 *     Abort() - 用于通知系统,放弃此次和以后的任务
 *     OnCancel() - 后台代理被取消时所执行的方法(由系统调用,比如后台代理转到休眠状态或终止状态前会调用此方法)
 *
 * AudioPlayerAgent - 后台播放音频的代理类
 *     OnError() - 当播放中出现错误时,系统会调用此方法
 *     OnPlayStateChanged() - 当播放状态发生改变时,系统会调用此方法(错误状态除外)
 *     OnUserAction() - 当程序改变播放行为时,系统会调用此方法
 *
 * PlayState - Microsoft.Phone.BackgroundAudio.PlayState 枚举
 *     Unknown, Stopped, Paused, Playing, BufferingStarted, BufferingStopped, TrackReady, TrackEnded, Rewinding, FastForwarding, Shutdown, Error
 *
 * UserAction - Microsoft.Phone.BackgroundAudio.UserAction 枚举
 *     Stop, Pause, Play, SkipNext, SkipPrevious, FastForward, Rewind, Seek
 *
 * AudioTrack - 音频对象
 *     Source - 音频的地址,远程地址或独立存储地址均可
 *     Title - 音频名称
 *     Duration - 音频时长
 *     Album - 专辑名称
 *     AlbumArt - 专辑封面的 Uri 地址,远程地址或独立存储地址均可,如果使用独立存储地址则其目录必须是 Shared/Media
 *     Artist - 艺术家
 *     PlayerControls - 锁屏等状态下的播放器控件显示(Microsoft.Phone.BackgroundAudio.EnabledPlayerControls 枚举)
 *         None = 0, SkipNext = 1, SkipPrevious = 2, FastForward = 4, Rewind = 8, Pause = 16, All = 31
 *     Tag - 任意内容,即为 AudioTrack 绑定一个上下文数据
 *     BeginEdit() - 将 AudioTrack 设置为编辑状态(如果需要修改 AudioTrack 的属性则需要将 AudioTrack 设置为编辑状态)
 *     EndEdit() - 结束 AudioTrack 的编辑状态
 */

using System;
using System.Windows;
using Microsoft.Phone.BackgroundAudio; 

using System.Collections.Generic; 

namespace MyAudioPlayerAgent
{
    public class AudioPlayer : AudioPlayerAgent
    {
        // 播放列表
        private static List<AudioTrack> _playList = new List<AudioTrack>
        {
            new AudioTrack(new Uri("SuperMario.mp3", UriKind.Relative), "title", "artist", "album", null, null, EnabledPlayerControls.Pause),
            new AudioTrack(new Uri("http://traffic.libsyn.com/wpradio/WPRadio_29.mp3", 

UriKind.Absolute), "标题", "艺术家", "专辑", null, null, EnabledPlayerControls.All)
        }; 

        // 当前播放的 Track 在整个播放列表中的位置
        private static int _currentTrackNumber = 0; 

        /*
         * _classInitialized - 用于标记 AudioPlayer 是否已经被初始化
         *     标记成 volatile 是为了避免编译器认为此字段无外部修改,而将其优化放入寄存器(标记成 volatile 的字段只会放在内存中)
         *     一般来说,多任务环境下各任务间共享的字段应该被标记为 volatile
         */
        private static volatile bool _classInitialized; 

        public AudioPlayer()
        {
            if (!_classInitialized)
            {
                _classInitialized = true;
                Deployment.Current.Dispatcher.BeginInvoke(delegate
                {
                    Application.Current.UnhandledException += AudioPlayer_UnhandledException;
                });
            }
        } 

        private void AudioPlayer_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                System.Diagnostics.Debugger.Break();
            }
        } 

        // 播放状态发生改变时所调用的方法
        protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
        {
            switch (playState)
            {
                case PlayState.TrackReady:
                    player.Play();
                    break;
                case PlayState.TrackEnded:
                    PlayNextTrack(player);
                    break;
                case PlayState.Playing:
                    break;
                case PlayState.Paused:
                    break;
                case PlayState.Stopped:
                    break;
                case PlayState.BufferingStarted:
                    break;
                case PlayState.BufferingStopped:
                    break;
                case PlayState.Rewinding:
                    break;
                case PlayState.FastForwarding:
                    break;
                case PlayState.Shutdown:
                    break;
                case PlayState.Unknown:
                    break;
            } 

            NotifyComplete();
        } 

        // 当程序改变播放行为时所调用的方法
        protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
        {
            switch (action)
            {
                case UserAction.Play:
                    PlayTrack(player);
                    break;
                case UserAction.SkipPrevious:
                    PlayPreviousTrack(player);
                    break;
                case UserAction.SkipNext:
                    PlayNextTrack(player);
                    break;
                case UserAction.Rewind:
                    player.Rewind();
                    break;
                case UserAction.FastForward:
                    player.FastForward();
                    break;
                case UserAction.Seek:
                    player.Position = (TimeSpan)param;
                    break;
                case UserAction.Pause:
                    player.Pause();
                    break;
                case UserAction.Stop:
                    player.Stop();
                    break;
            } 

            NotifyComplete();
        } 

        // 播放下一个 Track
        private void PlayNextTrack(BackgroundAudioPlayer player)
        {
            if (++_currentTrackNumber >= _playList.Count)
                _currentTrackNumber = 0; 

            PlayTrack(player);
        } 

        // 播放上一个 Track
        private void PlayPreviousTrack(BackgroundAudioPlayer player)
        {
            if (--_currentTrackNumber < 0)
                _currentTrackNumber = _playList.Count - 1; 

            PlayTrack(player);
        } 

        // 播放当前 Track
        private void PlayTrack(BackgroundAudioPlayer player)
        {
            player.Track = _playList[_currentTrackNumber];
        } 

        // 出现异常时所调用的方法
        protected override void OnError(BackgroundAudioPlayer player, AudioTrack track, Exception error, bool isFatal)
        {
            if (isFatal)
                Abort();
            else
                NotifyComplete();
        } 

        // 当后台代理转到休眠状态或终止状态前,系统会自动调用此方法,需要在 5 秒内执行完毕
        protected override void OnCancel()
        { 

        }
    }
} 

/*
 * 主程序引用此项目后,会在 manifest 中添加如下信息:
 * <ExtendedTask Name="BackgroundTask">
 * <BackgroundServiceAgent Specifier="AudioPlayerAgent" Name="MyAudioPlayerAgent" 

Source="MyAudioPlayerAgent" Type="MyAudioPlayerAgent.AudioPlayer" />
 * </ExtendedTask>
 */

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索音频数据播放
, 后台
, break
, player
, 播放地址
, 音频
, 安卓 audioplayer
, case
, 状态
, 播放状态
, 音频地址
, rewind
后台播放
媒体查询 media、css媒体查询 media、媒体查询 media尺寸、newmedia新媒体联盟、media player 流媒体,以便于您获取更多的相关知识。

时间: 2024-09-14 12:32:10

与众不同windows phone (15) Media(媒体)之后台播放音频的相关文章

与众不同 windows phone (15) - Media(媒体)之后台播放音频

原文:与众不同 windows phone (15) - Media(媒体)之后台播放音频 [索引页][源码下载] 与众不同 windows phone (15) - Media(媒体)之后台播放音频 作者:webabcd 介绍与众不同 windows phone 7.5 (sdk 7.1) 之媒体 通过 AudioPlayerAgent 实现在后台播放音频 示例演示如何通过后台代理的方式来实现音频在后台的播放1.后台代理MyAudioPlayerAgent/AudioPlayer.cs /*

与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成

原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页][源码下载] 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 作者:webabcd 介绍与众不同 windows phone 7.5 (sdk 7.1) 之媒体 音频播放器 视频播放器 与 Windows Phone 的音乐

与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成

原文:与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单"应用程序..."和"共享..."关联, 与 Windows Phone 的图片中心集成 [索引页][源码下载] 与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单"应用程序..."和"共享..."关联, 与 Windows Phon

与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows phone 8.0 之 媒体 添加音乐到音乐中心,从音乐中心删除音乐 与图片中心相关的新增功能 BackgroundAudioPlayer 的新增功能 示例

与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载)

原文:与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载) [索引页][源码下载] 与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载) 作者:webabcd 介绍与众不同 windows phone 7.5 (sdk 7.1) 之后台任务 后台文件传输(下载) 后台文件传输(上传) 示例1.演示如何实现后台文件传输(下载)BackgroundTransfe

与众不同windows phone (40)

8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 介绍 与众不同 windows phone 8.0 之 媒体 添加音乐到音乐中心,从音乐中心删除音乐 与图片中心相关的新增功能 BackgroundAudioPlayer 的新增功能 示例 1.演示如何添加音乐 到音乐中心,以及如何从音乐中心删除音乐 MusicMediaLibrary/MusicMediaLibrary.xaml <phone:PhoneApplicationPage x:Class="D

与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)

原文:与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务) [索引页][源码下载] 与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务) 作者:webabcd 介绍与众不同 windows phone 7.5

与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展

原文:与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 [源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows phone 8.0 之 相机和照片 镜头的可扩展性 图片的可扩展性 图片的自动上传扩展 示例1.演示如何将本 app 注册为镜头扩展CameraAndPhoto/Len

与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频

原文:与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 [源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 windows phone 8.0 之 相机和照片 通过 AudioVideoCaptureDevice 捕获视频和音频 示例演示 AudioVideoCa