2010-01-27 2 views
1

Из аудиофайла я хочу, чтобы выставлять аудио на веб-странице, но между конкретным временем начала и остановки.Silverlight: выставлять аудио с конкретным временем старта и остановки

Скажем, у меня есть аудио-файл, который 45:30, к примеру, и я хочу, чтобы выставить его для потоковой передачи и загрузки между 7:25 и 8:30, но и между 6:20 и 9:27.

Что мне нужно сделать в срок специальных услуг, Silverlight-элементов управления и, возможно, некоторые выборки кода для этого.

Бонус-вопрос: Есть ли уже онлайн-сервис для этого?

ответ

2

Себ,

Я полагаю, что когда вы говорите, «разоблачить», что вы имеете в виду предложить управления аудио воспроизведения для этих суб-клипов.

Вот предложил шаг за шагом для построения Silverlight приложения, которое играет аудиофайл между началом и конечной точкой:

Шаг 1: Создайте пример приложение Silverlight с Visual Studio (File/Новый проект/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: Сложение и беги!

Приветствия, Джим McCurdy

Face To Face Software и YinYangMoney