代码之家  ›  专栏  ›  技术社区  ›  Seb Nilsson

Silverlight:使用特定的开始和停止时间公开音频

  •  1
  • Seb Nilsson  · 技术社区  · 15 年前

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

    假设我有一个音频文件 45时30分 例如,我想公开它 流媒体和下载 之间 7:25 8:30 ,但也介于 6:20 9:27 .

    我需要什么特别的 服务 , Silverlight控件 也许一些 样例代码 为此。

    红利问题 :是否已经有此在线服务?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Jim McCurdy    15 年前

    Seb

    我假设当你说“公开”时,你的意思是为这些子剪辑提供音频播放控制。

    下面是一个建议逐步构建在起点和终点之间播放音频文件的Silverlight应用程序的建议:

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

    步骤2: 在新创建的项目中,编辑mainpage.xaml,并将以下代码放入UserControl的网格中:

      <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 Software YinYangMoney

    推荐文章