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

时间:2014-05-02 19:07:59

标签: c# audio windows-phone-8

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

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

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

此代码将放在App.xaml的应用程序资源标记中,以定义MediaElement的页面样式(确保将Source中的文件路径更改为您自己的声音文件所在的位置):< / p>

<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.Style = Resources["RootFrameStyle"] as Style;行下方还需要RootFrame = new PhoneApplicationFrame();。这样做是将我们刚为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

答案 1 :(得分:0)

我在WP中使用它不确定它是否可以帮助你在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();
}

答案 2 :(得分:0)

您可以在框架中放置MediaElement,因此它可用于所有页面。为此,只要在App.xaml.cs中创建了Frame,就需要设置Frame的样式。在某个地方你需要定义风格:

<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>