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

标签 c# audio windows-phone-8

我正在创建一个基于 XAML/C# 的 Windows Phone 8 应用程序,我希望在整个应用程序中播放一些简单的循环背景音乐以增强用户体验,但我不确定如何执行此操作。

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

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

谢谢你的帮助。

最佳答案

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

此代码将放置在 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>

您还需要RootFrame.Style = Resources["RootFrameStyle"] as Style;RootFrame = new PhoneApplicationFrame(); 行下方在您的 App.xaml.cs 文件中。这样做的目的是将我们刚刚为 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 .

关于c# - 如何在 Windows Phone 8 应用程序中播放循环背景音频(不使用 BackroundAudio 服务)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435272/

相关文章:

c# - C#读取XML文件

windows-phone-7 - System.OutOfMemoryException 从隔离存储读取和绑定(bind)图像

c# - 如何在 Windows Phone 8 上进行代码内绑定(bind)

android - 如何录制音频?

Javascript 在没有音频崩溃的情况下播放其他音频

silverlight - 墓碑后在页面初始化时获取 WP8 Silverlight 应用程序中的屏幕高度

c# - 在 C# Windows 应用程序中设置 Datagrid 的单元格宽度

c# - 我应该在哪里保存序列化数据文件?

c# - 在 MVVM 中显示对话框并设置对话框选项

audio - 为 Web 和移动 Web 构建自适应音频流