2010-01-27 20 views
1

A partir d'un fichier audio, je souhaite pouvoir afficher l'audio sur une page Web, mais entre des heures de début et de fin spécifiques.Silverlight: Expose audio avec des heures de début et de fin spécifiques

Dire que j'ai un fichier audio qui est 45:30, par exemple, et je veux l'exposer pour streaming et téléchargement entre 07h25 et 08h30, mais aussi entre 6:20 et 9:27.

Que dois-je besoin en terme de services spéciaux , Silverlight contrôle et peut-être un exemple de code pour cela.

Bonus-question: Y a-t-il déjà un service en ligne pour cela?

Répondre

2

Seb,

Je suppose que lorsque vous dites « exposer » que vous entendez offrir des contrôles de lecture audio pour les sous-clips.

est ici une étape par étape proposée pour la construction d'une application Silverlight qui joue un fichier audio entre un début et un point final:

Étape 1: Créer un exemple d'application Silverlight avec Visual Studio (Fichier/Nouvelle demande de projet/Silverlight

Étape 2: Dans votre créer nouveau projet, modifier le MainPage.xaml, et placez le code suivant dans la grille du 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> 

Étape 3: Modifier les MainPage.cs, et remplacer la classe MainPage avec le code suivant:

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

Étape 4: Construire et exécuter!

Cheers, Jim McCurdy

Face To Face Software et YinYangMoney