Silverlight:具有特定开始和停止时间的音频

时间:2010-01-27 12:24:25

标签: .net silverlight streaming media

从音频文件中我希望能够在网页上公开音频,但在特定的开始和停止时间之间

假设我有一个 45:30 的音频文件,我希望在 7:25之间公开流媒体和下载 8:30 ,但 6:20 9:27 之间。

对于特殊的服务 Silverlight-controls 以及可能的示例代码,我需要什么呢?

加分问题:是否已有针对此的在线服务?

1 个答案:

答案 0 :(得分:2)

的Seb,

我认为当你说“曝光”时,你的意思是为这些子剪辑提供音频播放控制。

以下是构建Silverlight应用程序的建议步骤,该应用程序在起点和终点之间播放音频文件:

步骤1:使用Visual Studio创建示例Silverlight应用程序(文件/新项目/ Silverlight应用程序

第2步:在新创建的项目中,编辑MainPage.xaml,并将以下代码放在UserControl的Grid中:

  <StackPanel>
   <MediaElement x:Name="x_MediaElement" AutoPlay="False" Stretch="Uniform" CacheMode="BitmapCache" 
     MediaOpened="OnMediaOpened" MarkerReached="OnMarkerReached" MediaEnded="OnMediaEnded" CurrentStateChanged="OnMediaCurrentStateChanged"
     Source="http://www.shinedraw.com/wordpress/wp-content/uploads/AudioPlayer/littlewaltz.mp3" />

   <StackPanel Orientation="Horizontal">
    <Button x:Name="x_Play" Click="OnPlayClick" Content="Play" Height="20" Width="40" />
    <Button x:Name="x_Pause" Click="OnPauseClick" Content="Pause" Height="20" Width="40" />
    <Button x:Name="x_Stop" Click="OnStopClick" Content="Stop" Height="20" Width="40" />
    <Slider x:Name="x_Timeline" HorizontalAlignment="Stretch" Width="200" Maximum="1" Value="0" ValueChanged="OnTimelineValueChanged"/>
    <TextBlock x:Name="x_CurrentTime" Height="20" Width="75" TextAlignment="Right" HorizontalAlignment="Right" VerticalAlignment="Center" />
    <TextBlock Text="/" Height="20" VerticalAlignment="Center" />
    <TextBlock x:Name="x_TotalTime" Height="20" Width="75" VerticalAlignment="Center" />

    <ToggleButton x:Name="x_Mute" Click="OnMuteClick" Content="Mute" Height="20" Width="40" IsChecked="false" />

    <Slider x:Name="x_VolumeSlider" HorizontalAlignment="Stretch" Width="50" Maximum="1" 
      Value="{Binding ElementName=x_MediaElement, Mode=TwoWay, Path=Volume, UpdateSourceTrigger=Default}"/>
   </StackPanel>
  </StackPanel>

第3步:编辑MainPage.cs,并使用以下代码替换MainPage类:

 public partial class MainPage : UserControl
 {
  public MainPage()
  {
   InitializeComponent();
   CompositionTarget.Rendering += OnCompositionTargetRendering;
  }

  private void SetStart(TimeSpan timeStart)
  {
   x_MediaElement.Position = timeStart;
  }

  private void SetEnd(TimeSpan timeEnd)
  {
   if (x_MediaElement.Markers == null || x_MediaElement.Markers.Count == 0)
    x_MediaElement.Markers.Add(new TimelineMarker() { Time = timeEnd });
   else
    x_MediaElement.Markers[0].Time = timeEnd;
  }

  private bool _InTickEvent;

  private void OnPlayClick(object sender, RoutedEventArgs e)
  {
   SetStart(new TimeSpan(0,0,10));
   SetEnd(new TimeSpan(0,0,20));
   x_MediaElement.Play();
  }

  private void OnPauseClick(object sender, RoutedEventArgs e)
  {
   x_MediaElement.Pause();
  }

  private void OnStopClick(object sender, RoutedEventArgs e)
  {
   x_MediaElement.Stop();
  }

  private void OnMuteClick(object sender, RoutedEventArgs e)
  {
   x_MediaElement.IsMuted = (bool)x_Mute.IsChecked;
  }

  private void OnMediaOpened(object sender, RoutedEventArgs e)
  {
   x_TotalTime.Text = TimeSpanToString(x_MediaElement.NaturalDuration.TimeSpan);
  }

  private void OnMarkerReached(object sender, TimelineMarkerRoutedEventArgs e)
  {
   x_MediaElement.Stop();
  }

  private void OnMediaEnded(object sender, RoutedEventArgs e)
  {
   x_MediaElement.Stop();
  }

  private void OnTimelineValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  {
   if (_InTickEvent)
    return; // throw new Exception("Can't call Seek() now, you'll get an infinite loop");

   double percentComplete = x_Timeline.Value;
   TimeSpan duration = x_MediaElement.NaturalDuration.TimeSpan;
   int newPosition = (int)(duration.TotalSeconds * percentComplete);
   x_MediaElement.Position = new TimeSpan(0, 0, newPosition);
  }

  private void OnCompositionTargetRendering(object sender, EventArgs e)
  {
   _InTickEvent = true;

   TimeSpan duration = x_MediaElement.NaturalDuration.TimeSpan;
   if (duration.TotalSeconds != 0)
   {
    double percentComplete = (x_MediaElement.Position.TotalSeconds / duration.TotalSeconds);
    x_Timeline.Value = percentComplete;
    string text = TimeSpanToString(x_MediaElement.Position);
    if (x_CurrentTime.Text != text)
     x_CurrentTime.Text = text;
   }

   _InTickEvent = false;
  }

  private string TimeSpanToString(TimeSpan time)
  {
   return string.Format("{0:00}:{1:00}", (time.Hours * 60) + time.Minutes, time.Seconds);
  }

  private void OnMediaCurrentStateChanged(object sender, RoutedEventArgs e)
  {
   switch (x_MediaElement.CurrentState)
   {
    case MediaElementState.Buffering:
     break;
    case MediaElementState.Opening:
     break;
    case MediaElementState.Paused:
     break;
    case MediaElementState.Playing:
     break;
    case MediaElementState.Stopped:
     break;
   }
  }
 }

第4步:构建并运行!

干杯, 吉姆麦克库迪

Face To Face SoftwareYinYangMoney