使用Windows Phone 7 Media Player在页面之间共享媒体播放

时间:2011-02-20 19:02:11

标签: c# audio windows-phone-7 audio-streaming playback

我想要实现的目标:

  • 我想从WP7应用程序中的mp3和/或aac HTTP流启动音频播放
  • 我想从特定的“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:

  • Works,但“MediaPlayer.PlayPosition”是只读的,没有搜索方法。
  • 请参阅帖子:'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));
        }
    }
}

有谁知道我如何满足我的要求? 示例代码?

从架构的角度来看,我真正想要的是一个媒体服务,我可以发送流媒体网址,而不关心当前显示的是哪个页面。

1 个答案:

答案 0 :(得分:3)

我最终找到了一个简单但有效的解决方案: http://blog.reis.se/post/Enable-background-audio-for-multiple-pages-in-Windows-Phone-7-e28093-Take-2.aspx

在App.xaml中:

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

在App.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();