Воспроизведение списка аудиофайлов в последовательности

StackOverflow https://stackoverflow.com/questions/1959257

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Если список файлов исправлен, просто сделайте список воспроизведения и передайте его экземпляру MediaPlayer. Media Player принимает плейлист в формате .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#, он должен быть неуправляемым кодом). И используйте его вместо чтения файлов по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top