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