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

Posted

技术标签:

【中文标题】如何在 Windows Phone 8 应用程序中播放循环背景音频(不使用 BackroundAudio 服务)?【英文标题】:How to playing looping background audio in a Windows Phone 8 app (without using the BackroundAudio service)?? 【发布时间】:2014-05-02 19:07:58 【问题描述】:

我正在创建一个基于 XAML/C# 的 Windows Phone 8 应用程序,我希望在整个应用程序中播放一些简单的循环背景音乐以增强用户体验,但我不知道该怎么做。

到目前为止我发现的所有方法都不合适 - MediaElement 似乎只在一个页面上工作(因此在应用程序的页面之间不连续),XNA SoundEffect 方法根本不起作用,并且本机 API 用于 C++只要。我不是在寻找复杂的功能或声音在应用程序之外继续播放。

我不想使用 BackgroundAudio 方法的原因是它会在应用程序之外继续播放音乐,并为用户提供音乐叠加栏来更改声音,这是我不想要的。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我会将我在下面找到的解决方案发布给任何感兴趣的人(类似于 cmets 中建议的解决方案)。

此代码将放置在 App.xaml 的 Application Resources 标记中,以定义 MediaElement 的页面样式(确保将 Source 中的文件路径更改为您自己的声音文件所在的位置):

<Style  x:Key="RootFrameStyle" TargetType="phone:PhoneApplicationFrame">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="phone:PhoneApplicationFrame">
                    <Grid>
                        <MediaElement x:Name="MediaPlayer" Source="/Assets/Sounds/backgroundmusic.wav" Volume="1" AutoPlay="True" />
                        <ContentPresenter />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

您还需要在 App.xaml.cs 文件中 RootFrame = new PhoneApplicationFrame(); 行下方的 RootFrame.Style = Resources["RootFrameStyle"] as Style;。这样做的目的是将我们刚刚为 MediaElement 定义的样式附加到应用程序的根框架,即显示应用页面的框架。

要使音频无限循环,您需要在您的 MediaElement 样式中创建一个 MediaEnded 处理程序:

<MediaElement x:Name="MediaPlayer" Source="/Assets/Sounds/backgroundmusic.wav" Volume="1" AutoPlay="True" MediaEnded="MediaPlayer_MediaEnded" />

然后,您可以将以下代码放入在 App.xaml.cs 文件中创建的 MediaEnded 事件中:

private void MediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    
        MediaElement ctrl = (MediaElement)sender;
        ctrl.Position = new TimeSpan(0, 0, 0);
        ctrl.Play();
    

请注意,这不是一个完美的解决方案,因为在循环停止和重新开始之间有一个小的时间间隔。然而,这可以通过使用在开始和结束时淡出的音频循环变得不那么明显。如果您想要一个无缝且更灵活的解决方案,您最好使用 Windows Phone 的原生音频解决方案之一,详细信息 here。

【讨论】:

这个解决方案非常适合我。一个问题,是否可以从任何页面控制 MediaElement(就像在模板中一样)?【参考方案2】:

我在 WPF 中使用了它,不确定它是否可以在 WP8 应用程序中帮助您。

应用初始化:

Music = new MediaPlayer();
Music.Open(new Uri("Sounds/SalusEstudiantv5.mp3", UriKind.Relative));
Music.MediaEnded += MusicEnded;
Music.Play();


private void MusicEnded(object sender, EventArgs e)

Music.Stop();
Music.Play();

【讨论】:

我刚刚尝试过,不幸的是,Windows Phone 8 SDK 似乎无法识别音乐功能(尝试了很多命名空间)。还是谢谢 音乐只是我的变量,我没有包含声明,你需要的是 MediaPlayer()【参考方案3】:

您可以将 MediaElement 放在 Frame 中,以便所有页面都可以使用它。为此,您需要在 App.xaml.cs 中创建框架时设置框架的样式。您需要在某个地方定义样式:

<Style x:Key="RootFrameStyle" TargetType="Frame">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="VerticalContentAlignment" Value="Stretch"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Frame">
                <Border x:Name="ClientArea" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" HorizontalAlignment="TemplateBinding HorizontalAlignment" VerticalAlignment="TemplateBinding VerticalAlignment">
                    <Grid>
                        <MediaElement x:Name="FakeBackgroundAudioPlayer" AutoPlay="False" Visibility="Collapsed" />
                        <ContentPresenter ContentTemplate="TemplateBinding ContentTemplate" Content="TemplateBinding Content" HorizontalAlignment="TemplateBinding HorizontalContentAlignment" Margin="TemplateBinding Padding" VerticalAlignment="TemplateBinding VerticalContentAlignment"/>
                    </Grid>
                </Border>                       
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

以上是关于如何在 Windows Phone 8 应用程序中播放循环背景音频(不使用 BackroundAudio 服务)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows Phone 8 应用程序中检查社交网络身份验证?

如何在 Windows Phone 8 的 app.xaml 中应用全局转换规则

如何在 Windows Phone 8 中使用 mp3 文件?

如何区分锁和启动按钮在Windows Phone 8的压

如何在Windows Phone 8中合并音频和视频[关闭]

如何在 windows phone 8.1 应用程序中使用 MenuFlyout 更改动态生成按钮的内容