如何播放最后 x 秒的媒体文件
How to play last x seconds of media file
我需要播放最后 20 秒的音频文件。我尝试指定 Position
属性 of myMediaPlayer
,但是有问题。因为我尝试播放文件的最后几秒,所以我无法像这样设置 Position
属性 音频文件:
myMediaPlayer.Position = new TimeSpan(0, 0, 20);
我需要这样设置Position
属性
myMediaPlayer.Position = new TimeSpan(0, 0, DURATION_OF_FILE - 20);
音频文件持续时间的计算存在问题。首先,我不知道文件的持续时间,因此我尝试在 MediaOpened
事件处理程序中计算它。
void MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
_duration = myMediaElement.NaturalDuration.TimeSpan;
}
要调用MediaOpened
我需要开始播放音频文件,所以我被迫在构造函数中写:
// Just for MediaOpened call
myMediaElement.Play();
// I need not playing file right here, so I stop playing immediately
myMediaElement.Stop();
现在计算了持续时间,一切似乎都很好。但是在那个假的播放停止操作之后 myMediaPlayer
忽略了 Position
属性!无论 Position
设置如何,音频文件总是从头开始,从第一秒开始。
如何解决?
XAML:
<StackPanel>
<MediaElement Name="myMediaElement"
LoadedBehavior="Manual"/>
<Button Click="SeekToMediaPosition">Click</Button>
</StackPanel>
.cs
TimeSpan _duration;
public MainWindow()
{
InitializeComponent();
myMediaElement.Source = new Uri("D:/VS_Projects/WpfApplication1/WpfApplication1/Resources/Audio.mp3");
myMediaElement.MediaOpened += new System.Windows.RoutedEventHandler(MediaOpened);
myMediaElement.Play();
myMediaElement.Stop();
}
void MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
_duration = myMediaElement.NaturalDuration.TimeSpan;
}
private void SeekToMediaPosition(object sender, RoutedEventArgs args)
{
var test = (Int32)Math.Truncate(_duration.TotalSeconds) - 20;
TimeSpan ts = new TimeSpan(0, 0, test);
myMediaElement.Position = ts;
myMediaElement.Play();
}
不要做 myMediaElement.Stop();
,而是做 myMediaElement.Pause();
。
执行 Stop()
会重置播放器并且不允许您设置 Position
。高飞,我知道,但这就是它的工作原理。
将 UnloadedBehavior="Manual" 添加到媒体元素。希望有用
我需要播放最后 20 秒的音频文件。我尝试指定 Position
属性 of myMediaPlayer
,但是有问题。因为我尝试播放文件的最后几秒,所以我无法像这样设置 Position
属性 音频文件:
myMediaPlayer.Position = new TimeSpan(0, 0, 20);
我需要这样设置Position
属性
myMediaPlayer.Position = new TimeSpan(0, 0, DURATION_OF_FILE - 20);
音频文件持续时间的计算存在问题。首先,我不知道文件的持续时间,因此我尝试在 MediaOpened
事件处理程序中计算它。
void MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
_duration = myMediaElement.NaturalDuration.TimeSpan;
}
要调用MediaOpened
我需要开始播放音频文件,所以我被迫在构造函数中写:
// Just for MediaOpened call
myMediaElement.Play();
// I need not playing file right here, so I stop playing immediately
myMediaElement.Stop();
现在计算了持续时间,一切似乎都很好。但是在那个假的播放停止操作之后 myMediaPlayer
忽略了 Position
属性!无论 Position
设置如何,音频文件总是从头开始,从第一秒开始。
如何解决?
XAML:
<StackPanel>
<MediaElement Name="myMediaElement"
LoadedBehavior="Manual"/>
<Button Click="SeekToMediaPosition">Click</Button>
</StackPanel>
.cs
TimeSpan _duration;
public MainWindow()
{
InitializeComponent();
myMediaElement.Source = new Uri("D:/VS_Projects/WpfApplication1/WpfApplication1/Resources/Audio.mp3");
myMediaElement.MediaOpened += new System.Windows.RoutedEventHandler(MediaOpened);
myMediaElement.Play();
myMediaElement.Stop();
}
void MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
_duration = myMediaElement.NaturalDuration.TimeSpan;
}
private void SeekToMediaPosition(object sender, RoutedEventArgs args)
{
var test = (Int32)Math.Truncate(_duration.TotalSeconds) - 20;
TimeSpan ts = new TimeSpan(0, 0, test);
myMediaElement.Position = ts;
myMediaElement.Play();
}
不要做 myMediaElement.Stop();
,而是做 myMediaElement.Pause();
。
执行 Stop()
会重置播放器并且不允许您设置 Position
。高飞,我知道,但这就是它的工作原理。
将 UnloadedBehavior="Manual" 添加到媒体元素。希望有用