【问题标题】:How to reuse BackgroundAudioPlayer after Close method called如何在调用 Close 方法后重用 BackgroundAudioPlayer
【发布时间】:2014-03-07 04:37:14
【问题描述】:

我使用 MediaElement 播放视频,使用 BackgroundAudioPlayer 播放音频。

这是一个案例。

我正在通过 BackgroundAudioPlayer 播放远程音频。 然后我想播放视频,在 MediaElement 开始播放视频之前,我按照 BackgroundAudioPlayer 最佳实践中的建议调用 BackgroundAudioPlayer.Close。

MediaElement and the BackgroundAudioPlayer

Care must be taken when mixing BackgroundAudioPlayer and MediaElement for audio playback.

1. Close() must be called before switching to MediaElement playback.

2. There is only one media queue. Your application cannot pause background audio, play something with MediaElement then resume the background audio stream.

但在播放视频后,我想再次播放音频。

// Play audio result
BackgroundAudioPlayer.Instance.Track = new AudioTrack(new Uri(audioSearchResult.Url, UriKind.Absolute), audioSearchResult.Title, null, null, null, 
                AudioPlayer.TrackStateBuffering, EnabledPlayerControls.All);
BackgroundAudioPlayer.Instance.Play();

我在第一行代码中收到InvalidOperationException,上面写着“背景音频资源不再可用”。 那么在使用 MediaElement 之后如何在我的应用中重用 BackgroundAudioPlayer 呢?

编辑:

如果使用 MediaPlayerLauncher 而不是 MediaElement,它会在第二次播放音频时起作用,因为在 MediaPlayerLauncher 启动时应用程序被墓碑化。但是是否可以在一个应用程序中混合 MediaElement 和 BackgroundAudioPlayer !?!?! 似乎又是来自 MS 的噩梦:(

【问题讨论】:

  • 我看到使用MediaPlayerLauncher时,我不需要调用Close :)
  • 完全相同的问题(MediaElement 播放视频,BackgroundAudioPlayer 播放音频)并在关闭后偶然发现了这个问题。只是设计/记录不佳的sdk。我想我会尝试 MediaPlayeRLauncher 并撕掉 MediaElement 代码.. sigh

标签: windows-phone-7 mediaelement background-audio


【解决方案1】:

使用 MediaElement 播放视频后,您似乎能够继续使用背景音频播放器,您需要在视频结束后和使用任何其他 BackgroundAudioPlayer 方法之前再次调用 BackgroundAudioPlayer.Instance.Close()。

你的例子应该是这样的:

// Play audio result
BackgroundAudioPlayer.Instance.Close();
BackgroundAudioPlayer.Instance.Track = new AudioTrack(new Uri(audioSearchResult.Url, UriKind.Absolute), audioSearchResult.Title, null, null, null, AudioPlayer.TrackStateBuffering, EnabledPlayerControls.All);
BackgroundAudioPlayer.Instance.Play();

【讨论】:

  • 这是正确答案。如果您遵循此解决方案,您似乎可以使用 mediaelement 和 backgroundmediaplayer(至少它适用于我。所以谢谢);
【解决方案2】:

您必须在开始播放媒体元素之前致电BackgroundAudioPlayer.Instance.Close()。我已经在 WP7.1 和 WP8 模拟器中使用简单的后台音频代理(不是流式传输)进行了尝试。如果没有这个电话,我会一直看到InvalidOperationExceptions。有了它,事情就会变得更好。

例如:

    private void ButtonPlayMediaElement(object sender, RoutedEventArgs e)
    {
        BackgroundAudioPlayer.Instance.Close();
        mediaElement.Source = new Uri("http://wpdevpodcast.episodes.s3.amazonaws.com/Episode_093_Were_All_Stickmen.mp3", UriKind.Absolute);
        mediaElement.Play();
    }

还有: 您正在从 UI 添加曲目,您应该在后台音频代理中的 GetNextTrack 中执行此操作。

【讨论】:

  • 我确实调用了 BackgroundAudioPlayer.Instance.Close() 但问题是我不能将 MediaElement 与 BackgroundAudioPlayer 混合,因为在调用 Close 并且 MediaElement 完成其工作后,BackgroundAudioPlayer 不会再次加载其 dll。所以任何对 Instance 属性的调用都会导致 InvalidOperationException。但它适用于 MediaPlayerLauncher,因为在应用程序恢复后,BackgroundAudioPlayer 可以再次加载其 dll。所以看起来不可能在同一个应用程序中混合 MediaElement 和 BackgroundAudioPlayer,只有 MediaPlayerLauncher 和 BackgroundAudioPlayer。
  • 如果在前台应用程序中移出更改曲目的尝试(将其移至代理)会发生什么?我在 WP7 和 WP8 上的一个简单测试项目中对此进行了测试。
  • @NazarGrynko 在使用 MediaElement 之前调用 Close 将清除其资源,并且您第二次使用 BackgroundAudioPlayer 时不会出现问题,您会看到它再次加载 .dll。我已经在我的应用中对其进行了测试。
  • 我做不到!当播放器停止时,在我的例子中,只有用户可以从 UI 开始播放音频。
  • 至少做一个快速测试。实际上,如果这可行,您将需要将要从 UI 播放的曲目传达给后台代理。 SDK 会阻止您从后台代理启动音频,但后台代理应负责选择接下来要播放的曲目。
【解决方案3】:

如果您想在应用程序中同时使用音频和视频媒体内容,请不要将MediaElementBackgroundAudioPlayer 混合使用! 使用MediaLauncherBackgroundAudioPlayer,当然不要忘记在MediaLauncher.Show() 之前调用BackgroundAudioPlayer.Instance.Close()

【讨论】:

  • 是的,如果您无法处理这些异常,使用 MediaPlayerLauncher 是一个不错的选择,我看到很多应用程序都在这样做。而且,在使用 MediaPlayerLauncher 时,我不需要调用 Close()。它运作良好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2016-09-14
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2017-07-20
  • 2012-02-23
相关资源
最近更新 更多