Windows Store应用程序使用MediaElement播放背景音频

时间:2015-01-28 05:42:32

标签: c# windows-store-apps windows-phone-8.1

在我的Windows Phone 8.1应用程序中,我正在使用Media Element。我希望它继续播放音频,即使用户离开应用程序。 MediaElement正在使用来自远程源(.mp4)文件的视频。我也尝试过这里的示例视频; http://go.microsoft.com/fwlink/p/?LinkID=272585

我在How to play audio in the background (XAML)中关注了示例,但无法使其正常工作。此示例特定于Windows 8.1而不是Windows Phone。

当MediaElement播放视频剪辑时,当我按下Windows按钮音频停止时,当我回击时,它继续工作。

我的代码如下;

     <MediaElement x:Name="MediaElement"  VerticalAlignment="Top" 
        HorizontalAlignment="Stretch" 
            AudioCategory="BackgroundCapableMedia" 
            MediaEnded="MediaElement_MediaEnded" 
            MediaFailed="MediaElement_MediaFailed" 
    MediaOpened="MediaElement_MediaOpened" SeekCompleted="MediaElement_SeekCompleted"   
DownloadProgressChanged="MediaElement_OnDownloadProgressChanged"  BufferingProgressChanged="MediaElement_BufferingProgressChanged" 
AreTransportControlsEnabled="True" CurrentStateChanged="MediaElement_CurrentStateChanged"    />

我还在Package.appxmanifest

中将音频定义为支持的任务类型
public VideoPlayer()
        {
            InitializeComponent();

            #region SystemMediaTransportControls
            // Hook up app to system transport controls.
            systemControls = SystemMediaTransportControls.GetForCurrentView();
            systemControls.ButtonPressed += SystemControls_ButtonPressed;
            // Register to handle the following system transpot control buttons.
            systemControls.IsPlayEnabled = true;
            systemControls.IsPauseEnabled = true;
            systemControls.IsStopEnabled = true;
            systemControls.IsEnabled = true;
            #endregion

            _navigationHelper = new NavigationHelper(this);
            _navigationHelper.LoadState += NavigationHelper_LoadState;
            _navigationHelper.SaveState += NavigationHelper_SaveState;
        }


void SystemControls_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args)
        {
            switch (args.Button)
            {
                case SystemMediaTransportControlsButton.Play:
                    PlayMedia();
                    break;
                case SystemMediaTransportControlsButton.Stop:
                    StopMedia();
                    break;
                case SystemMediaTransportControlsButton.Pause:
                    PauseMedia();
                    break;
                default:
                    break;
            }
        }

        private async void StopMedia()
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                MediaElement.Stop();
            });
        }

        async void PlayMedia()
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                MediaElement.Play();
            });
        }

        async void PauseMedia()
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                MediaElement.Pause();
            });
        }



private void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                Debug.WriteLine("MediaElement.CurrentState: " + MediaElement.CurrentState);
            }
            switch (MediaElement.CurrentState)
            {
                case MediaElementState.Playing:
                    systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
                    break;
                case MediaElementState.Paused:
                    systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
                    break;
                case MediaElementState.Stopped:
                    systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
                    break;
                case MediaElementState.Closed:
                    systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
                    break;
                default:
                    break;
            }
        }

1 个答案:

答案 0 :(得分:1)

Windows Phone并不像Windows那样使用与背景音频相同的机制,主要是因为低规格手机没有足够的资源同时运行两个应用程序。

相反,Windows Phone使用专用的后台进程在后台播放音乐。有关如何在Windows运行时手机应用中执行此操作的详细信息,请参阅BackgroundMediaPlayer