【问题标题】:Windows IoT Raspberry Pi 3 c# Audio Playback in Different PagesWindows IoT Raspberry Pi 3 c# 在不同页面中播放音频
【发布时间】:2017-09-26 18:10:23
【问题描述】:

我正在 Rasp Pi 3 上制作一个应用程序,我可以在其中触发“播放页面”上的一个按钮,以在页面中使用 MediaPlayer 激活音频播放。一旦我切换到另一个页面,音频将继续在后台播放,但是一旦我导航回“播放页面”,音频仍在播放,但由于我的 mediaPlayer = new MediaPlayer(); 我失去了对 MediaPlayer 的控制;线。如果它处于重复模式,我将无法停止播放并且如果我触发另一条消息,则新消息和现有消息将同时播放。

即使在页面之间切换时,如何确保一次只播放一个 MediaPlayer。 请帮忙。谢谢。

修改后的代码:

public sealed partial class MessagePage : Page
{

   private object syncObj = new object();

   public MessagePage()
       {
           this.InitializeComponent();
           startclock();

           this.Home.Click += Home_Click;
           this.Message.Click += Message_Click;

           //mediaPlayer = new MediaPlayer();
           mediaPlayer = this.GetInstance();

           //mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
           //mediaPlayer.MediaOpened += MediaPlayer_MediaOpened;
       }

    public MediaPlayer GetInstance()
       {
           lock (syncObj)
           {
               if (mediaPlayer == null)
               {
                   mediaPlayer = new MediaPlayer();
                   mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
                   mediaPlayer.MediaOpened += MediaPlayer_MediaOpened;
               }
           }

           return mediaPlayer;
       }
   }

旧代码:

public MessagePage()
    {
        this.InitializeComponent();
        startclock();

        this.Home.Click += Home_Click;
        this.Message.Click += Message_Click;

        mediaPlayer = new MediaPlayer();
        mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;

    }

private async void Btn_Click(object sender, RoutedEventArgs e)
    {
        StorageFolder externalDevices = KnownFolders.RemovableDevices;
        IReadOnlyList<StorageFolder> externalDrives = await externalDevices.GetFoldersAsync();
        StorageFolder usbStorage = externalDrives[0];

        if (usbStorage != null)
        {
            StorageFolder storageFolder = KnownFolders.RemovableDevices;
            StorageFile audioFile = await usbStorage.GetFileAsync("message1.mp3");
            mediaPlayer.Source = Windows.Media.Core.MediaSource.CreateFromStorageFile(audioFile);
            mediaPlayer.Play();
            TextBlock.Text = "Playing Message 1...";
        }
        else
        {
            TextBlock.Text = "No USB Storage Detected...";
        };
    }

【问题讨论】:

    标签: c# audio raspberry-pi3 audio-player windows-iot-core-10


    【解决方案1】:

    您需要在这里使用singleton pattern。单例模式是一种软件设计模式,它将类的实例化限制为一个对象。当需要一个对象来协调整个系统的动作时,这很有用。

        private static readonly object syncObj = new object(); 
    
        public MediaPlayer GetInstance()
        {
            lock (syncObj)
            {
                if (mediaPlayer == null)
                {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
                }
            }
    
            return mediaPlayer;
        }
    
        public MessagePage()
        {
            this.InitializeComponent();
            startclock();
    
            this.Home.Click += Home_Click;
            this.Message.Click += Message_Click;
    
            //mediaPlayer = new MediaPlayer();
            mediaPlayer = this.GetInstance();
    
        }
    

    【讨论】:

    • 谢谢。我会试试的。我很好奇使用 pivot 给出的结果几乎与 mediaplayer 声明不会像我的情况一样花费冲突?
    • 您好,我运行了代码,当我单击页面按钮时,它遇到了“异常用户未处理”,其中 lock(syncobj) - 值不能为空。我不明白。
    • 嗨 mylim,syncObj 应该是一个新对象。
    • 是的.. 我确实声明为新对象。我在下面发布了我的代码。我真的不明白出了什么问题。
    • 我认为您需要检查您的 message1.mp3 文件是否存在于您的存储中。我测试了代码,没问题。请确保 USB 存储和媒体文件正确。如有任何问题,请随时告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多