• 与众不同 windows phone (14) Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成


    [索引页]
    [源码下载]


    与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成



    作者:webabcd


    介绍
    与众不同 windows phone 7.5 (sdk 7.1) 之媒体

    • 音频播放器
    • 视频播放器
    • 与 Windows Phone 的音乐和视频中心集成



    示例
    1、演示音频播放器
    Audio.xaml

    <phone:PhoneApplicationPage 
        x:Class="Demo.Media.Audio"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
        shell:SystemTray.IsVisible="True">
    
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <StackPanel Orientation="Vertical">
                <MediaElement x:Name="mediaElement" Source="Assets/SuperMario.mp3" AutoPlay="False" />
    
                <Button x:Name="btnPlay" Content="播放" Click="btnPlay_Click" />
                <Button x:Name="btnPause" Content="暂停" Click="btnPause_Click" />
                
                <TextBlock x:Name="lblStatus" />
            </StackPanel>
        </Grid>
    
    </phone:PhoneApplicationPage>

    Audio.xaml.cs

    /*
     * MediaElement - 用于播放视频或音频,本地地址或远程地址均可
     *     支持的编码格式参见:http://msdn.microsoft.com/en-us/library/ff462087(v=vs.92)
     * 
     * MediaElement 的详细说明参见:http://www.cnblogs.com/webabcd/archive/2008/12/01/1344632.html
     * Launcher 方式参见:http://www.cnblogs.com/webabcd/archive/2012/06/14/2548776.html 中的 MediaPlayerLauncher
     * 
     * XNA 播放音频参见:http://www.cnblogs.com/webabcd/archive/2011/07/11/2102713.html
     */
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    
    namespace Demo.Media
    {
        public partial class Audio : PhoneApplicationPage
        {
            public Audio()
            {
                InitializeComponent();
    
                mediaElement.CurrentStateChanged += new RoutedEventHandler(mediaElement_CurrentStateChanged);
            }
    
            void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
            {
                // 显示 MediaElement 的当前状态
                lblStatus.Text = mediaElement.CurrentState.ToString();
            }
    
            private void btnPlay_Click(object sender, RoutedEventArgs e)
            {
                // 播放
                mediaElement.Play();
            }
    
            private void btnPause_Click(object sender, RoutedEventArgs e)
            {
                // 暂停
                mediaElement.Pause();
            }
        }
    }


    2、演示视频播放器
    Video.xaml

    <phone:PhoneApplicationPage 
        x:Class="Demo.Media.Video"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
        shell:SystemTray.IsVisible="True">
    
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <StackPanel Orientation="Vertical">
                <MediaElement x:Name="mediaElement" Source="Assets/Demo.mp4" AutoPlay="False" />
                
                <Button x:Name="btnPlay" Content="播放" Click="btnPlay_Click" />
                <Button x:Name="btnPause" Content="暂停" Click="btnPause_Click" />
    
                <TextBlock x:Name="lblStatus" />
            </StackPanel>
        </Grid>
    
    </phone:PhoneApplicationPage>

    Video.xaml.cs

    /*
     * MediaElement - 用于播放视频或音频,本地地址或远程地址均可
     *     支持的编码格式参见:http://msdn.microsoft.com/en-us/library/ff462087(v=vs.92)
     * 
     * MediaElement 的详细说明参见:http://www.cnblogs.com/webabcd/archive/2008/12/01/1344632.html
     * Launcher 方式参见:http://www.cnblogs.com/webabcd/archive/2012/06/14/2548776.html 中的 MediaPlayerLauncher
     */
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    
    namespace Demo.Media
    {
        public partial class Video : PhoneApplicationPage
        {
            public Video()
            {
                InitializeComponent(); 
                
                mediaElement.CurrentStateChanged += new RoutedEventHandler(mediaElement_CurrentStateChanged);
            }
    
            void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
            {
                // 显示 MediaElement 的当前状态
                lblStatus.Text = mediaElement.CurrentState.ToString();
            }
    
            private void btnPlay_Click(object sender, RoutedEventArgs e)
            {
                // 播放
                mediaElement.Play();
            }
    
            private void btnPause_Click(object sender, RoutedEventArgs e)
            {
                // 暂停
                mediaElement.Pause();
            }
        }
    }


    3、演示如何与 Windows Phone 的音乐和视频中心集成
    IntegrateWithTheMusicAndVideoHub.xaml

    <phone:PhoneApplicationPage 
        x:Class="Demo.Media.IntegrateWithTheMusicAndVideoHub"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
        shell:SystemTray.IsVisible="True">
    
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <StackPanel Orientation="Vertical">
                
                <TextBlock TextWrapping="Wrap">
                    <Run>本 app 会出现在“音乐视频中心”中的“应用程序”下</Run>
                    <LineBreak />
                    <Run>操作完成后,请去“音乐视频中心”看效果</Run>
                </TextBlock>
            
                <Button x:Name="btnNow" Content="设置“音乐视频中心”中的“正在播放磁贴”" Click="btnNow_Click" />
                <Button x:Name="btnRecent" Content="向“音乐视频中心”中的“历史记录”添加新的磁贴" Click="btnRecent_Click" />
                <Button x:Name="btnAcquired" Content="向“音乐视频中心”中的“最新上市”添加新的磁贴" Click="btnAcquired_Click" />
                
            </StackPanel>
        </Grid>
    
    </phone:PhoneApplicationPage>

    IntegrateWithTheMusicAndVideoHub.xaml.cs

    /*
     * 本例演示如何将 app 集成进“音乐视频中心”
     * 
     * MediaHistoryItem - 出现在“音乐视频中心”中的磁贴对象(包括“正在播放”,“历史记录”和“最新上市”)
     *     ImageStream - 磁贴上需要显示的背景图片流
     *     Title - 磁贴的标题
     *     PlayerContext - key/value 对集合,用户点击“历史记录”或“最新上市”中的某个磁贴会进入到 app 的主页面,同时也会将对应的 key/value 数据一同带过去,参见 MainPage.xaml.cs
     * 
     * MediaHistory - 管理 MediaHistoryItem 的类
     *     Instance - 获得 MediaHistory 实例
     *     NowPlaying - 指定“正在播放”对象,MediaHistoryItem 类型
     *     WriteRecentPlay(MediaHistoryItem item) - 在“历史记录”中增加一个指定的 MediaHistoryItem 对象
     *     WriteAcquiredItem(MediaHistoryItem item) - 在“最新上市”中增加一个指定的 MediaHistoryItem 对象
     *     
     * 
     * 注意:
     * 1、“正在播放”磁贴大小为 358 * 358,背景图不能大于 75 KB
     * 2、“历史记录”和“最新上市”磁贴大小为 173 * 173
     * 3、app 提交到商店审核时,如果认证程序检测到 app 调用了 MediaHistory 和 MediaHistoryItem,则此 app 就会出现在“音乐视频中心”的应用程序中
     * 4、出于测试目的,如果想在 app 提交商店前使其出现在“音乐视频中心”的应用程序中的话,需要修改 manifest,在 <App /> 中增加 HubType="1"
     * 5、MediaHistoryItem 的 PlayerContext 指定的 key/value 对集合是 MediaHistoryItem 的上下文数据,用户在“历史记录”或“最新上市”单击某个磁贴对象时,会跳转到 app 的主页面,同时将对应的 key/value 数据一同带过去,其可以在主页面通过 NavigationContext.QueryString[key] 获取到,参见 MainPage.xaml.cs
     */
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    
    using Microsoft.Devices;
    using System.IO;
    using System.Windows.Resources;
    using System.IO.IsolatedStorage;
    using Microsoft.Phone.BackgroundAudio;
    
    namespace Demo.Media
    {
        public partial class IntegrateWithTheMusicAndVideoHub : PhoneApplicationPage
        {
            public IntegrateWithTheMusicAndVideoHub()
            {
                InitializeComponent();
    
                PlayAudio();
            }
    
            // 播放一个音频
            private void PlayAudio()
            {
                // 由于播放本地音频时只能从独立存储中播放,所以此处把示例用音频文件从程序包中复制到独立存储
                using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (!storage.FileExists("SuperMario.mp3"))
                    {
                        StreamResourceInfo resource = Application.GetResourceStream(new Uri("Assets/SuperMario.mp3", UriKind.Relative));
    
                        using (IsolatedStorageFileStream file = storage.CreateFile("SuperMario.mp3"))
                        {
                            int chunkSize = 4096;
                            byte[] bytes = new byte[chunkSize];
                            int byteCount;
    
                            while ((byteCount = resource.Stream.Read(bytes, 0, chunkSize)) > 0)
                            {
                                file.Write(bytes, 0, byteCount);
                            }
                        }
                    }
                }
    
                BackgroundAudioPlayer.Instance.Play();
            }
    
            private void btnNow_Click(object sender, RoutedEventArgs e)
            {
                StreamResourceInfo sri = Application.GetResourceStream(new Uri("Assets/TileBackgroundRed.png", UriKind.Relative));
    
                MediaHistoryItem mediaHistoryItem = new MediaHistoryItem();
                mediaHistoryItem.ImageStream = sri.Stream;
                mediaHistoryItem.Title = "正在播放";
                mediaHistoryItem.PlayerContext.Add("keyNow", "正在播放的音乐");
                MediaHistory.Instance.NowPlaying = mediaHistoryItem;
            }
    
            private void btnRecent_Click(object sender, RoutedEventArgs e)
            {
                StreamResourceInfo sri = Application.GetResourceStream(new Uri("Assets/TileBackgroundGreen.png", UriKind.Relative));
    
                MediaHistoryItem mediaHistoryItem = new MediaHistoryItem();
                mediaHistoryItem.ImageStream = sri.Stream;
                mediaHistoryItem.Title = "最近播放";
                mediaHistoryItem.PlayerContext.Add("keyRecent", "最近播放的音乐");
                MediaHistory.Instance.WriteRecentPlay(mediaHistoryItem);
            }
    
            private void btnAcquired_Click(object sender, RoutedEventArgs e)
            {
                StreamResourceInfo sri = Application.GetResourceStream(new Uri("Assets/TileBackgroundBlue.png", UriKind.Relative));
    
                MediaHistoryItem mediaHistoryItem = new MediaHistoryItem();
                mediaHistoryItem.ImageStream = sri.Stream;
                mediaHistoryItem.Title = "最新上市";
                mediaHistoryItem.PlayerContext.Add("keyAcquired", "最新上市的音乐");
                MediaHistory.Instance.WriteAcquiredItem(mediaHistoryItem);
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    P4568 [JLOI2011]飞行路线 最短路+分层图
    虚树
    点分治
    P2157 [SDOI2009]学校食堂 状压DP
    P2767 树的数量 DP | 组合数学
    CF348D LGV引理
    LGV引理
    P3647 [APIO2014]连珠线 换根DP
    第3章 决策树
    USDT/BTC/ETC/HT的解释
  • 原文地址:https://www.cnblogs.com/webabcd/p/2598576.html
Copyright © 2020-2023  润新知