微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight2 边学边练 之四 音频播放器

众所周知Silverlight2对于音视频媒体也提供了很好的支持,本篇就音频部分做一个播放器实例。
本例实现的是播放器最基本的功能,大家可通过该例体会一下Silverlight2对音频的控制。
本例参考自《Pro Silverlight 2 in C# 2008》CHAPTER 10 SOUND,VIDEO,AND DEEP ZOOM

先上个效果图看看:

2009-7-30-15.12.44

XAML Code:

<UserControl x:Class="MusicPlayer.Page"      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      Height="250" Width="200">      <Grid Margin="20">          <Grid.Background>              <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">                  <GradientStop Color="Gold" Offset="0"></GradientStop>                  <GradientStop Color="White" Offset="0.5"></GradientStop>                  <GradientStop Color="Gold" Offset="1"></GradientStop>              </LinearGradientBrush>          </Grid.Background>          <Grid.RowDeFinitions>              <RowDeFinition Height="Auto"></RowDeFinition>              <RowDeFinition Height="Auto"></RowDeFinition>              <RowDeFinition Height="Auto"></RowDeFinition>              <RowDeFinition Height="Auto"></RowDeFinition>              <RowDeFinition Height="Auto"></RowDeFinition>          </Grid.RowDeFinitions>            <!--媒体组件-->          <MediaElement x:Name="media" Autoplay="False" Source="test.mp3"                          MediaOpened="media_MediaOpened"                         MediaFailed="media_MediaFailed"                        MediaEnded="media_MediaEnded"                         CurrentStateChanged="media_CurrentStateChanged">          </MediaElement>          <StackPanel Orientation="Horizontal">              <!--播放键-->              <Button Click="cmdplay_Click" Padding="15" Margin="5">                  <StackPanel>                      <polygon Points="0,0 0,10 10,5" Fill="Green"></polygon>                  </StackPanel>              </Button>              <!--停止键-->              <Button Click="cmdstop_Click" Padding="15" Margin="5">                  <StackPanel>                      <Rectangle Height="10" Width="10" Fill="Red"></Rectangle>                  </StackPanel>              </Button>              <!--暂停键-->              <Button Click="cmdPause_Click" Padding="15" Margin="5">                  <StackPanel Orientation="Horizontal">                      <Rectangle Margin="1" Height="10" Width="3" Fill="Blue"></Rectangle>                      <Rectangle Margin="1" Height="10" Width="3" Fill="Blue"></Rectangle>                  </StackPanel>              </Button>          </StackPanel>            <Grid Grid.Row="1" Margin="0,10,0">              <Grid.RowDeFinitions>                  <RowDeFinition Height="Auto"></RowDeFinition>                  <RowDeFinition Height="Auto"></RowDeFinition>                  <RowDeFinition Height="Auto"></RowDeFinition>              </Grid.RowDeFinitions>              <Grid.ColumnDeFinitions>                  <ColumnDeFinition Width="Auto"></ColumnDeFinition>                  <ColumnDeFinition></ColumnDeFinition>              </Grid.ColumnDeFinitions>                <!--音量调节按钮-->              <TextBlock Margin="5" Text="Volume: "></TextBlock>              <Slider x:Name="sliderVolume" Grid.Column="1"  Minimum="0" Maximum="1" Value="0.5"                      ValueChanged="sliderVolume_ValueChanged"></Slider>              <!--平衡调节按钮-->              <TextBlock Grid.Row="1" Margin="5" Text="Balance: "></TextBlock>              <Slider x:Name="sliderBalance" Grid.Row="1" Grid.Column="1" Minimum="-1" Maximum="1"                      ValueChanged="sliderBalance_ValueChanged"></Slider>              <!--播放进度调节按钮-->              <TextBlock Grid.Row="2" Margin="5" Text="Seek To: "></TextBlock>              <Slider x:Name="sliderPosition" Minimum="0" Grid.Column="1" Grid.Row="2"                      ValueChanged="sliderPosition_ValueChanged"></Slider>              <!--播放进度条-->              <Slider x:Name="sliderPositionBackground" Minimum="0" Grid.Column="1" Grid.Row="2"                       IsHitTestVisible="False" Opacity="0.5">              </Slider>          </Grid>            <!--循环播放选项-->          <CheckBox x:Name="chkLoop" Grid.Row="2" Margin="5,5,5" Content="Loop"></CheckBox>          <!--静音选项-->          <CheckBox x:Name="chkMute" Grid.Row="3" Margin="5,0" Content="Mute" Click="chkMute_Click"></CheckBox>          <!--播放状态提示-->          <TextBlock x:Name="lblStatus" Grid.Row="4" Margin="10" HorizontalAlignment="Center"></TextBlock>      </Grid>  </UserControl>

