Воспроизведение звуков в приложении WPF с помощью MediaPlayer - PullRequest
1 голос
/ 30 мая 2020

Я хотел воспроизводить звуки в приложении WPF с помощью MediaPlayer. Проблема в том, что я не могу использовать файл напрямую из файла ресурсов, например, в SoundPlayer

SoundPlayer player = new SoundPlayer(R.testSound);

Поэтому я использовал путь, чтобы звучать так:

mediaPlayer.Open(new Uri("../../Resources/testSound.wav", UriKind.Relative)); //working
mediaPlayer.Open(new Uri("pack://application:,,,/Resources/testSound.wav")); //not wroking

Есть ли возможность сделать это без относительного пути? Относительный путь - плохая идея?

1 Ответ

2 голосов
/ 01 июня 2020

Если вы зарегистрируетесь в событии MediaFailed, вы увидите, что оно возвращает сообщение, в котором говорится: «System.NotSupportedException: для носителей поддерживаются только URI пакетов сайта происхождения».

Решение

  1. Измените действие сборки testound.wav на «Содержимое» и «Всегда копировать». Это необходимо для решений на основе сайта происхождения.
  2. Используйте URI пакета «siteoforigin» вместо «application» при открытии медиаплеера. Вот рабочий код:
using System;
using System.Windows;
using System.Windows.Media;

namespace SoundTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        MediaPlayer mp;

        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                Console.WriteLine("Dispatcher called");
                mp = new MediaPlayer();
                mp.MediaOpened += Mp_MediaOpened;
                mp.MediaFailed += Mp_MediaFailed;
                mp.Open(new Uri("pack://siteoforigin:,,,/Resources/testsound.wav"));

            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.GetType()}: {ex.Message}\n{ex.StackTrace}");
            }
        }

        private void Mp_MediaFailed(object sender, ExceptionEventArgs e)
        {
            var ex = e.ErrorException;
            Console.WriteLine($"MEDIA FAILED: {ex.GetType()}: {ex.Message}\n{ex.StackTrace}");
        }

        private void Mp_MediaOpened(object sender, EventArgs e)
        {
            mp.Play();
            Console.WriteLine("Play called");
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...