你的位置:首页 > 操作系统

[操作系统]windows phone媒体应用开发


  MediaElement 可以播放许多不同类型的音频和视频媒体。

  MediaElement 是一个可以在其表面显示视频的矩形区域,也可以播放音频。MediaElement 支持触控输入事件。 使用属性 Height 和 Width 可以指定视频显示图面的高度和宽度。为了获得最佳性能,应避免显式设置 MediaElement 的宽度和高度。而是将这些值保留为默认。 指定源之后,媒体将以其实际大小显示,布局将重新计算该大小。如果需要更改媒体显示的大小,最好使用媒体编码工具将媒体重新编码为所需大小。

  默认情况下,加载 MediaElement 对象后,将立即播放由 Source 属性定义的媒体。若要禁止媒体自动启动,需要将 AutoPlay 属性设置为 false。

  MediaElement 将具有为 0 的 ActualWidth 和 ActualHeight,直到它开始播放。如果您正侦听 MouseLeftButtonDown 事件以触发视频的启动,这可能导致后果。一种简单的解决方法是将 Rectangle 放在 MediaElement 后面,并将鼠标事件与 Rectangle 挂接。然后,将 MediaElement 上的 IsHitTestVisible 属性设置为 false。

使用 MediaElement API 播放视频文件

  使用 MediaElement API 播放本地视频文件的步骤:

    1.在 Visual Studio 中打开一个新的或现有的解决方案。

    2.在“解决方案资源管理器”中,右键单击您项目的名称,单击“添加”,然后单击“现有项”。

    3.导航到现有视频文件并将其添加到项目。在“属性”窗口中,将“生成操作”设置为“内容”。

    4.在 XAML 代码中设置媒体的路径,并设置是否自动播放。

  使用 MediaElement API 播放远程视频文件的步骤:

    1.在 Visual Studio 中打开一个新的或现有的解决方案。

    2.在 XAML 代码中设置媒体的路径,并设置是否自动播放。

    (注意:以上播放文件,视频必须使用支持的 Windows Phone 8 媒体编解码器中列出的编解码器进行编码。)

MediaElement 属性

  MediaElement 对象提供几个媒体特定的属性。下面的列表描述了常用的属性。

    1.AutoPlay:指定 MediaElement 是否应自动开始播放。默认值为 True。

    2.IsMuted:指定 MediaElement 是否静音。

    3.True 值将使 MediaElement 静音。默认值为 false。

    4.Stretch:指定如何拉伸视频以填充 MediaElement 对象。可能的值有 None、Uniform、UniformToFill 和 Fill。默认值为 Fill。

    5.Volume:指定介于 0 到 1 的 MediaElement 对象的音频音量值,1 表示最大音量。默认值为 0.5。

控制媒体播放

  可以使用 MediaElement 对象的 Play、Pause 和 Stop 方法来控制媒体播放。当 MediaElement 对象正在播放时,设备上的所有其他媒体播放将停止。

    下面例子是从网络上下载保存到本地,并进行播放:

      MainPage.xaml主要代码如下:

 1 <phone:PhoneApplicationPage.Resources> 2     <ControlTemplate x:Key="PlayButtonControlTemplate" TargetType="Button"> 3       <Grid> 4  5         <Image x:Name="image" Margin="12,8,13,8" Source="appbar.transport.play.rest.png" RenderTransformOrigin="0.648,0.536"> 6           <Image.RenderTransform> 7             <CompositeTransform/> 8           </Image.RenderTransform> 9         </Image>10       </Grid>11     </ControlTemplate>12     <ControlTemplate x:Key="PauseControlTemplate" TargetType="Button">13       <Grid>14         <Image Margin="8" Source="appbar.transport.pause.rest.png"/>15       </Grid>16     </ControlTemplate>17   </phone:PhoneApplicationPage.Resources>18 19   <!--LayoutRoot is the root grid where all page content is placed-->20   <Grid x:Name="LayoutRoot" Background="Transparent">21     <Grid.RowDefinitions>22       <RowDefinition Height="Auto"/>23       <RowDefinition Height="*"/>24     </Grid.RowDefinitions>25 26     <!--TitlePanel contains the name of the application and page title-->27     <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">28       <TextBlock x:Name="ApplicationTitle" Text="演示程序" Style="{StaticResource PhoneTextNormalStyle}"/>29       <TextBlock x:Name="PageTitle" Text="WebClicent下载" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>30     </StackPanel>31 32     <!--ContentPanel - place additional content here-->33     <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">34       <Rectangle Height="54" HorizontalAlignment="Left" Margin="39,0,0,83" Name="rectangle1" Stroke="#FFF5F2F2" StrokeThickness="1" VerticalAlignment="Bottom" Width="280" />35       <TextBlock Height="54" HorizontalAlignment="Left" Margin="408,470,0,0" Name="TextBlock1" Text="%" VerticalAlignment="Top" FontSize="32" Width="33" />36       <TextBlock Height="30" HorizontalAlignment="Left" Margin="39,434,0,0" Name="textBlock2" Text="下载进度:" VerticalAlignment="Top" />37       <Rectangle Height="54" HorizontalAlignment="Left" Margin="39,470,0,0" Name="DownProgressRectangle" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="160" Fill="#FFFCF2F2" />38       <MediaElement Height="278" HorizontalAlignment="Left" Margin="0,6,0,0" Name="mediaElement1" VerticalAlignment="Top" Width="450" />39       <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="0,344,0,0" Name="PlayButton" VerticalAlignment="Top" Width="160" Template="{StaticResource PlayButtonControlTemplate}" />40       <TextBlock FontSize="28" Height="54" HorizontalAlignment="Left" Margin="325,470,0,0" Name="DownProgressTextBlock" Text="0" VerticalAlignment="Top" Width="69" TextAlignment="Right" />41       <TextBlock Height="30" HorizontalAlignment="Left" Margin="186,366,0,0" Name="MesgTextBlock" Text="" VerticalAlignment="Top" Width="228" />42     </Grid>43   </Grid>

