2009-12-24 1 views
0

Я столкнулся с ситуацией. Я пишу приложение Windows на C# .NET. Я хочу играть несколько WAV-файлов один за другим и делать это непрерывно.воспроизводит список аудиофайлов в последовательности

есть класс, который может это позволить? в противном случае, как бы это реализовать?

Я пробовал использовать MCI, и он работает, используя флаг уведомления и перехват сообщения MM_MCINOTIFY, но он довольно грязный и усложняет мой код.

ответ

0

Если список файлов фиксированы, то просто сделать список воспроизведения и передать его в экземпляр MediaPlayer. медиаплеер принимает плейлист в формате .m3u или .wvx.

Но если вам нужно динамически выбирать порядок файлов, один, если самый простой способ - использовать PlaySound(). Вы передаете ему отдельные имена файлов или указатели на волну данных в памяти (вы должны были бы маршалировать это на неуправляемую память). Либо выделите поток для звука, и попросите его просто вызвать PlaySound в цикле или использовать SND_ASYNC.

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

[DllImport("WinMM.dll")]  
public static extern bool PlaySound(string name, int hModule, int flags); 

// see mmsystem.h for these flags 
public int SND_SYNC  = 0x00000000; // don't return until playback is done 
public int SND_ASYNC  = 0x00000001; // play asynchronously  
public int SND_NODEFAULT = 0x00000002; // don't play the default sound if n 
public int SND_MEMORY = 0x00000004; // name is actual a pointer to a WAVEHEADER 
public int SND_LOOP  = 0x00000008; // loop the sound until next call to PlaySound (use with SND_ASYNC) 
public int SND_NOSTOP = 0x00000010; // don't stop any currently playing sound 
public int SND_FILENAME = 0x00020000; // name is a filename (it's a sound name otherwise) 
public int SND_NOSTOP = 0x00000010; // don't stop any currently playing sound 

Оба эти метода позволят вам смешивать файлы с разной глубиной бит и частотой дискретизации. Но они также будут помещать небольшое количество тишины между файлами. Если вам нужны переходы между файлами, которые будут бесшовными, вам нужно будет либо найти сторонний звуковой движок, либо бросить свой собственный.

Или вы можете написать считыватель потока файлов с несколькими волновыми файлами (на C++, а не на C# он должен быть неуправляемым кодом). И используйте его вместо стандартного .wav-файла для воспроизведения файлов в MediaPlayer.