<a href="http://webabcd.blog.51cto.com/1787395/342790" target="_blank">[索引頁]</a>
<a href="http://down.51cto.com/data/100302">[源碼下載下傳]</a>
穩紮穩打Silverlight(18) - 2.0視訊之詳解MediaElement, 開發一個簡易版的全功能播放器
介紹
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 - 需要緩沖的時間的長度
IsMuted - 是否靜音
Play() - 播放媒體
Pause() - 暫停媒體的播放
Stop() - 停止媒體的播放
線上DEMO
<a href="http://webabcd.blog.51cto.com/1787395/342779">http://webabcd.blog.51cto.com/1787395/342779</a>
示例
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(
"{0}{1:00}:{2:00}:{3:00}",
"播放進度:",
mediaElement.Position.Hours,
mediaElement.Position.Minutes,
mediaElement.Position.Seconds);
}
// DroppedFramesPerSecond - 媒體每秒正在丢棄的幀數
lblDroppedFramesPerSecond.Text = "每秒正在丢棄的幀數:" + mediaElement.DroppedFramesPerSecond.ToString();
void mediaElement_BufferingProgressChanged(object sender, RoutedEventArgs e)
// BufferingProgress - 緩沖進度(0 - 1 之間)
lblBufferingProgress.Text = string.Format(
"緩沖進度:{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(
"下載下傳進度:{0:##%}",
mediaElement.DownloadProgress);
private void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
* NaturalVideoWidth - 媒體檔案的寬
* NaturalVideoHeight - 媒體檔案的高
* HasTimeSpan - 是否可取得媒體檔案的時長
* NaturalDuration - 媒體檔案的時長
* Volume - 音量大小(0 - 1 之間)
* Balance - 音量平衡(-1 - 1 之間)
* BufferingTime - 需要緩沖的時間的長度
lblWidth.Text = "媒體檔案的寬:" + mediaElement.NaturalVideoWidth.ToString();
lblHeight.Text = "媒體檔案的高:" + mediaElement.NaturalVideoHeight.ToString();
_duration = mediaElement.NaturalDuration.HasTimeSpan ? mediaElement.NaturalDuration.TimeSpan : TimeSpan.FromMilliseconds(0);
lblTotalTime.Text = string.Format(
"{0}{1:00}:{2:00}:{3:00}", "時長:",
_duration.Hours,
_duration.Minutes,
_duration.Seconds);
mediaElement.Volume = 0.8;
volumeSlider.Value = 0.8;
lblVolume.Text = "音量大小:80%";
mediaElement.Balance = 0;
balanceSlider.Value = 0;
lblBalance.Text = "音量平衡:0%";
mediaElement.BufferingTime = TimeSpan.FromSeconds(30);
lblBufferingTime.Text = "緩沖長度: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 = "播放狀态:" + 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() - 停止媒體的播放
void mute_Click(object sender, RoutedEventArgs e)
// IsMuted - 是否靜音
if (mediaElement.IsMuted == true)
mute.Content = "靜音";
mediaElement.IsMuted = false;
else
mute.Content = "有聲";
mediaElement.IsMuted = true;
private void playSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
// CanSeek - 是否可以通過設定 Position 來重新定位媒體
if (mediaElement.CanSeek)
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(
"音量大小:{0:##%}",
volumeSlider.Value);
private void balanceSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
// Balance - 音量平衡(-1 - 1 之間)
mediaElement.Balance = balanceSlider.Value;
lblBalance.Text = string.Format(
"音量平衡:{0:##%}",
balanceSlider.Value);
}
}
OK
<a href="http://down.51cto.com/data/100302" target="_blank">[源碼下載下傳]</a>
本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/343112,如需轉載請自行聯系原作者