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

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

概述[索引页] [源码下载] 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器 作者: webabcd 介绍 Silverlight 2.0 详解MediaElement:开发一个简易版的全功能播放器     MediaOpened - 当媒体被成功地打开时所触发的事件     MediaFailed - 当媒体未能被成功地打开时所触 [索引页]
[源码下载]


稳扎稳打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, 开发一个简易版的全功能播放器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1052445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存