Windows 应用商店使用 MediaElement 播放背景音频

Windows Store Apps playing Background Audio with MediaElement

在我的 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。

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

我的代码如下;

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

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

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