例子:Background Audio Streamer Sample
The Background Audio Streamer sample demonstrates how to create an app that uses a MediaStreamSource to stream audio content from a AudioStreamingAgent. This agent will run in the background and under the lock screen where you can control the audio using the Universal Volume Control (UVC). You can also control audio playback directly from the UI of the app, when it is the foreground app. The sample uses a simple sine wave generator to simulate an audio stream so it doesn’t depend on a network connection. For more info about background audio, see Background audio overview for Windows Phone.
本例子演示了如何从“AudioStreamingAgent” 代理创建一个“MediaStreamSource”,该代理将会后台运行,同时锁屏时你也可以通过 UVC(Universal volume Control)控制音频的播放。
本例子中,当app 前台运行时,仅仅使用一个简单的Wave(.wav)生成器来模拟一个音频流,因此它其实并不需要网络连接。
- 计时器的使用
1. DispatcherTimer: 集成到按指定时间间隔和指定优先级处理的 System.Windows.Threading.Dispatcher 队列中的计时器。
DispatcherTimer _timer; // New instance _timer = new DispatcherTimer(); // Set interval _timer.Interval = TimeSpan.FromSeconds(0.5); // Set delegate _timer.Tick += new EventHandler(UpdateState);
2. 事件 处理
每个0.5s 更新一次界面, 播放器相关进度,时间,状态等信息,从BackgroundAudioPlayer获取。
private void UpdateState(object sender, EventArgs e) { txtState.Text = string.Format("State: {0}", BackgroundAudioPlayer.Instance.PlayerState); if (BackgroundAudioPlayer.Instance.Track != null) { txtTrack.Text = string.Format("Track: {0}", BackgroundAudioPlayer.Instance.Track.Title); // Set the current position on the ProgressBar. positionIndicator.Value = BackgroundAudioPlayer.Instance.Position.TotalSeconds; // Update the current playback position. TimeSpan position = new TimeSpan(); position = BackgroundAudioPlayer.Instance.Position; textPosition.Text = String.Format("{0:d2}:{1:d2}:{2:d2}", position.Hours, position.Minutes, position.Seconds); // Update the time remaining digits. TimeSpan timeRemaining = new TimeSpan(); timeRemaining = BackgroundAudioPlayer.Instance.Track.Duration - position; textRemaining.Text = String.Format("-{0:d2}:{1:d2}:{2:d2}", timeRemaining.Hours, timeRemaining.Minutes, timeRemaining.Seconds); } }
- BackgroundAudioPlayer的使用
1. 相关操作方法
BackgroundAudioPlayer.Instance.SkipPrevious(); //前一个
BackgroundAudioPlayer.Instance.Play(); //播放
BackgroundAudioPlayer.Instance.Pause(); //暂停
BackgroundAudioPlayer.Instance.SkipNext(); //后一个
2. 两种类型的后台音频应用程序:
一种类型实现简单的播放列表并将一个包含媒体文件地址的URI传递给Zune媒体队列以设置当前曲目。URI可以是手机的本地或远程地址。
另一种类型的后台音频应用程序使用MediaStreamSource实现音频流的播放,此音频流的格式则可以是任何格式。这是因为由MediaStreamSource派生的类实现了对音频流的处理和解码。
3. 实现AudioStreamingAgent
必须实现其虚函数 OnBeginStreaming, 这个方法将会在新的音频需要解码时被调用。
这里使用SineMediaStreamSource 模拟了一个音频流 用作返回。
public class AudioTrackStreamer : AudioStreamingAgent { /// <summary> /// Called when a new track requires audio decoding protected override void OnBeginStreaming(AudioTrack track, AudioStreamer streamer) { // Set the source of streamer to a media stream source double freq = Convert.ToDouble(track.Tag); // Use sine wave audio generator to simulate a streaming audio feed SineMediaStreamSource mss = new SineMediaStreamSource(freq, 1.0, TimeSpan.FromSeconds(5)); // Event handler for when a track is complete or the user switches tracks mss.StreamComplete += new EventHandler(mss_StreamComplete); // Set the source streamer.SetSource(mss); }
4. 实现AudioPlayerAgent
// 摘要: // Microsoft.Phone.BackgroundAgent 的实现,专门设计为在后台播放收音机。 public class AudioPlayerAgent : BackgroundAgent { // 摘要: // 创建 Microsoft.Phone.BackgroundAudio.AudioPlayerAgent 的新实例。 public AudioPlayerAgent(); // 摘要: // 当播放出现错误(如未正确下载音频曲目)时调用。 // // 参数: // player: // Microsoft.Phone.BackgroundAudio.BackgroundAudioPlayer。 // // track: // 发生错误的曲目。 // // error: // 发生的错误。 // // isFatal: // 如果为 true,则播放无法继续并且此曲目的播放也会停止。 protected virtual void OnError(BackgroundAudioPlayer player, AudioTrack track, Exception error, bool isFatal); // // 摘要: // 当播放状态发生更改时调用,错误状态除外。 // // 参数: // player: // Microsoft.Phone.BackgroundAudio.BackgroundAudioPlayer。 // // track: // 播放状态更改时播放的曲目。 // // playState: // 播放器的新状态。 protected virtual void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState); // // 摘要: // 当用户通过某些应用程序提供的 UI 或通用卷控件 (UVC) 请求操作并且应用程序已请求该操作的通知时调用。 // // 参数: // player: // Microsoft.Phone.BackgroundAudio.BackgroundAudioPlayer。 // // track: // 用户操作时播放的曲目。 // // action: // 用户已请求的操作。 // // param: // 与请求的操作关联的数据。 protected virtual void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param); }
5. 清单文件中添加后台音频Task
<Tasks> <DefaultTask Name="_default" NavigationPage="MainPage.xaml" /> <ExtendedTask Name="BackgroundTask"> <BackgroundServiceAgent Specifier="AudioPlayerAgent" Name="AudioPlaybackAgent1" Source="AudioPlaybackAgent1" Type="AudioPlaybackAgent1.AudioPlayer" /> <BackgroundServiceAgent Specifier="AudioStreamingAgent" Name="AudioStreamAgent1" Source="AudioStreamAgent1" Type="AudioStreamAgent1.AudioTrackStreamer" /> </ExtendedTask> </Tasks>
posted on 2013-08-14 11:05 Amazing-Ren 阅读(271) 评论(0) 编辑 收藏 举报