自制Silverlight视频播放器(一)-VideoPlayer视频播放控件

  近期在赶一个客户的项目,采用Silverlight技术制作一个视频播放页面。目前版本基于SL 2 Beta 1开发,已初步完Demo版,现将开发所得经验分享如下:
  效果图:

(播放视频)



(鼠标放在缩略图上,显示相关说明)



(鼠标放在视频名称上,显示相关说明)



(点击缩略图视频“翻跟头”进入播放区)



(点击缩略图视频“翻跟头”进入播放区)


页面浏览:http://cms.huadublog.cn/VodSL/VodSLTestPage.html


SL自定义控件经验分享

1、VideoPlayer视频播放控件
  该控件主要功能有Play/Pause/Stop等,这些功能我认为比较简单,在此不提。主要说说如果通过Slider控件实现播放进度条的方法。
  首先创建MediaElement与Slider。
  然后分析下进度条的实现原理:
    A、如何实现Slider与播放进度的同步?答:为MediaElement设置TimelineMarker,将MarkerReached时修改Slider进度值。注意,一定要在MediaElement.MediaOpened事件中添加TimelineMarker。因为添加TimelineMarker要考虑影片的实际长度,比如说,如果想在Slider上设置100个点,那每一点代表的时间就是影片总长度的1/100。看看我的代码:

             this .slider.Minimum  =   0 ;
            
this .slider.Maximum  =   100 ;
            
double  seconds  =   this .mediaElement1.NaturalDuration.TimeSpan.TotalSeconds;
            
for  ( int  i  =  ( int ) this .slider.Minimum; i  <  ( int ) this .slider.Maximum; i ++ )
            
{
                TimelineMarker marker 
= new TimelineMarker();
                
double time = seconds / this.slider.Maximum * i;
                marker.Time 
= new TimeSpan(00, (int)time);
                marker.Text 
= "a";
                marker.Type 
= "Test";
                
this.mediaElement1.Markers.Add(marker);
            }

  在此需要注意的是,一定要设置marker.Type,否则您试试,一运行程序就崩溃了。呵呵。
  好了,接下来在MediaElement.MarkerReached事件中添加以下代码:

             double  time =  e.Marker.Time.TotalSeconds;
            
double  seconds =   this .mediaElement1.NaturalDuration.TimeSpan.TotalSeconds;
            
if  (seconds  <=   0 )
            
{
                
return;
            }

            
double  marker  =  (time  *   this .slider.Maximum  /  seconds);
            txtSlider.Text 
=  e.Marker.Time.Hours  +   " : "   +  e.Marker.Time.Minutes  +   " : "   +  e.Marker.Time.Seconds;
            
this .slider.Value  =  marker;

  在此,我们根据当前Marker的时间点与总时长算出播放时间占总时间的比例,然后计算出Slider当前应该的进度值。就OK了,如果要显示当前时长的话,只要txtSlider.Text = e.Marker.Time.Hours + ":" + e.Marker.Time.Minutes + ":" + e.Marker.Time.Seconds;即可。

  然后我们再实现进度条的拖拽功能。
  在Slider.ValueChanged事件中添加以下代码:

             double  seconds  =   this .mediaElement1.NaturalDuration.TimeSpan.TotalSeconds;
            
double  time  =  seconds  /   this .slider.Maximum  *   this .slider.Value;
            mediaElement1.Position 
=   new  TimeSpan( 0 0 ,( int ) time);

  一切搞定!
  不过细心的你可能会发现一个问题,那就是MediaElement.MarkerReaded可以改变Slider.Value,而Slider.Value的改变又会引发Slider.ValueChanged,该事件中又有MediaElement.Position=v,这又会引发MediaElement.MarkerReaded,呵呵,死循环吧,没关系,自己加一个信号变量就行了。这我不再详述了。
  

转载于:https://www.cnblogs.com/snowwolflibo/archive/2008/04/25/1170935.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值