1
從音頻文件我希望能夠在網頁上公開的音頻,但和停止時間。的Silverlight:公開與特定的起始音頻和停止特定的開始之間的時間
說我有一個音頻文件,該文件是45:30,例如,我要揭露它流媒體和下載7:25和之間 8:30,而且之間6:20和9:27。
我需要的特殊服務,Silverlight的控制和這個也許有些示例代碼長期的內容。
獎勵問題:是否已有在線服務?
從音頻文件我希望能夠在網頁上公開的音頻,但和停止時間。的Silverlight:公開與特定的起始音頻和停止特定的開始之間的時間
說我有一個音頻文件,該文件是45:30,例如,我要揭露它流媒體和下載7:25和之間 8:30,而且之間6:20和9:27。
我需要的特殊服務,Silverlight的控制和這個也許有些示例代碼長期的內容。
獎勵問題:是否已有在線服務?
勒布,
我認爲當你說「暴露」你的意思是爲那些子剪輯音頻播放控制。
下面是建議的步驟一步用於構建Silverlight應用程序,播放開始和結束點之間的音頻文件:
步驟1:創建使用Visual Studio樣品Silverlight應用程序(文件/新項目/ Silverlight應用程序
第2步:在新建項目創建,編輯MainPage.xaml中,然後將用戶控件的網格內的下面的代碼:
<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步:編譯和運行!
乾杯, 吉姆·麥柯迪