C# Code:

using System;  using System.Collections.Generic;  using System.Windows;  using System.Windows.Controls;  using System.Windows.Media;  using System.Windows.Media.Animation;  using System.Windows.Threading;    namespace MusicPlayer  {      public partial class Page : UserControl      {          public Page()          {              InitializeComponent();              //设置计时器精确度              timer.Interval = TimeSpan.FromSeconds(0.1);              //装载计时器              timer.Tick += timer_Tick;          }            //停止播放          public void mediaStop()          {              //将进度调节按钮与进度条归零              sliderPosition.Value = 0;              sliderPositionBackground.Value = 0;              //停止播放              media.Stop();              timer.Stop();          }            private void timer_Tick(object sender,EventArgs e)          {              lblStatus.Text = media.Position.ToString().TrimEnd(new char[] { '0' });              //使播放进度条跟随播放时间移动              sliderPositionBackground.Value = media.Position.TotalSeconds;          }            //计时器          private dispatcherTimer timer = new dispatcherTimer();            //播放键          private void cmdplay_Click(object sender,RoutedEventArgs e)          {              //判断播放器是否处于暂停状态              if (sliderPositionBackground.Value != 0)              {                  //处于暂停状态则继续播放                  media.Position = TimeSpan.FromSeconds(sliderPositionBackground.Value);                  media.Play();                  timer.Start();              }              else              {                  //处于停止状态则开始播放                  media.Stop();                  media.Play();                  timer.Start();              }          }            //暂停键          private void cmdPause_Click(object sender,RoutedEventArgs e)          {              media.Pause();              timer.Stop();          }            //停止键          private void cmdstop_Click(object sender,RoutedEventArgs e)          {              mediaStop();          }                    //播放器打开          private void media_MediaOpened(object sender,RoutedEventArgs e)          {              media.Stop();              //将播放进度调节按钮和播放进度条的长度设为音频时长              sliderPosition.Maximum = media.NaturalDuration.TimeSpan.TotalSeconds;              sliderPositionBackground.Maximum = media.NaturalDuration.TimeSpan.TotalSeconds;          }            //播放进度调节按钮          private void sliderPosition_ValueChanged(object sender,RoutedEventArgs e)          {              //使进度条跟随调节按钮移动              sliderPositionBackground.Value = sliderPosition.Value;              //从调节位置播放              media.Stop();              media.Position = TimeSpan.FromSeconds(sliderPosition.Value);              media.Play();              timer.Start();          }            //音量调节按钮          private void sliderVolume_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e)          {              if (media != null) media.Volume = sliderVolume.Value;          }            //平衡调节按钮          private void sliderBalance_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e)          {              media.Balance = sliderBalance.Value;          }            //静音选项          private void chkMute_Click(object sender,RoutedEventArgs e)          {              media.IsMuted = (bool)chkMute.IsChecked;          }            //获取错误提示          private void media_MediaFailed(object sender,ExceptionRoutedEventArgs e)          {              lblStatus.Text = e.ErrorException.Message;          }            //播放结束          private void media_MediaEnded(object sender,RoutedEventArgs e)          {              //判断是否需要循环播放              if ((bool)chkLoop.IsChecked)              {                  //循环播放                  media.Position = TimeSpan.Zero;                  media.Play();              }              else              {                  //停止播放                  mediaStop();              }          }            //获取播放状态          private void media_CurrentStateChanged(object sender,RoutedEventArgs e)          {              //在Textblock中显示播放状态              lblStatus.Text = media.CurrentState.ToString();          }      }  }

::源代码下载::

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