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





Поскольку вы сказали WMP, я предполагаю, что вопрос относится к попытке воспроизвести файл wav на машине с Windows. В противном случае этот ответ не имеет значения.
То, что вы хотите сделать, нетривиально. В проекте кода есть хорошая статья здесь, в которой описывается аудиомодель Windows. В нем описывается, как настроить аудиоустройство и как передавать данные в устройство для воспроизведения. Вам «просто» нужно предоставить данные, поступающие из вашего сокета, как данные для буферов воспроизведения. Но вот где вся сложная работа. Вы должны быть уверены, что
Это интересное упражнение. Но хитрый.
мое понимание прочитанного в эти дни воняет :-) Да, вы правы
Марк прав в том, что это сложная проблема. API waveOutXXXX очень древний (он предшествует Windows 95) и требует большего количества ошибок при кодировании, чем вы думаете. Вам будет легче взаимодействовать с API на C++, чем с C#. Просто убедитесь, что вы действительно хотите этим заниматься.
Если ваш поток имеет формат, отличный от данных файла WAV (например, MP3 или WMA), вам придется выполнить дополнительный шаг по декодированию данных в формат WAV и воспроизведению их с помощью waveOutXXXX API. Найти хороший компонент для декодирования MP3 сложнее, чем можно было бы ожидать - я думаю, это связано с ситуацией с лицензированием Fraunhofer (вы должны заплатить им, если каким-либо образом используете код MP3).
Я бы нашел готовый продукт для этого, если вам не нужен опыт обучения.
Марк прав в том, что это сложная проблема. Это может быть менее сложно, если вы используете DirectSound вместо waveOut. Вот статья при потоковой передаче волновых файлов с диска: потоковая передача из сети - это, по сути, тот же процесс. Убедитесь, что вы собрали достаточно данных из сети, прежде чем начать - вам понадобится больше, чем 2 буфера, упомянутых в статье.
Еще менее сложным было бы FMOD. Из Часто задаваемые вопросы:
Расширенные возможности Интернета
Поддержка форматов файлов: FMOD в настоящее время поддерживает широкий спектр форматов аудиофайлов. неполный список:
Я сказал: «Это для Windows в родном C++.», Так что я подумал, что достаточно откровенен :-)