Играть два звука совпала
есть ли способ играть два звука одновременно?
Я знаю, что SoundPlayer
не может этого сделать.
Я не могу использовать SoundEffect
поскольку я считаю, что это только часть XNA.
два необходимых звука будут вызываться в неизвестное и случайное время. Звук должен контролироваться после воспроизведения. то есть звук должен быть остановлен до того, как он закончит воспроизведение.
5 ответов
ссылка 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, вероятно, потому, что на первый взгляд это похоже на то, что он будет воспроизводить второй звук после завершения первого. Это не так, они воспроизводятся windows асинхронно. Сон есть, поэтому, если вы проверите этот код дословно, Вы можете услышать, как звуки играют вместе, это не будет заметно без задержки, так как они одинаковы.
этот код демонстрирует два звука, играющие на отдельных потоках друг над другом, что бессмысленно, так как воспроизведение все равно не блокируется
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 Класс также имеет элемент управления, необходимый для остановки воспроизведения
объект "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);
}
Регистрация PlaySound
метод здесь http://msdn.microsoft.com/en-us/library/aa909766.aspx, и его флаг SND_ASYNC
.
решение : Привет, Я разрабатывал приложение 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 кГц, моно или стерео) формат
от http://alvas.net/alvas.audio образцы.aspx#sample7 и http://alvas.net/alvas.audio образцы.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();
}