воспроизведение списка аудиофайлов в последовательности - PullRequest
0 голосов
/ 24 декабря 2009

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

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

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

Ответы [ 2 ]

0 голосов
/ 25 декабря 2009

Если список файлов фиксированный, просто создайте список воспроизведения и передайте его экземпляру 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.

0 голосов
/ 24 декабря 2009
...