[索引页]
[×××]

稳扎稳打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
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() - 停止媒体的播放
                        mediaElement.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 来重新定位媒体
                        // 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(
                                "音量大小:{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
[×××]

转载于:https://blog.51cto.com/webabcd/343112

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

  1. 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 绑定数据到ListBox

    [索引页] [源码下载] 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 详解ListBox 作者:webabcd 介绍 Silverlight 2.0 详解DataG ...

  2. 稳扎稳打Silverlight(13) - 2.0交互之鼠标事件和键盘事件

    [索引页] [×××] 稳扎稳打Silverlight(13) - 2.0交互之鼠标事件和键盘事件 作者:webabcd 介绍 Silverlight 2.0 人机交互:响应用户的鼠标操作和键盘操作 ...

  3. 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape

    [索引页] [×××] 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape 作者:webabcd 介绍 Silverlight 2.0 图 ...

  4. 稳扎稳打Silverlight(33) - 3.0控件之AutoCompleteBox, DataPager

    [索引页] [源码下载] 稳扎稳打Silverlight(33) - 3.0控件之AutoCompleteBox, DataPager 作者:webabcd 介绍 Silverlight 3.0 控件 ...

  5. 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

    [索引页] [源码下载] 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool 作者:webabcd 介绍 S ...

  6. mysql 可视化安装教程,MySql Installer 8.0.18可视化安装教程图文详解

    一.MySql 8.0.18安装 1.百度搜索windows for mysql 2.选择MySQL :: Download MySQL Installer 3.选择下载第二(mysql-instal ...

  7. ASP.NET2.0 ReportingServices使用详解

    ASP.NET2.0 ReportingServices使用详解 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/          时间:2007.4.9 本文先做 ...

  8. Python Numpy多维数组.sum(axis=0/1/2...) 详解

    Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...

  9. WebRTC视频JitterBuffer详解

    WebRTC视频JitterBuffer详解 1 WebRTC版本 2 概要 3 JitterBuffer结构和基本流程 4 帧完整性 - PacketBuffer 4.1 包缓存 4.2 帧的开始和 ...

最新文章

  1. 多视图几何三维重建实战系列之R-MVSNet
  2. 国人如此浮躁为哪般? --- 我看2018年度AI圈八大造假事件华人独占6件
  3. 最小二乘法的本质原理
  4. python concat去除重复值语句_Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)...
  5. 命令行下一种新的加帐号的方法
  6. C++学习笔记:(六)public、protected、private继承详解
  7. eclipse显示行号和Tab、空格、回车
  8. bzoj1079 [SCOI2008]着色方案
  9. Poj2823 单调队列
  10. C语言贴图图片路径不对,backgroundImage 路径问题 vue 图片的引入方式
  11. Ubuntu系统安装及Gamit 的安装流程
  12. 小米4 miui6 android,小米4如何线刷MIUI6 小米4线刷MIUI6教程【图文步骤】
  13. excel使用教程_数据分析Excel必备技能:数据透视表使用教程
  14. 使用电子签章确立在线医疗电子病历的法律地位
  15. ps一点等于多少厘米_在ps中1厘米是多少像素
  16. wifi 验证加密 总结
  17. Android HorizontalScrollView和ScrollView 水平滚动 垂直滚动
  18. 《SSH框架》---SSH框架与框架
  19. 会声会影如何去除视频黑边
  20. 是面试官放水,还是公司实在是太缺人?这都没挂,字节原来这么容易进...

热门文章

  1. 外表加载oracle,opengauss外部表插件——oracle_fdw
  2. visual什么颜色好用_口红哪个牌子好用?浓郁显白的口红超合适你der
  3. 孔板流量计计算公式_带你全面了解各种流量计!
  4. 素数在c语言中怎么表示,请问素数怎么样表示
  5. python 无法初始化设备prn_彻底搞懂Python一切皆对象,面试必过
  6. 电脑打字学习_新手如何学会电脑打字 走上盲打之路
  7. android aes256加密算法,Android中AES256加密的实现
  8. postman测试websocket_还在手工写接口测试文档,已经out了
  9. 让代码不运行的快捷键html5,使用 vscode 实现写代码双手不用离开键盘
  10. 2012.4.17总结(一)