Воспроизведение списка аудиофайлов в последовательности
Я столкнулся с ситуацией. Я пишу приложение для Windows на C# .NET. Я хочу воспроизводить несколько файлов.wav один за другим и делать это непрерывно.
есть класс, который мог бы позволить это? в противном случае, как бы я это реализовал?
Я попытался использовать MCI, и он работает, используя флаг уведомления и перехват сообщения MM_MCINOTIFY, но это довольно грязно и усложняет мой код.
2 ответа
Если список файлов фиксирован, то просто создайте список воспроизведения и передайте его экземпляру 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.