Windows 8.1 背景音频播放器在应用程序的其他页面中不起作用

Posted

技术标签:

【中文标题】Windows 8.1 背景音频播放器在应用程序的其他页面中不起作用【英文标题】:Windows 8.1 background audio player don't work in another page in the app 【发布时间】:2014-08-28 12:32:36 【问题描述】:

我有一个应用程序可以从互联网传输音频,媒体元素在主页中,它在其中运行良好,当应用程序在后台时,我在应用程序中有多个页面,而导航从主页到另一个页面,当我返回主页时,音频停止并恢复工作。 有什么办法让它在应用程序的其他页面中工作??

【问题讨论】:

【参考方案1】:

我为 windows 和 windows phone 编写音板。

为包含媒体元素的框架创建应用范围的样式。现在框架可以播放声音,在页面之间导航不会影响声音。

现在媒体元素位于框架上,页面需要以某种方式引用该媒体元素。我创建了一个公共课程来提供帮助。然后每个页面注册到这个类来播放声音。

在页面中:

SoundPlayer.Instance.Initialize();

SoundPlayer 类:

public void Initialize()
    
        // Register media elements to the Sound Service.
        try
        
            DependencyObject rootGrid = VisualTreeHelper.GetChild(Window.Current.Content, 0);
            var foregroundPlayer = (MediaElement)VisualTreeHelper.GetChild(rootGrid, 0) as MediaElement;
            var backgroundPlayer = (MediaElement)VisualTreeHelper.GetChild(rootGrid, 1) as MediaElement;

            SoundPlayer.ForegroundPlayer = foregroundPlayer;

            // Keep the state.
            var isMuted = this.IsBackgroundMuted;
            SoundPlayer.BackgroundPlayer = backgroundPlayer;
            this.IsBackgroundMuted = isMuted;
        
        catch (Exception)
        
            // Most probably you forgot to apply the custom root frame style.
            SoundPlayer.ForegroundPlayer = null;
            SoundPlayer.BackgroundPlayer = null;
        
    


    public async Task Play(string soundPath, bool inBackground = false)
    
        var mediaElement = inBackground ? BackgroundPlayer : ForegroundPlayer;

        if (mediaElement == null)
        
            return;
        

        mediaElement.Source = new Uri(soundPath);

        await mediaElement.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        
            mediaElement.Stop();
            mediaElement.Play();
        );
    

在 App.xaml 中

<ResourceDictionary>
                <Style x:Key="RootFrameStyle"
                       TargetType="Frame">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="Frame">
                                <Grid>
                                    <!-- Foreground Player -->
                                    <MediaElement IsLooping="False" />
                                    <!-- Background Player -->
                                    <MediaElement IsLooping="True" />
                                    <Grid>
                                        <ContentPresenter />
                                    </Grid>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ResourceDictionary>

这是一篇更详细地解释了这一点的博文。 http://blogs.u2u.be/diederik/post/2014/07/10/Playing-sounds-in-a-Universal-Windows-MVVM-app.aspx

【讨论】:

我在链接页面尝试了您的示例。也许我误解了“背景”的概念,因为在我的 WP8.1 手机中,当我将其他应用程序更改为前台时,您的“背景”声音会立即停止。这是预期的吗?我用VS2013 Update5编译了它

以上是关于Windows 8.1 背景音频播放器在应用程序的其他页面中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows Phone 8 应用程序中播放循环背景音频(不使用 BackroundAudio 服务)?

Windows 8.1 中的系统音频处理对象 (sAPO) 和 Skype

带有效果的 Windows 8.1 应用音频(NAudio 或 SharpDX)

在 Windows Phone 8.1 上播放 GIF

适用于 Windows Phone 8.1 的后台媒体播放器中的无缝循环

如果您的应用程序播放视频并暂停背景音频,您如何在完成后让背景音频恢复?