Silverlight的:公开具体的启动声音和停止时间具体、声音、时间、Silverlight

由网友(愛意隨風起)分享简介:从音频文件我希望能够揭露音频在网页上,但具体开始的时间和结束时间 From an audio-file I want to be able to expose audio on a webpage, but between specific start and stop times.说我有一个音频文件,该文件的 4...

从音频文件我希望能够揭露音频在网页上,但具体开始的时间和结束时间

From an audio-file I want to be able to expose audio on a webpage, but between specific start and stop times.

说我有一个音频文件,该文件的 45:30 的,例如,我要揭露它的流媒体和下载 7:25之间和 8:30 的,而且之间的 6:20 和 9:27 的。

Say I have a audio-file that is 45:30, for example, and I want to expose it for streaming and download between 7:25 and 8:30, but also between 6:20 and 9:27.

我需要做什么在特殊的服务条款 的Silverlight控件也许有些样品 - code 这一点。

What do I need in term of special services, Silverlight-controls and maybe some sample-code for this.

奖金-问题:是否已经有一个在线服务为这个

Bonus-question: Is there already an online-service for this?

推荐答案

勒布,

我认为当你说暴露你的意思是对于那些子剪辑提供了音频播放控制。

I assume that when you say "expose" that you mean offer audio play controls for those sub-clips.

下面是一个建议的一步一步建立一个Silverlight应用程序,扮演一个起点和终点之间的音频文件:

Here is a suggested step-by-step for building a Silverlight app that plays an audio file between a start and an end point:

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

Step 1: Create a sample Silverlight application with Visual Studio (File / New Project / Silverlight Application

第二步:在新创建的项目中,编辑MainPage.xaml中,然后将下面的code中的用户控件的网格内:

Step 2: In your newly create project, edit the MainPage.xaml, and place the following code inside the UserControl's 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>

第三步:编辑MainPage.cs,并与下面的code替换MainPage类:

Step 3: Edit the MainPage.cs, and replace the MainPage class with the following code:

 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;
   }
  }
 }

第四步:生成和运行

阅读全文

相关推荐

最新文章