【问题标题】:UWP Metronome App - MediaPlayerElement transport controls and performanceUWP Metronome App - MediaPlayerElement 传输控制和性能
【发布时间】:2016-12-12 01:24:25
【问题描述】:

我决定创建一个节拍器应用程序。所以,我是一个“初学者”,我做这个项目的目的是为了更多地了解 OOP 和其他东西。 我的应用程序运行良好,但是,我仍然有一些问题(小问题)。

我已使用 MediaPlayerElement 播放声音滴答声。我不希望在执行过程中出现媒体传输控件,为此,我写了

mediaPlayer.MediaPlayer.SystemMediaTransportControls.IsEnabled = false;

但媒体传输控件仍然启用。

另一个问题是应用程序在PC上运行得很好(也许有更多的处理能力),但是在智能手机上,啊,不好用!当 BPM 较高(大于 190 或 200)时,应用程序无法正确播放声音,几乎一直滞后。代码如下:

玩家来源

class Player
{
    MediaPlayerElement mediaPlayer = new MediaPlayerElement();

    public void Init()
    {
        try
        {
            Uri src = new Uri("ms-appx:///Assets/beep.wav");
            mediaPlayer.Source = MediaSource.CreateFromUri(src);
            mediaPlayer.MediaPlayer.SystemMediaTransportControls.IsEnabled = false;
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine("Error!" + e);
        }
    }

    public void Play()
    {
        mediaPlayer.MediaPlayer.Play();
    }

    public Player()
    {
        Init();
    }
}

节拍器音源

class Metronome
{
    private Player player = new Player();


    private DispatcherTimer dispTimer = new DispatcherTimer();
    private double interval;

    public int Tempo { get; set; }  
    public bool IsActive { get; set; }  //returns the state

    private void Init()
    {
        interval = (double)60 / Tempo - 0.02;
        dispTimer.Tick += DispTimer_Tick;
        dispTimer.Interval = TimeSpan.FromSeconds(interval);
    }

    private void DispTimer_Tick(object sender, object e)
    {
        player.Play();
    }

    public void Start()
    {
        Init();
        dispTimer.Start();
        IsActive = true;
    }

    public void Stop()
    {
        dispTimer.Stop();
        IsActive = false;
    }
}

我有一个与 Tempo 属性关联的滑块,当用户按下开始按钮时,节拍器会播放声音。 这就像一个计时器,当达到指定的值时它会播放声音。

在计算机 (Core I3) 中,此应用程序最多使用 1.0% 的 CPU,我不知道智能手机 (Lumia 535) 中的 CPU 使用率。

** 我的 CPU 支持 VT-X,但我的芯片组不支持,所以,我尽我所能! :p

感谢您的帮助! :)

【问题讨论】:

    标签: c# performance audio uwp


    【解决方案1】:

    您可以使用 BackgroundMediaPlayer 来代替 MediaPlayer。

    Uri src = new Uri("ms-appx:///Assets/beep.wav");
    BackgroundMediaPlayer.Current.SetUriSource(src);
    

    另外... 每次 Init() 节拍器时,都会添加一个额外的事件处理程序。我假设您不是每次都创建一个新的节拍器这意味着当您单击开始,然后停止,然后重新开始时 - 每个滴答声都会调用 player.Play() 两次。这也是获得内存泄漏的好方法。我会取消订阅 Stop() 上的事件。更多关于 here (MSDN)。

    dispTimer.Tick -= DispTimer_Tick;
    

    祝你学习顺利。

    【讨论】:

    • 后台播放器运行良好,媒体传输控件被禁用。 SetUriSource 已过时”。应用程序在移动设备中的性能仍然相同,但我会为此搜索一些解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多