天天看點

穩紮穩打Silverlight(18) - 2.0視訊之詳解MediaElement, 開發一個簡易版的全功能播放器

<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

&lt;UserControl x:Class="Silverlight20.Video.VideoPlayer" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&gt; 

        &lt;StackPanel HorizontalAlignment="Left"&gt; 

                &lt;!-- 

                Source - 需要播放的媒體位址 

                Stretch - 拉伸值 [System.Windows.Media.Stretch 枚舉]。參見:本Demo的Shape/Shape.xaml 

                AutoPlay - 是否自動播放媒體 

                --&gt; 

                &lt;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"&gt; 

                &lt;/MediaElement&gt; 

                &lt;Button x:Name="play" Content="播放" Margin="5" Click="play_Click" /&gt; 

                &lt;Button x:Name="pause" Content="暫停" Margin="5" Click="pause_Click" /&gt; 

                &lt;Button x:Name="stop" Content="停止" Margin="5" Click="stop_Click" /&gt; 

                &lt;Button x:Name="mute" Content="靜音" Margin="5" Click="mute_Click" /&gt; 

                &lt;Slider x:Name="playSlider" Minimum="0" Maximum="1" Margin="5" ToolTipService.ToolTip="播放進度" ValueChanged="playSlider_ValueChanged" /&gt; 

                &lt;Slider x:Name="volumeSlider" Minimum="0" Maximum="1" Margin="5" ToolTipService.ToolTip="音量大小" ValueChanged="volumeSlider_ValueChanged" /&gt; 

                &lt;Slider x:Name="balanceSlider" Minimum="-1" Maximum="1" Margin="5" ToolTipService.ToolTip="音量平衡" ValueChanged="balanceSlider_ValueChanged" /&gt; 

                &lt;TextBlock x:Name="lblPlayTime" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblVolume" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblBalance" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblDownloadProgress" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblBufferingProgress" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblDroppedFramesPerSecond" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblState" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblWidth" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblHeight" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblTotalTime" Margin="5" /&gt; 

                &lt;TextBlock x:Name="lblBufferingTime" Margin="5" /&gt; 

        &lt;/StackPanel&gt; 

&lt;/UserControl&gt;

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&lt;double&gt; e) 

                        // CanSeek - 是否可以通過設定 Position 來重新定位媒體 

                        if (mediaElement.CanSeek) 

                                mediaElement.Position = TimeSpan.FromSeconds(_duration.TotalSeconds * playSlider.Value); 

                                mediaElement.Play(); 

                private void volumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs&lt;double&gt; e) 

                        // Volume - 音量大小(0 - 1 之間) 

                        mediaElement.Volume = volumeSlider.Value; 

                        lblVolume.Text = string.Format( 

                                "音量大小:{0:##%}", 

                                volumeSlider.Value); 

                private void balanceSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs&lt;double&gt; 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,如需轉載請自行聯系原作者

繼續閱讀