[源码下载]
稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement,开发一个简易版的全功能播放器
作者: webabcd
介绍
Silverlight 2.0 详解MediaElement:开发一个简易版的全功能播放器
MediaOpened - 当媒体被成功地打开时所触发的事件
MediaFailed - 当媒体未能被成功地打开时所触发的事件
CurrentStateChanged - 播放状态(CurrentState)发生改变时所触发的事件
DownloadProgressChanged - 下载进度(DownloadProgress)发生变化时所触发的事件
MediaEnded - 当媒体播放到末尾时所触发的事件
BufferingProgressChanged - 缓冲进度(BufferingProgress)发生变化时所触发的事件
Source - 需要播放的媒体地址
Stretch - 拉伸值
Autoplay - 是否自动播放媒体
CurrentState - 播放状态
position - 媒体的位置
DroppedFramesPerSecond - 媒体每秒正在丢弃的帧数
BufferingProgress - 缓冲进度
DownloadProgress - 下载进度
NaturalDuration - 媒体文件的时长
Volume - 音量大小
Balance - 音量平衡
BufferingTime - 需要缓冲的时间的长度
CurrentState - 播放状态
IsMuted - 是否静音
Play() - 播放媒体
Pause() - 暂停媒体的播放
Stop() - 停止媒体的播放
在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html
示例
VIDeoPlayer.xaml
< UserControl x:Class ="Silverlight20.VIDeo.VIDeoPlayer"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" > @H_403_85@
< StackPanel HorizontalAlignment ="left" > @H_403_85@
<!--
Source - 需要播放的媒体地址
Stretch - 拉伸值 [System.windows.Media.Stretch 枚举]。参见:本Demo的Shape/Shape.xaml
Autoplay - 是否自动播放媒体
--> @H_403_85@
< MediaElement x:name ="mediaElement"
WIDth ="400" Height ="200"
Source ="http://download.microsoft.com/download/2/0/5/205d8c39-3d55-4032-8195-7b0e6eda4cb6/WinVIDeo-SL-InstallExperIEnce.wmv"
Stretch ="Fill"
Autoplay ="False" > @H_403_85@
</ MediaElement > @H_403_85@
< button x:name ="play" Content ="播放" margin ="5" Click ="play_Click" /> @H_403_85@
< button x:name ="pause" Content ="暂停" margin ="5" Click ="pause_Click" /> @H_403_85@
< button x:name ="stop" Content ="停止" margin ="5" Click ="stop_Click" /> @H_403_85@
< button x:name ="mute" Content ="静音" margin ="5" Click ="mute_Click" /> @H_403_85@
< SlIDer x:name ="playSlIDer" Minimum ="0" Maximum ="1" margin ="5" tooltipService.tooltip ="播放进度" ValueChanged ="playSlIDer_ValueChanged" /> @H_403_85@
< SlIDer x:name ="volumeSlIDer" Minimum ="0" Maximum ="1" margin ="5" tooltipService.tooltip ="音量大小" ValueChanged ="volumeSlIDer_ValueChanged" /> @H_403_85@
< SlIDer x:name ="balanceSlIDer" Minimum ="-1" Maximum ="1" margin ="5" tooltipService.tooltip ="音量平衡" ValueChanged ="balanceSlIDer_ValueChanged" /> @H_403_85@
< TextBlock x:name ="lblPlayTime" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblVolume" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblBalance" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblDownloadProgress" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblBufferingProgress" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblDroppedFramesPerSecond" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblState" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblWIDth" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblHeight" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblTotalTime" margin ="5" /> @H_403_85@
< TextBlock x:name ="lblBufferingTime" margin ="5" /> @H_403_85@
</ StackPanel > @H_403_85@
</ UserControl > @H_403_85@
VIDeoPlayer.xaml.cs
using @H_403_85@ System;
using @H_403_85@ System.Collections.Generic;
using @H_403_85@ System.linq;
using @H_403_85@ System.Net;
using @H_403_85@ System.windows;
using @H_403_85@ System.windows.Controls;
using @H_403_85@ System.windows.documents;
using @H_403_85@ System.windows.input;
using @H_403_85@ System.windows.Media;
using @H_403_85@ System.windows.Media.Animation;
using @H_403_85@ System.windows.Shapes;
using @H_403_85@ System.windows.Threading;
namespace @H_403_85@ Silverlight20.VIDeo
@H_403_85@{
public@H_403_85@ partial@H_403_85@ class@H_403_85@ VIDeoPlayer : UserControl
@H_403_85@{
// 媒体的时长
@H_403_85@ private@H_403_85@ TimeSpan _duration;
private@H_403_85@ dispatcherTimer _timer @H_403_85@=@H_403_85@ new@H_403_85@ dispatcherTimer();
public@H_403_85@ VIDeoPlayer()
@H_403_85@{
InitializeComponent();
this@H_403_85@.Loaded @H_403_85@+=@H_403_85@ new@H_403_85@ RoutedEventHandler(VIDeoPlayer_Loaded);
/**//*
* MediaOpened - 当媒体被成功地打开时所触发的事件
* MediaFailed - 当媒体未能被成功地打开时所触发的事件
* CurrentStateChanged - 播放状态(CurrentState)发生改变时所触发的事件
* DownloadProgressChanged - 下载进度(DownloadProgress)发生变化时所触发的事件(当下载增加量大于等于 0.05 或下载进度增加到 1 时会触发此事件)
* MediaEnded - 当媒体播放到末尾时所触发的事件
* BufferingProgressChanged - 缓冲进度(BufferingProgress)发生变化时所触发的事件(当缓冲增加量大于等于 0.05 或缓冲进度增加到 1 时会触发此事件)
*/@H_403_85@
mediaElement.MediaOpened @H_403_85@+=@H_403_85@ new@H_403_85@ RoutedEventHandler(mediaElement_MediaOpened);
mediaElement.CurrentStateChanged @H_403_85@+=@H_403_85@ new@H_403_85@ RoutedEventHandler(mediaElement_CurrentStateChanged);
mediaElement.DownloadProgressChanged @H_403_85@+=@H_403_85@ new@H_403_85@ RoutedEventHandler(mediaElement_DownloadProgressChanged);
mediaElement.MediaEnded @H_403_85@+=@H_403_85@ new@H_403_85@ RoutedEventHandler(mediaElement_MediaEnded);
mediaElement.BufferingProgressChanged @H_403_85@+=@H_403_85@ new@H_403_85@ RoutedEventHandler(mediaElement_BufferingProgressChanged);
}@H_403_85@
voID@H_403_85@ VIDeoPlayer_Loaded(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// 每 500 毫秒调用一次指定的方法
@H_403_85@ _timer.Interval @H_403_85@=@H_403_85@ TimeSpan.FromMilliseconds(500@H_403_85@);
_timer.Tick @H_403_85@+=@H_403_85@ new@H_403_85@ EventHandler(_timer_Tick);
_timer.Start();
}@H_403_85@
voID@H_403_85@ _timer_Tick(object@H_403_85@ sender, EventArgs e)
@H_403_85@{
// CurrentState - 播放状态 [System.windows.Media.MediaElementState枚举]
// position - 媒体的位置(单位:秒)
@H_403_85@ if@H_403_85@ (mediaElement.CurrentState @H_403_85@==@H_403_85@ MediaElementState.Playing)
@H_403_85@{
lblPlayTime.Text @H_403_85@=@H_403_85@ string@H_403_85@.Format(
"{0}{1:00}:{2:00}:{3:00}"@H_403_85@,
"播放进度:"@H_403_85@,
mediaElement.position.Hours,
mediaElement.position.Minutes,
mediaElement.position.Seconds);
}@H_403_85@
// DroppedFramesPerSecond - 媒体每秒正在丢弃的帧数
@H_403_85@ lblDroppedFramesPerSecond.Text @H_403_85@=@H_403_85@ "每秒正在丢弃的帧数:"@H_403_85@ @H_403_85@+@H_403_85@ mediaElement.DroppedFramesPerSecond.ToString();
}@H_403_85@
voID@H_403_85@ mediaElement_BufferingProgressChanged(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// BufferingProgress - 缓冲进度(0 - 1 之间)
@H_403_85@ lblBufferingProgress.Text @H_403_85@=@H_403_85@ string@H_403_85@.Format(
"缓冲进度:{0:##%}"@H_403_85@,
mediaElement.BufferingProgress);
}@H_403_85@
voID@H_403_85@ mediaElement_MediaEnded(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
mediaElement.Stop();
}@H_403_85@
voID@H_403_85@ mediaElement_DownloadProgressChanged(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// DownloadProgress - 下载进度(0 - 1 之间)
@H_403_85@ lblDownloadProgress.Text @H_403_85@=@H_403_85@ string@H_403_85@.Format(
"下载进度:{0:##%}"@H_403_85@,
mediaElement.DownloadProgress);
}@H_403_85@
private@H_403_85@ voID@H_403_85@ mediaElement_MediaOpened(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
/**//*
* NaturalVIDeoWIDth - 媒体文件的宽
* NaturalVIDeoHeight - 媒体文件的高
* HasTimeSpan - 是否可取得媒体文件的时长
* NaturalDuration - 媒体文件的时长
* Volume - 音量大小(0 - 1 之间)
* Balance - 音量平衡(-1 - 1 之间)
* BufferingTime - 需要缓冲的时间的长度
*/@H_403_85@
lblWIDth.Text @H_403_85@=@H_403_85@ "媒体文件的宽:"@H_403_85@ @H_403_85@+@H_403_85@ mediaElement.NaturalVIDeoWIDth.ToString();
lblHeight.Text @H_403_85@=@H_403_85@ "媒体文件的高:"@H_403_85@ @H_403_85@+@H_403_85@ mediaElement.NaturalVIDeoHeight.ToString();
_duration @H_403_85@=@H_403_85@ mediaElement.NaturalDuration.HasTimeSpan @H_403_85@?@H_403_85@ mediaElement.NaturalDuration.TimeSpan : TimeSpan.FromMilliseconds(0@H_403_85@);
lblTotalTime.Text @H_403_85@=@H_403_85@ string@H_403_85@.Format(
"{0}{1:00}:{2:00}:{3:00}"@H_403_85@, "时长:"@H_403_85@,
_duration.Hours,
_duration.Minutes,
_duration.Seconds);
mediaElement.Volume @H_403_85@=@H_403_85@ 0.8@H_403_85@;
volumeSlIDer.Value @H_403_85@=@H_403_85@ 0.8@H_403_85@;
lblVolume.Text @H_403_85@=@H_403_85@ "音量大小:80%"@H_403_85@;
mediaElement.Balance @H_403_85@=@H_403_85@ 0@H_403_85@;
balanceSlIDer.Value @H_403_85@=@H_403_85@ 0@H_403_85@;
lblBalance.Text @H_403_85@=@H_403_85@ "音量平衡:0%"@H_403_85@;
mediaElement.BufferingTime @H_403_85@=@H_403_85@ TimeSpan.FromSeconds(30@H_403_85@);
lblBufferingTime.Text @H_403_85@=@H_403_85@ "缓冲长度:30秒"@H_403_85@;
}@H_403_85@
private@H_403_85@ voID@H_403_85@ mediaElement_CurrentStateChanged(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
/**//*
* CurrentState - 播放状态 [System.windows.Media.MediaElementState枚举]
* MediaElementState.Closed - 无可用媒体
* MediaElementState.opening - 尝试打开媒体(此时Play(),Pause(),Stop()命令会被排进队列,等到媒体被成功打开后再依次执行)
* MediaElementState.Buffering - 缓冲中
* MediaElementState.Playing - 播放中
* MediaElementState.Paused - 被暂停(显示当前帧)
* MediaElementState.Stopped - 被停止(显示第一帧)
*/@H_403_85@
lblState.Text @H_403_85@=@H_403_85@ "播放状态:"@H_403_85@ @H_403_85@+@H_403_85@ mediaElement.CurrentState.ToString();
}@H_403_85@
private@H_403_85@ voID@H_403_85@ play_Click(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// Play() - 播放媒体(在当前 position 处播放)
@H_403_85@ mediaElement.Play();
}@H_403_85@
private@H_403_85@ voID@H_403_85@ pause_Click(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// CanPause - 媒体是否可暂停
// Pause() - 暂停媒体的播放
@H_403_85@ if@H_403_85@ (mediaElement.CanPause)
mediaElement.Pause();
}@H_403_85@
private@H_403_85@ voID@H_403_85@ stop_Click(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// Stop() - 停止媒体的播放
@H_403_85@ mediaElement.Stop();
}@H_403_85@
voID@H_403_85@ mute_Click(object@H_403_85@ sender, RoutedEventArgs e)
@H_403_85@{
// IsMuted - 是否静音
@H_403_85@ if@H_403_85@ (mediaElement.IsMuted @H_403_85@==@H_403_85@ true@H_403_85@)
@H_403_85@{
mute.Content @H_403_85@=@H_403_85@ "静音"@H_403_85@;
mediaElement.IsMuted @H_403_85@=@H_403_85@ false@H_403_85@;
}@H_403_85@
else@H_403_85@
@H_403_85@{
mute.Content @H_403_85@=@H_403_85@ "有声"@H_403_85@;
mediaElement.IsMuted @H_403_85@=@H_403_85@ true@H_403_85@;
}@H_403_85@
}@H_403_85@
private@H_403_85@ voID@H_403_85@ playSlIDer_ValueChanged(object@H_403_85@ sender, RoutedPropertyChangedEventArgs@H_403_85@<double@H_403_85@>@H_403_85@ e)
@H_403_85@{
// CanSeek - 是否可以通过设置 position 来重新定位媒体
// position - 媒体的位置(单位:秒)
@H_403_85@ if@H_403_85@ (mediaElement.CanSeek)
@H_403_85@{
mediaElement.Pause();
mediaElement.position @H_403_85@=@H_403_85@ TimeSpan.FromSeconds(_duration.TotalSeconds @H_403_85@*@H_403_85@ playSlIDer.Value);
mediaElement.Play();
}@H_403_85@
}@H_403_85@
private@H_403_85@ voID@H_403_85@ volumeSlIDer_ValueChanged(object@H_403_85@ sender, RoutedPropertyChangedEventArgs@H_403_85@<double@H_403_85@>@H_403_85@ e)
@H_403_85@{
// Volume - 音量大小(0 - 1 之间)
@H_403_85@ mediaElement.Volume @H_403_85@=@H_403_85@ volumeSlIDer.Value;
lblVolume.Text @H_403_85@=@H_403_85@ string@H_403_85@.Format(
"音量大小:{0:##%}"@H_403_85@,
volumeSlIDer.Value);
}@H_403_85@
private@H_403_85@ voID@H_403_85@ balanceSlIDer_ValueChanged(object@H_403_85@ sender, RoutedPropertyChangedEventArgs@H_403_85@<double@H_403_85@>@H_403_85@ e)
@H_403_85@{
// Balance - 音量平衡(-1 - 1 之间)
@H_403_85@ mediaElement.Balance @H_403_85@=@H_403_85@ balanceSlIDer.Value;
lblBalance.Text @H_403_85@=@H_403_85@ string@H_403_85@.Format(
"音量平衡:{0:##%}"@H_403_85@,
balanceSlIDer.Value);
}@H_403_85@
}@H_403_85@
} @H_403_85@
OK
[源码下载] 总结
以上是内存溢出为你收集整理的稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器全部内容,希望文章能够帮你解决稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)