Совместное воспроизведение мультимедиа между страницами с помощью Windows Phone 7 Media Player - PullRequest
2 голосов
/ 20 февраля 2011

Чего я хочу добиться:

  • Я хочу начать воспроизведение аудио из потока HTTP и / или AAC в приложении WP7
  • Я хочу начать воспроизведение сспецифический экземпляр PhoneApplicationPage, но по-прежнему допускает переход на другие страницы, сохраняя при этом воспроизведение без какого-либо прерывания - т.е. я хочу, чтобы воспроизведение было «областью применения»
  • Я хочу иметь возможность «искать» в моих медиафайлах
  • Воспроизведение продолжается, пока телефон заблокирован

Что я пробовал:

MediaElement:

  • Если MediaElement нетпринадлежащий странице, при вызове Play () звук не воспроизводится, несмотря на то, что не выдается никаких исключений.
  • После выполнения http://blog.jayway.com/2010/10/04/enable-background-audio-for-multiple-pages-in-windows-phone-7/', воспроизведение по-прежнему сбрасывается между переходами страницы
  • Это также выглядит какдовольно хакерский способ делать вещи ...

Microsoft.Xna.Framework.MediaPlayer:

  • Работает, но «MediaPlayer.PlayPosition» только для чтения,и не искать метуd.
  • См. сообщение: 'http://forums.create.msdn.com/forums/t/17318.aspx' - Очевидно, это из-за ограничений XBox с Xna (?!)

Microsoft Silverlight Media Framework:

  • http://smf.codeplex.com/
  • Мой любимый вариант, поскольку он кажется очень исчерпывающим
  • Загруженные сборки Silverlight Media Framework 2.3, специфичные для WP7: http://smf.codeplex.com/releases/view/57991#DownloadId=190196
  • Я знаю, что это хак,но для того, чтобы что-то работало, в приведенном ниже коде «SMFPlayer» является статическим и добавляется к каждой компоновке страницы при навигации.
  • Если «SMFPlayer» не принадлежит страницепри вызове Play () звук не воспроизводится, несмотря на то, что не выдается никаких исключений.
  • Воспроизведение по-прежнему сбрасывается между переходами страниц ...
  • Код:
using System;
using System.Diagnostics;
using Microsoft.Phone.Controls;
using Microsoft.SilverlightMediaFramework.Core;
using Microsoft.SilverlightMediaFramework.Core.Media;
using Microsoft.SilverlightMediaFramework.Plugins.Primitives;

namespace WindowsPhoneApplication1
{
    public partial class MainPage : PhoneApplicationPage
    {
        public static readonly SMFPlayer Player = new SMFPlayer();

        static MainPage()
        {
            Player.VolumeLevel = 1.0f;
            Player.Playlist.Add(new PlaylistItem {MediaSource = new Uri("http://smf.vertigo.com/videos/wildlife.wmv", UriKind.Absolute)});

            Player.LogLevel = LogLevel.All;
            Player.LogEntryReceived += PlayerLogEntryReceived;
        }

        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            LayoutRoot.Children.Add(Player);
        }

        protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
        {
            base.OnNavigatingFrom(e);
            LayoutRoot.Children.Remove(Player);
        }

        private static void PlayerLogEntryReceived(object sender, CustomEventArgs<LogEntry> e)
        {
            Debug.WriteLine(e.Value.Severity + e.Value.Message + e.Value.Type);
        }

        private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.RelativeOrAbsolute));
        }
    }
}

Кто-нибудь знает, как я могу удовлетворить свои требования?Пример кода?

С архитектурной точки зрения мне действительно нужна медиа-служба, на которую я могу отправлять потоковые URL-адреса, не заботясь о том, какая страница отображается в данный момент.

1 Ответ

3 голосов
/ 22 февраля 2011

В конце концов я нашел простое, но эффективное решение: http://blog.reis.se/post/Enable-background-audio-for-multiple-pages-in-Windows-Phone-7-e28093-Take-2.aspx

В приложении. Xaml:

<APPLICATION.RESOURCES>
    <MEDIAELEMENT x:key="GlobalMedia"></MEDIAELEMENT>
</APPLICATION.RESOURCES>

В приложении. Xaml.cs:

public static MediaElement GlobalMediaElement
{
  get { return Current.Resources["GlobalMedia"] as MediaElement; }
}

На вашей странице:

public partial class MyPage : PhoneApplicationPage
{
    MediaElement MEAudio;

    public MainPage()
    {
        InitializeComponent();    
        MEAudio = App.GlobalMediaElement;
    }

    private void OnSomeEvent(object sender, RoutedEventArgs e)
    {
        MEAudio.xxxxx();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...