Windows phone 7 调用Close方法后如何重用BackgroundAudioPlayer

Windows phone 7 调用Close方法后如何重用BackgroundAudioPlayer,windows-phone-7,mediaelement,background-audio,Windows Phone 7,Mediaelement,Background Audio,我使用MediaElement播放视频,使用BackgroundAudioPlayer播放音频 这是一个案例 我正在通过BackgroundAudioPlayer播放远程音频。 然后我想播放视频,在MediaElement开始播放视频之前,我打电话给BackgroundAudioPlayer。请按照BackgroundAudioPlayer最佳实践中的建议关闭 MediaElement and the BackgroundAudioPlayer Care must be taken when

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

这是一个案例

我正在通过BackgroundAudioPlayer播放远程音频。 然后我想播放视频,在MediaElement开始播放视频之前,我打电话给BackgroundAudioPlayer。请按照BackgroundAudioPlayer最佳实践中的建议关闭

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();
我在第一行代码中得到了
invalidooperationexception
,“后台音频资源不再可用”。 那么,在使用MediaElement之后,如何在我的应用程序中重用BackgroundAudioPlayer

编辑:

如果使用MediaPlayerLauncher而不是MediaElement,它会在第二次播放音频时工作,因为MediaPlayerLauncher启动时应用程序被删除。但有可能在一个应用程序中混合使用MediaElement和BackgroundAudioPlayer吗!?!?!
似乎是微软的另一个噩梦:(

在开始播放媒体元素之前,您必须调用
BackgroundAudioPlayer.Instance.Close()
。我已经在WP7.1和WP8模拟器中使用了一个简单的后台音频代理(非流媒体)尝试了这一点.没有这个调用,我总是看到
invalidooperationexception
s。有了它,情况会好得多

例如:

    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();
    }
此外:
如果要从用户界面添加曲目,您应该在后台音频代理的
GetNextTrack
中执行此操作。

如果要在应用程序中同时使用音频和视频媒体内容,请不要将
MediaElement
BackgroundAudioPlayer混用!

MediaLauncher
BackgroundAudioPlayer
一起使用,当然不要忘记在
MediaLauncher.Show()之前调用
BackgroundAudioPlayer.Instance.Close()

在使用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();

我确实打电话给BackgroundAudioPlayer.Instance.Close()但问题是我不能将MediaElement与BackgroundAudioPlayer混合使用,因为BackgroundAudioPlayer在调用Close和MediaElement完成其工作后不会再次加载其dll。所以对实例属性的任何调用都会导致InvalidOperationException。但它与MediaPlayerLauncher一起工作,因为在应用程序还原后,BackgroundAudioPlayer可以再次加载其DLL。因此,似乎不可能在同一个应用程序中混合使用MediaElement和BackgroundAudioPlayer,只有MediaPlayerLauncher和BackgroundAudioPlayer。如果您将更改前景应用程序中曲目的尝试移出(将其移到代理程序中),会发生什么情况?我在WP7和WP8上的一个简单测试项目中对此进行了测试。@NazarGrynko在使用MediaElement之前调用Close将清除其资源,并且在第二次使用BackgroundAudioPlayer时,您将看到它再次加载.dll。我已经在我的应用程序中对其进行了测试。我不能这样做!当播放器停止时,只有用户可以启动播放在我的例子中,从UI播放音频。至少作为一个快速测试。实际上,如果这样做有效,您需要将从UI播放的曲目告知后台代理。SDK会阻止您从后台代理启动音频,但后台代理应负责选择下一步播放的曲目。我在使用MediaPlayerLa时看到了这一点uncher,我不需要给Close打电话:)完全相同的问题(MediaElement播放视频,BackgroundAudioPlayer播放音频),在Close之后偶然发现了这个问题。只是设计/文档化的sdk很差。我想我会试试MediaPlayeRLauncher并撕碎MediaElement代码。。是的,如果您无法处理这些异常,那么使用MediaPlayerLauncher是一个不错的选择,我看到很多应用程序都在这样做。而且,在使用MediaPlayerLauncher时,我不需要调用Close()。这是正确的答案。如果您遵循此解决方案,您似乎可以使用mediaelement和backgroundmediaplayer(至少在我的解决方案中是有效的,谢谢您);