技术开发 频道

Silverlight 音频播放器

 【IT168技术文档】众所周知Silverlight2对于音视频媒体也提供了很好的支持,本篇就音频部分做一个播放器实例。

 本例实现的是播放器最基本的功能,大家可通过该例体会一下Silverlight2对音频的控制。

 本例参考自《Pro Silverlight 2 in C# 2008》CHAPTER 10 SOUND, VIDEO, AND DEEP ZOOM

 XAML Code:

 <UserControl x:Class="SilverlightApplication1.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,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,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 SilverlightApplication1

 {

 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();

 }

 }

 }

查看原文地址

0
相关文章