几天发现MediaElement播放不了wav格式的音频文件,在网上找到一篇解决的文章:
本节学习Silverlight音频和视频,其中视频的时间线标记个人觉得很有用,我们可以在播放视频前,想在视频某个地方加入自己的东西(文本或动画、视频。。。)。可以用到TimelineMarker,加入时间线,当播放放到时间线时利用OnMarkerReached时间获取时间线来触发我们需要的操作(文本或动画、视频。。)
(1)前台代码
< UserControl x:Class ="MediaStudy.MainPage" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d ="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable ="d" d:DesignHeight ="300" d:DesignWidth ="400" > < Grid x:Name ="LayoutRoot" Background ="White" > < StackPanel Margin ="40" Width ="300" > < StackPanel Orientation ="Horizontal" > < TextBlock FontSize ="12" Foreground ="DarkGray" > Time: </ TextBlock > < TextBlock x:Name ="timeTextBlock" FontSize ="12" /> </ StackPanel > < StackPanel Orientation ="Horizontal" > < TextBlock FontSize ="12" Foreground ="DarkGray" > Type: </ TextBlock > < TextBlock x:Name ="typeTextBlock" FontSize ="12" /> </ StackPanel > < StackPanel Orientation ="Horizontal" > < TextBlock FontSize ="12" Foreground ="DarkGray" > Value: </ TextBlock > < TextBlock x:Name ="valueTextBlock" FontSize ="12" /> </ StackPanel > < StackPanel > < Button Click ="StopMedia" Grid.Column ="0" Grid.Row ="1" Content ="Stop" /> < Button Click ="PauseMedia" Grid.Column ="1" Grid.Row ="1" Content ="Pause" /> < Button Click ="PlayMedia" Grid.Column ="2" Grid.Row ="1" Content ="Play" /> </ StackPanel > <!-- The MediaElement has the MarkerReached event attached. --> < MediaElement x:Name ="myMediaElemnet" MarkerReached ="OnMarkerReached" HorizontalAlignment ="Left" Source ="thebutterflyandthebear.wmv" Width ="300" Height ="200" /> </ StackPanel > </ Grid > </ UserControl >
(2)后台代码如下
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; namespace MediaStudy{ // 音频视频 // (一)MediaElement 对象:向页面添加媒体的操作十分简单,只需将 MediaElement 添加到标记并为要播放的媒体提供统一资源标识符 (URI) // (1)AutoPlay:指定 MediaElement 是否应自动开始播放。默认值为 true。 // (2)IsMuted:指定 MediaElement 是否静音。true 值将使 MediaElement 静音。默认值为 false。 // (3)Stretch:指定如何拉伸视频以填充 MediaElement 对象。可能值为 None、Uniform、UniformToFill 和 Fill。默认值为 Fill。有关更多信息,请参见 Stretch 枚举。 // (4)Volume:指定介于 0 到 1 的 MediaElement 对象的音频音量值,1 表示最大音量。默认值为 0.5。 // (二)视频播放机:包括播放控制,进度/查找滑块以及全屏切换 // 1)TimelineMarker类时间线标记(同步点):与媒体文件中的特定点关联的元数据 // (1)通常是事先创建的,存储在媒体文件本身中 // (2)通常用于命名视频中的不同场景,允许用户查找所选位置或提供脚本提示 // (3)在播放期间当 MediaElement 到达某一时间线标记时,将引发 MarkerReached 事件。 // (4)TimelineMarker对象提供以下属性,用于描述时间、名称和值: // Time:指定到达标记的时间的 TimeSpan 结构。 // Type:指定标记类型的字符串。此值可以是用户定义的任意字符串。 // Text:指定标记值的字符串。此值可以是用户定义的任意字符串。 // (5)MediaElement 对象的 Markers 属性允许您访问存储在当前播放的媒体文件中的嵌入了标头的标记。还可以使用此属性添加新的时间线标记 // 定义媒体标记有二种方法方法: // a.使用某个编辑器(如 Windows Media 文件编辑器,作为 Windows Media Encoder 9 系统的一部分安装) // b.TimelineMarker 对象并通过 Markers 属性将这些对象添加到 MediaElement(这些时间线标记是临时的,如果加入新的媒体会丢失) // 2)MediaElement.Markers属性:获取与当前加载的媒体文件相关联的时间线标记的集合。 // (1)每次当此 MediaElement 打开一个新的源文件时,都会清除和重新填充此集合 // (2)并且仅当发生 MediaOpened 事件后此集合才被视为有效 public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); this .Loaded += new RoutedEventHandler(MainPage_Loaded); } void MainPage_Loaded( object sender, RoutedEventArgs e) { myMediaElemnet.AutoPlay = false ; myMediaElemnet.MediaOpened += new RoutedEventHandler(myMediaElemnet_MediaOpened); } // 添加新的时间线标记(并且仅当发生 MediaOpened 事件后此集合才被视为有效) void myMediaElemnet_MediaOpened( object sender, RoutedEventArgs e) { // 创建时间线 TimelineMarker temp = new TimelineMarker(); temp.Text = " 喜欢你 " ; temp.Time = new TimeSpan( 0 , 0 , 1 ); temp.Type = " 123 " ; TimelineMarker temp1 = new TimelineMarker(); temp1.Text = " 爱你 " ; temp1.Time = new TimeSpan( 0 , 0 , 2 ); temp1.Type = " 321 " ; // 将时间线通过Markers赋给MediaElement myMediaElemnet.Markers.Add(temp); myMediaElemnet.Markers.Add(temp1); } // 达某一时间线标记时,将引发 MarkerReached 事件 private void OnMarkerReached( object sender, TimelineMarkerRoutedEventArgs e) { timeTextBlock.Text = e.Marker.Time.Seconds.ToString(); typeTextBlock.Text = e.Marker.Type.ToString(); valueTextBlock.Text = e.Marker.Text.ToString(); } private void StopMedia( object sender, RoutedEventArgs e) { myMediaElemnet.Stop(); } private void PauseMedia( object sender, RoutedEventArgs e) { myMediaElemnet.Pause(); } private void PlayMedia( object sender, RoutedEventArgs e) { myMediaElemnet.Play(); } }}