2008-09-24 5 views
3

У меня есть сервер, который отправляет данные через сокет, данные - это wav-файл. Я могу легко записать данные на диск, а затем воспроизвести их в WMP, но я не знаю, как я могу воспроизвести его, когда я прочитал его из сокета. Является ли это возможным?потоковые wav-файлы

Бонусный вопрос: как бы я это сделал, если поток был в mp3 или в другом формате?

Это для окон в родном C++.

ответ

3

Поскольку вы сказали WMP, я предполагаю, что вопрос относится к попытке воспроизвести wav-файл на машине Windows. Если нет, этот ответ не имеет значения.

Что вы хотите сделать, это не тривиально. Существует хорошая статья here о проекте кода, описывающая аудиосистему Windows. В нем описано, как настроить аудиоустройство и как передавать данные в устройство для воспроизведения. Вам «просто» необходимо предоставить данные, поступающие из вашего сокета, в качестве данных для буферов воспроизведения. Но здесь все сложное дело. Вы должны быть уверены, что

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

Это интересное упражнение. Но сложно.

+0

Я сказал «это для окон в родной C++.», поэтому я думал, что я был достаточно четко :-) – gbjbaanb 2008-09-25 12:10:31

0

Значок права об этом является сложной проблемой. API-интерфейс waveOutXXXX является древним (он предшествует Windows 95) и требует более подверженного ошибкам кодирования, чем вы думаете. Вам будет проще взаимодействовать с API на C++, чем с C#. Просто убедитесь, что это то, что вы действительно хотите сделать.

Если ваш поток представляет собой какой-то формат, отличный от данных WAV-файла (например, MP3 или WMA), вам придется выполнить дополнительный этап декодирования данных в формате WAV и воспроизвести его с помощью API waveOutXXXX. Найти хороший компонент для декодирования MP3 сложнее, чем можно было ожидать - я думаю, что это связано с ситуацией лицензирования Fraunhofer (вы должны платить им, если используете какой-либо код MP3).

Я нашел бы готовый продукт, чтобы сделать это, если вы не хотите обучения.

1

Значок права об этом является сложной проблемой. Это может быть менее сложно, если вы используете DirectSound вместо waveOut. Here's an article на потоковых файлах с диска: потоковая передача из сети по существу является одним и тем же процессом. Перед запуском убедитесь, что вы собрали достаточно данных из сети - вам нужно больше, чем 2 буфера, упомянутых в статье.

Еще менее сложным будет FMOD. Из FAQ:

Расширенные возможности Интернет

  • Интернет потоковое аудио. Пользовательский интернет-потоковый код включен, что позволяет поддерживать бесшовную поддержку SHOUTcast, Icecast и HTTP.
  • Возможности загрузки. Побочный эффект модульной файловой системы FMOD, поддерживающий сетевые файлы, даже статические образцы может быть загружен из Интернета.

Поддержка формата файла: FMOD в настоящее время поддерживает широкий спектр форматов аудиофайлов. частичный список:

  • MP3 - (MPEG I/II Layer 3, в том числе поддержка VBR)
  • OGG - (Ogg формат Vorbis)
  • WAV - (файлы Microsoft Wave, inlcluding сжатые WAVs. PCM, MP3 и IMA ADPCM WAV сжатый