c# - 使用 MediaElement 的 WPF 音频播放器有时会滞后

标签 c# wpf

这是音频播放器的源代码:

public partial class MainWindow : Window
{
    private DispatcherTimer timer;

    public MainWindow()
    {
        InitializeComponent();
        mPlayer.LoadedBehavior = MediaState.Manual;
        mPlayer.UnloadedBehavior = MediaState.Manual;
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(500);
        timer.Tick += timer_Tick;
        mPlayer.MediaOpened += mPlayer_MediaOpened;
    }

    void mPlayer_MediaOpened(object sender, RoutedEventArgs e)
    {
            TimeSpan ts = mPlayer.NaturalDuration.TimeSpan;
            SeekSlider.Maximum = ts.TotalSeconds;
    }

    void timer_Tick(object sender, EventArgs e)
    {
            SeekSlider.Value = mPlayer.Position.TotalSeconds;

    }

    private MediaElement mPlayer = new MediaElement();

    private void ButtonOpen_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            var ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == true)
            {
                timer.Start();
                mPlayer.Source = new Uri(ofd.FileName);
                mPlayer.Volume = VolumeSlider.Value;
                timer.Start();
                mPlayer.Play();
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    private void ButtonPlay_Click(object sender, RoutedEventArgs e)
    {
        mPlayer.Play();
        timer.Start();
    }

    private void ButtonPause_Click(object sender, RoutedEventArgs e)
    {
        mPlayer.Pause();
        timer.Stop();
    }

    private void ButtonStop_OnClick(object sender, RoutedEventArgs e)
    {
        timer.Stop();
        mPlayer.Stop();
    }

    private void SeekSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
            mPlayer.Position = TimeSpan.FromSeconds(SeekSlider.Value);
    }


    private void VolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
            mPlayer.Volume = VolumeSlider.Value;
    }
}

不知道为什么突然有延迟。请帮助我找到问题。 如果您认为 MediaElement 不适合播放不同类型的音频文件。请提出替代方案。

最佳答案

SeekSlider_ValueChanged 事件触发过于频繁。所以这造成了一些滞后。

所以我使用 Thumb.DragCompleted 事件解决了问题。之后播放就非常流畅了。

关于c# - 使用 MediaElement 的 WPF 音频播放器有时会滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18831631/

相关文章:

c# - LINQ 加入 2 个数据表并使用 SUM AND GROUP BY

c# - 如何在不影响格式的情况下附加 json 文件

wpf - 如何突出显示列表框中的匹配子字符串?

c# - if 语句的多个值

C# 开源 NMEA 解析器

MVVM场景中的WPF Datagrid自动滚动

WPF:选择动画的目标

c# - 密码框工具提示未出现

C#二叉搜索树

c# - 为标签分配系统图标