Что такое хороший инструмент для программного воспроизведения нескольких аудиофайлов одновременно на С#

Мне нужно что-то, что позволит моей программе одновременно воспроизводить несколько аудиофайлов (.wav и/или .mp3). Было бы идеально, если бы я мог просто передать путь к файлу некоторому методу, и он воспроизвел бы этот файл, не беспокоясь о каких-либо деталях.

Дополнительные требования:

1) Мне нужно иметь возможность программно запускать и останавливать воспроизведение любого аудиофайла в любое время.

2) Мне нужно знать, когда закончилось воспроизведение каждого аудиофайла (либо в ответ на событие, либо зная продолжительность звукового файла (сэмплы, секунды и т. д.) через какое-либо свойство)

3) Этот инструмент должен воспроизводить файлы .wav (и предпочтительно .mp3) любой длины/продолжительность.

4) Этот инструмент должен иметь возможность воспроизводить несколько аудиофайлов одновременно (желательно не менее 5 или 6 аудиофайлов одновременно).

Я уже пытался использовать SlimDX и SharpDX, но я не смог найти никакого способа программно определить, когда файл перестал воспроизводиться, или найти продолжительность (длину) файла.

РЕДАКТИРОВАТЬ:

Я верю, что нашел то, что искал! GStreamer, похоже, делает все, о чем я просил. http://www.gstreamer.com/


person Jackson Dean Goodwin    schedule 26.01.2013    source источник
comment
Какие исследования вы уже провели? Что вы пробовали? Вы проверили, задавал ли кто-нибудь этот вопрос в прошлом? (подсказка: около 3 или 4 из них за последнюю неделю для разных языков программирования) Я подозреваю, что ответ - нет, нет и нет соответственно. Вопросы без усилий, как правило, не длятся долго.   -  person marko    schedule 26.01.2013
comment
Вы можете улучшить свой вопрос, рассказав нам, что вы пробовали и что не сработало для вас (и почему это не сработало). Ваш вопрос должен стоять отдельно. В нынешнем виде ваш вопрос слишком широк и вряд ли потребует много ответов. Стоит прочитать FAQ, если вы еще этого не сделали.   -  person marko    schedule 26.01.2013
comment
Я нашел это! GStreamer кажется именно тем, что я искал. gstreamer.com   -  person Jackson Dean Goodwin    schedule 11.02.2013


Ответы (2)


Все звуковые API позволяют воспроизводить несколько файлов одновременно (микширование происходит за кулисами, вам не нужно об этом беспокоиться).

Собственные API:

  • waveOut* семейство функций, ACM для декомпрессии
  • DirectSound (воспроизведение)
  • DirectShow (декодирование, воспроизведение)
  • ВАСАПИ (воспроизведение)
  • Медиа Фонд

Или используйте оболочку NAudio for C# для упомянутого выше. Вы найдете несколько сообщений о NAudio прямо здесь, на StackOverflow, когда вам понадобятся определенные детали и фрагменты кода.

person Roman R.    schedule 26.01.2013

Общий ответ на этот вопрос (подходящий для большинства вопросов как воспроизвести несколько сэмплов одновременно в фреймворках/языке X) состоит в том, чтобы программно смешать файлы вместе.

Это имеет то преимущество, что дает вам полный контроль над запуском и остановкой отдельных аудиопотоков, а также над синхронизацией — что обычно очень сложно при использовании компонентов медиаплеера более высокого уровня.

К шагам для этого относятся:

  1. Загружать (и форматировать/декодировать) все аудио для вывода в буфер памяти
  2. Для каждого аудиофайла, воспроизводимого в данный момент времени, смешайте соответствующий образец из каждого файла, добавив их вместе.
  3. [Не всегда необходимо] настроить усиление результирующего семпла - обычно это деление на количество смешанных сэмплов
  4. Сохраните результат в другой буфер памяти

Теперь вы сократили свою проблему до одного аудиопотока для вывода. Скорее всего, вы используете API-интерфейсы вывода аудио вашего фреймворка, которые периодически запрашивают буфер сэмплов для вывода.

Если ваши аудиопотоки большие, проблема усложняется, так как вам нужно будет обрабатывать входные потоки понемногу.

person marko    schedule 26.01.2013
comment
Не могли бы вы показать мне пример этого? Могу ли я каким-то образом узнать, когда закончилось воспроизведение каждого аудиофайла, или, что еще лучше, узнать, как долго (сколько сэмплов, секунд и т. д.) длится каждый аудиофайл (чтобы я мог перекрывать последовательные аудиофайлы определенный процент)? - person Jackson Dean Goodwin; 26.01.2013
comment
Я добавил детали к своему вопросу. Это должно дать вам лучшее представление о том, что мне нужно. - person Jackson Dean Goodwin; 26.01.2013
comment
У меня нет примера на C#.NET (если бы это была iOS или MacOSX, вам бы повезло), но по остальным вопросам да - после декодирования файлов в буфер памяти вы точно знаете, как долго они в пробах - а значит время. Достижение перекрытия — это просто вопрос добавления нового файла в микс в нужном месте. - person marko; 26.01.2013
comment
Здесь стоит отметить, что вы можете создать граф DirectShow, включающий микшер из нескольких входных данных, буферизованных в памяти, но почти наверняка проще этого не делать! - person marko; 27.01.2013