Воспроизвести два звука одновременно - PullRequest
28 голосов
/ 05 июня 2011

Есть ли способ воспроизвести два звука одновременно?

Я знаю, что SoundPlayer не может этого сделать. Я не могу использовать SoundEffect, так как считаю, что это только часть XNA.

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

Ответы [ 5 ]

31 голосов
/ 05 июня 2011

Ссылка PresentationCore и WindowsBase и попробуйте это ...

var p1 = new System.Windows.Media.MediaPlayer();
p1.Open(new System.Uri(@"C:\windows\media\tada.wav"));
p1.Play();

// this sleep is here just so you can distinguish the two sounds playing simultaneously
System.Threading.Thread.Sleep(500);

var p2 = new System.Windows.Media.MediaPlayer();
p2.Open(new System.Uri(@"C:\windows\media\tada.wav"));
p2.Play();

EDIT Я получил пониженное голосование, вероятно, потому что на первый взгляд похоже, что он будет воспроизводить второй звук после того, как первый закончен. Это не так, они воспроизводятся окнами асинхронно. Спит, так что если вы тестируете этот код дословно, вы можете услышать звуки, играющие вместе, это не будет заметно без задержки, так как они - один и тот же звук.

Этот код демонстрирует два звука, воспроизводимых в отдельных потоках друг над другом, что бессмысленно, поскольку воспроизведение все равно не блокируется

new System.Threading.Thread(() => {
        var c = new System.Windows.Media.MediaPlayer();
        c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
        c.Play();
    }).Start();

System.Threading.Thread.Sleep(500);

new System.Threading.Thread(() => {
        var c = new System.Windows.Media.MediaPlayer();
        c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
        c.Play();
    }).Start();

http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.stop.aspx Класс также имеет элемент управления, необходимый для остановки воспроизведения

6 голосов
/ 05 июня 2011

Объект «MediaPlayer» не позволяет воспроизводить два звука одновременно, даже если вы создаете два экземпляра. Вам нужно будет принести в нативный Windows API "mciSendString".

    [DllImport("winmm.dll")]
    static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);

    public Form1()
    {
        InitializeComponent();

        mciSendString(@"open C:\Users\Jono\Desktop\applause.wav type waveaudio alias applause", null, 0, IntPtr.Zero);
        mciSendString(@"play applause", null, 0, IntPtr.Zero);

        mciSendString(@"open C:\Users\Jono\Desktop\foghorn.wav type waveaudio alias foghorn", null, 0, IntPtr.Zero);
        mciSendString(@"play foghorn", null, 0, IntPtr.Zero);

    }
1 голос
/ 06 июня 2011

отметьте PlaySound метод здесь http://msdn.microsoft.com/en-us/library/aa909766.aspx, и его флаг SND_ASYNC.

0 голосов
/ 02 февраля 2014

С http://alvas.net/alvas.audio,samples.aspx#sample7 и http://alvas.net/alvas.audio,samples.aspx#sample6

Player pl = new Player();
byte[] arr = File.ReadAllBytes(@"in.wav");
pl.Play(arr);
Player pl2 = new Player();
pl2.FileName = "123.mp3";
pl2.Play();

или микширование аудиоданных перед воспроизведением Как микшировать для микширования двух аудиофайлов ..

private void Mix(string outfile, string infile1, string infile2, int shiftSec)
{
    WaveReader wr1 = new WaveReader(File.OpenRead(infile1));
    WaveReader wr2 = new WaveReader(File.OpenRead(infile2));
    IntPtr format1 = wr1.ReadFormat();
    WaveFormat wf = AudioCompressionManager.GetWaveFormat(format1);
    WaveWriter ww = new WaveWriter(File.Create(outfile), AudioCompressionManager.FormatBytes(format1));
    byte[] data0 = wr1.ReadData(0, shiftSec);
    byte[] data1 = wr1.ReadData(shiftSec);
    byte[] data2 = wr2.ReadData();
    byte[] mixData = AudioCompressionManager.Mix(format1, data2, data1);
    ww.WriteData(data0);
    ww.WriteData(mixData);
    ww.Close();
    wr2.Close();
    wr1.Close();
}
0 голосов
/ 15 февраля 2013

Решение: Привет, я разрабатывал приложение WP8, и мне нужно было воспроизводить несколько звуков одновременно, упомянутые выше решения не работали для меня, поэтому я использовал фреймворк XNA.вот ссылка

http://msdn.microsoft.com/en-us/library/ff842408.aspx

, а затем воспроизводите ваши звуковые файлы, как это ...

SoundEffect Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream);
Sound.Play();

Для зацикливания ...

SoundEffectInstance Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream).CreateInstance();
Sound.IsLooped = true;
Sound.Play();

Примечание: файлы должны быть в формате ".wav" (PCM, 8 или 16-бит, от 8 кГц до 48 кГц, моно или стерео)

...