Вопрос

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

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

Это для Windows на родном C ++.

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

Решение

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

То, что вы хотите сделать, не тривиально.Есть хорошая статья здесь в проекте code, который описывает аудиомодель Windows.В нем описывается, как настроить аудиоустройство и как передавать данные в устройство для воспроизведения.Вам "просто" нужно предоставить данные, поступающие из вашего сокета, в качестве данных для буферов воспроизведения.Но именно в этом и заключается вся сложная работа.Вы должны быть уверены, что

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

Это интересное упражнение.Но хитрый.

Другие советы

Марк прав насчет того, что это сложная проблема.Это может быть менее сложно, если вы используете DirectSound вместо WaveOut. Вот статья о потоковой передаче файлов wave с диска:потоковая передача из сети - это, по сути, тот же процесс.Перед началом работы убедитесь, что вы собрали достаточно данных из сети - вам понадобится больше, чем 2 буфера, упомянутых в статье.

Еще менее сложным было бы FMOD.Из самого Вопросы и ответы:

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

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

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

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

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

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

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

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