Подтвердить что ты не робот

Воспроизведение двух звуков одновременно

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

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

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

4b9b3361

Ответ 1

Ссылка 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();

ИЗМЕНИТЬ Вероятно, я получил downvote, потому что на первый взгляд похоже, что он будет воспроизводить второй звук после завершения первого. Это не так, они играют асинхронно. Сон там, поэтому, если вы проверите этот код дословно, вы можете услышать, как звуки воспроизводятся вместе, это не будет заметно без задержки, так как они являются одним и тем же звуком.

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

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 У класса также есть контроль, необходимый для остановки воспроизведения.

Ответ 2

Объект "MediaPlayer" не позволяет воспроизводить сразу два звука, даже если вы создаете два экземпляра. Вам нужно будет принести собственный API-интерфейс windows "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);

    }

Ответ 4

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

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

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

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 кГц, моно или стерео)

Ответ 5

От 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();
}