UWP Metronome App - MediaPlayerElement 传输控制和性能

Posted

技术标签:

【中文标题】UWP Metronome App - MediaPlayerElement 传输控制和性能【英文标题】:UWP Metronome App - MediaPlayerElement transport controls and performance 【发布时间】: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

感谢您的帮助! :)

【问题讨论】:

【参考方案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 已过时”。应用程序在移动设备中的性能仍然相同,但我会为此搜索一些解决方案。谢谢!

以上是关于UWP Metronome App - MediaPlayerElement 传输控制和性能的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UWP 视频 StorageFile 中保存 System.Media.DateEncoded

UWP 硬件视频解码 - DirectX12 与 Media Foundation

如何在没有拓扑的情况下将 Windows Media Foundation 与 UWP 结合使用

UWP 上的 Windows Media Foundation 是不是有重采样器?如果是这样,我该如何使用它?

UWP 重启App

通过 Xamarin 在 UWP 上使用文本转语音