稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器...

[索引页]
[源码下载]


稳扎稳打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://webabcd.blog.51cto.com/1787395/342779

示例
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
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using System.Windows.Threading; 
InBlock.gif 
InBlock.gif namespace Silverlight20.Video 
InBlock.gif
InBlock.gif         public partial  class VideoPlayer : UserControl 
InBlock.gif        { 
InBlock.gif                 // 媒体的时长 
InBlock.gif                 private TimeSpan _duration; 
InBlock.gif 
InBlock.gif                 private DispatcherTimer _timer =  new DispatcherTimer(); 
InBlock.gif 
InBlock.gif                 public VideoPlayer() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                         this.Loaded +=  new RoutedEventHandler(VideoPlayer_Loaded); 
InBlock.gif 
InBlock.gif                         /* 
InBlock.gif                         * MediaOpened - 当媒体被成功地打开时所触发的事件 
InBlock.gif                         * MediaFailed - 当媒体未能被成功地打开时所触发的事件 
InBlock.gif                         * CurrentStateChanged - 播放状态(CurrentState)发生改变时所触发的事件 
InBlock.gif                         * DownloadProgressChanged - 下载进度(DownloadProgress)发生变化时所触发的事件(当下载增加量大于等于 0.05 或下载进度增加到 1 时会触发此事件) 
InBlock.gif                         * MediaEnded - 当媒体播放到末尾时所触发的事件 
InBlock.gif                         * BufferingProgressChanged - 缓冲进度(BufferingProgress)发生变化时所触发的事件(当缓冲增加量大于等于 0.05 或缓冲进度增加到 1 时会触发此事件) 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                        mediaElement.MediaOpened +=  new RoutedEventHandler(mediaElement_MediaOpened); 
InBlock.gif                        mediaElement.CurrentStateChanged +=  new RoutedEventHandler(mediaElement_CurrentStateChanged); 
InBlock.gif                        mediaElement.DownloadProgressChanged +=  new RoutedEventHandler(mediaElement_DownloadProgressChanged); 
InBlock.gif                        mediaElement.MediaEnded +=  new RoutedEventHandler(mediaElement_MediaEnded); 
InBlock.gif                        mediaElement.BufferingProgressChanged +=  new RoutedEventHandler(mediaElement_BufferingProgressChanged); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void VideoPlayer_Loaded( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // 每 500 毫秒调用一次指定的方法 
InBlock.gif                        _timer.Interval = TimeSpan.FromMilliseconds(500); 
InBlock.gif                        _timer.Tick +=  new EventHandler(_timer_Tick); 
InBlock.gif                        _timer.Start(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void _timer_Tick( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                         // CurrentState - 播放状态 [System.Windows.Media.MediaElementState枚举] 
InBlock.gif                         // Position - 媒体的位置(单位:秒) 
InBlock.gif                         if (mediaElement.CurrentState == MediaElementState.Playing) 
InBlock.gif                        { 
InBlock.gif                                lblPlayTime.Text =  string.Format( 
InBlock.gif                                         "{0}{1:00}:{2:00}:{3:00}"
InBlock.gif                                         "播放进度:"
InBlock.gif                                        mediaElement.Position.Hours, 
InBlock.gif                                        mediaElement.Position.Minutes, 
InBlock.gif                                        mediaElement.Position.Seconds); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // DroppedFramesPerSecond - 媒体每秒正在丢弃的帧数 
InBlock.gif                        lblDroppedFramesPerSecond.Text =  "每秒正在丢弃的帧数:" + mediaElement.DroppedFramesPerSecond.ToString(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void mediaElement_BufferingProgressChanged( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // BufferingProgress - 缓冲进度(0 - 1 之间) 
InBlock.gif                        lblBufferingProgress.Text =  string.Format( 
InBlock.gif                                 "缓冲进度:{0:##%}"
InBlock.gif                                mediaElement.BufferingProgress); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void mediaElement_MediaEnded( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                        mediaElement.Stop(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void mediaElement_DownloadProgressChanged( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // DownloadProgress - 下载进度(0 - 1 之间) 
InBlock.gif                        lblDownloadProgress.Text =  string.Format( 
InBlock.gif                                 "下载进度:{0:##%}"
InBlock.gif                                mediaElement.DownloadProgress); 
InBlock.gif                } 
InBlock.gif                 private  void mediaElement_MediaOpened( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         /* 
InBlock.gif                         * NaturalVideoWidth - 媒体文件的宽 
InBlock.gif                         * NaturalVideoHeight - 媒体文件的高 
InBlock.gif                         * HasTimeSpan - 是否可取得媒体文件的时长 
InBlock.gif                         * NaturalDuration - 媒体文件的时长 
InBlock.gif                         * Volume - 音量大小(0 - 1 之间) 
InBlock.gif                         * Balance - 音量平衡(-1 - 1 之间) 
InBlock.gif                         * BufferingTime - 需要缓冲的时间的长度 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                        lblWidth.Text =  "媒体文件的宽:" + mediaElement.NaturalVideoWidth.ToString(); 
InBlock.gif                        lblHeight.Text =  "媒体文件的高:" + mediaElement.NaturalVideoHeight.ToString(); 
InBlock.gif 
InBlock.gif                        _duration = mediaElement.NaturalDuration.HasTimeSpan ? mediaElement.NaturalDuration.TimeSpan : TimeSpan.FromMilliseconds(0); 
InBlock.gif 
InBlock.gif                        lblTotalTime.Text =  string.Format( 
InBlock.gif                                 "{0}{1:00}:{2:00}:{3:00}""时长:"
InBlock.gif                                _duration.Hours, 
InBlock.gif                                _duration.Minutes, 
InBlock.gif                                _duration.Seconds); 
InBlock.gif 
InBlock.gif                        mediaElement.Volume = 0.8; 
InBlock.gif                        volumeSlider.Value = 0.8; 
InBlock.gif                        lblVolume.Text =  "音量大小:80%"
InBlock.gif 
InBlock.gif                        mediaElement.Balance = 0; 
InBlock.gif                        balanceSlider.Value = 0; 
InBlock.gif                        lblBalance.Text =  "音量平衡:0%"
InBlock.gif 
InBlock.gif                        mediaElement.BufferingTime = TimeSpan.FromSeconds(30); 
InBlock.gif                        lblBufferingTime.Text =  "缓冲长度:30秒"
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void mediaElement_CurrentStateChanged( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         /* 
InBlock.gif                         * CurrentState - 播放状态 [System.Windows.Media.MediaElementState枚举] 
InBlock.gif                         *         MediaElementState.Closed - 无可用媒体 
InBlock.gif                         *         MediaElementState.Opening - 尝试打开媒体(此时Play(),Pause(),Stop()命令会被排进队列,等到媒体被成功打开后再依次执行) 
InBlock.gif                         *         MediaElementState.Buffering - 缓冲中 
InBlock.gif                         *         MediaElementState.Playing - 播放中 
InBlock.gif                         *         MediaElementState.Paused - 被暂停(显示当前帧) 
InBlock.gif                         *         MediaElementState.Stopped - 被停止(显示第一帧) 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                        lblState.Text =  "播放状态:" + mediaElement.CurrentState.ToString(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void play_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // Play() - 播放媒体(在当前 Position 处播放) 
InBlock.gif                        mediaElement.Play(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void pause_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // CanPause - 媒体是否可暂停 
InBlock.gif                         // Pause() - 暂停媒体的播放 
InBlock.gif                         if (mediaElement.CanPause) 
InBlock.gif                                mediaElement.Pause(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void stop_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // Stop() - 停止媒体的播放 
InBlock.gif                        mediaElement.Stop(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void mute_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // IsMuted - 是否静音 
InBlock.gif                         if (mediaElement.IsMuted ==  true
InBlock.gif                        { 
InBlock.gif                                mute.Content =  "静音"
InBlock.gif                                mediaElement.IsMuted =  false
InBlock.gif                        } 
InBlock.gif                         else 
InBlock.gif                        { 
InBlock.gif                                mute.Content =  "有声"
InBlock.gif                                mediaElement.IsMuted =  true
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void playSlider_ValueChanged( object sender, RoutedPropertyChangedEventArgs< double> e) 
InBlock.gif                { 
InBlock.gif                         // CanSeek - 是否可以通过设置 Position 来重新定位媒体 
InBlock.gif                         // Position - 媒体的位置(单位:秒) 
InBlock.gif                         if (mediaElement.CanSeek) 
InBlock.gif                        { 
InBlock.gif                                mediaElement.Pause(); 
InBlock.gif                                mediaElement.Position = TimeSpan.FromSeconds(_duration.TotalSeconds * playSlider.Value); 
InBlock.gif                                mediaElement.Play(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void volumeSlider_ValueChanged( object sender, RoutedPropertyChangedEventArgs< double> e) 
InBlock.gif                { 
InBlock.gif                         // Volume - 音量大小(0 - 1 之间) 
InBlock.gif                        mediaElement.Volume = volumeSlider.Value; 
InBlock.gif                        lblVolume.Text =  string.Format( 
InBlock.gif                                 "音量大小:{0:##%}"
InBlock.gif                                volumeSlider.Value); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void balanceSlider_ValueChanged( object sender, RoutedPropertyChangedEventArgs< double> e) 
InBlock.gif                { 
InBlock.gif                         // Balance - 音量平衡(-1 - 1 之间) 
InBlock.gif                        mediaElement.Balance = balanceSlider.Value; 
InBlock.gif                        lblBalance.Text =  string.Format( 
InBlock.gif                                 "音量平衡:{0:##%}"
InBlock.gif                                balanceSlider.Value); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 



     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/343112 ,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值