View Code

      MainPage.xaml.cs主要代码如下:

 1 namespace WebClientDownload 2 { 3   public partial class MainPage : PhoneApplicationPage 4   { 5     // 构造函数 6      public static string fileName = "01.wmv"; 7     8     public MainPage() 9     { 10       InitializeComponent(); 11       PlayButton.IsEnabled = false; 12       mediaElement1.Source = null; 13       this.DownProgressRectangle.Width = 0; 14       WebClient webclient = new WebClient(); 15       if (webclient.IsBusy) 16       { 17         webclient.CancelAsync(); 18       } 19       webclient.OpenReadCompleted += new OpenReadCompletedEventHandler(webclient_OpenReadCompleted); 20       webclient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webclient_DownloadProgressChanged); 21       //下载资源包 22       webclient.OpenReadAsync(new Uri("http://mschannel9.vo.msecnd.net/o9/mix/09/wmv/key01.wmv" + fileName, UriKind.RelativeOrAbsolute)); 23       PlayButton.Click += new RoutedEventHandler(PlayButton_Click); 24       //检测MediaElement播放状态 25       mediaElement1.CurrentStateChanged += new RoutedEventHandler(mediaElement1_CurrentStateChanged); 26     } 27     //播放状态 28     void mediaElement1_CurrentStateChanged(object sender, RoutedEventArgs e) 29     { 30       switch (mediaElement1.CurrentState.ToString()) 31       { 32         case "Opening": 33           PlayButton.Template = Resources["PlayButtonControlTemplate"] as ControlTemplate; 34           MesgTextBlock.Text = "正准备播放"; 35           break; 36         case "Playing": 37           PlayButton.Template = Resources["PauseControlTemplate"] as ControlTemplate; 38           MesgTextBlock.Text = "播放中..."; 39           break; 40         case "Paused": 41           PlayButton.Template = Resources["PlayButtonControlTemplate"] as ControlTemplate; 42           MesgTextBlock.Text = "暂停..."; 43           break; 44         case "Stopped": 45           PlayButton.Template = Resources["PlayButtonControlTemplate"] as ControlTemplate; 46           MesgTextBlock.Text = "已经播放完毕"; 47           break; 48       } 49     } 50     //下载进度 51     void webclient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 52     { 53       this.DownProgressRectangle.Width = e.ProgressPercentage * 2.8; 54       this.DownProgressTextBlock.Text = e.ProgressPercentage.ToString(); 55     } 56     //下载完成 57     void webclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 58     { 59       using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication()) 60       { 61         if (file.FileExists(fileName)) 62         { 63           file.DeleteFile(fileName); 64  65         } 66         else 67         { 68           IsolatedStorageFileStream cFileStream = file.CreateFile(fileName); 69           //关闭文件流 70           cFileStream.Close(); 71  72         } 73         //将文件保存到IsolatedStorage 74         using (IsolatedStorageFileStream FileStream = file.OpenFile(fileName, FileMode.Create, FileAccess.ReadWrite)) 75         { 76  77           byte[] bytesInStream = new byte[e.Result.Length]; 78           e.Result.Read(bytesInStream, 0, (int)bytesInStream.Length); 79           FileStream.Write(bytesInStream, 0, bytesInStream.Length); 80           FileStream.Flush(); 81         } 82       } 83       //将数据流读出 84       using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication()) 85       { 86         using (IsolatedStorageFileStream FileStream = file.OpenFile(fileName, FileMode.Open, FileAccess.ReadWrite)) 87         { 88           mediaElement1.SetSource(FileStream); 89         } 90       } 91       PlayButton.IsEnabled = true; 92     } 93  94     void PlayButton_Click(object sender, RoutedEventArgs e) 95     { 96  97       if (mediaElement1.CurrentState.ToString() != "Playing") 98       { 99 100         mediaElement1.Play();101       }102       else103       {104 105         mediaElement1.Pause();106       }107     }108 109   }

View Code