NАудио потоковая передача по сети

У меня есть приложение, которое воспроизводит некоторые mp3-файлы с помощью NAudio, и я потратил несколько дней, пытаясь отправить этот звук по сети на другой компьютер, но я не знаю, как лучше это сделать. Какие классы мне нужно использовать для доступа к буферу и как перестроить этот массив байтов для воспроизведения на удаленном компьютере? Что лучше, отправить mp3Frames, или может быть лучше отправить необработанные или PCM-данные?

Я действительно потерялся, любая помощь будет оценена по достоинству. Спасибо


person Thir    schedule 13.06.2011    source источник


Ответы (1)


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

Последний исходный код NAudio включает демонстрацию (в проекте NAudioDemo) воспроизведения интернет-радио в формате MP3. который покажет вам, как получать кадры MP3, распаковывать их и помещать в BufferedWaveProvider для воспроизведения. Я написал статью о том, как это работает, в моем блоге.

NAudioDemo также включает демонстрацию сетевого однорангового аудиочата, отправляющего звук с использованием сокетов UDP, хотя MP3 не используется для сжатия.

person Mark Heath    schedule 13.06.2011
comment
Спасибо, я думаю, что теперь это работает, но у меня все еще есть проблема. - person Thir; 14.06.2011
comment
Спасибо, я думаю, что теперь это работает, но у меня все еще есть проблема. Я читаю mp3 кадр за кадром, чтобы воспроизвести и отправить необработанные данные, но буфер быстро растет (это внутри цикла), и я получаю исключение полного буфера. Я пытался изменить размер буфера, но очевидно, что это не решение. Я пытался читать следующий кадр каждый раз, когда bufferedWaveProvider читает блок, но в этом случае у меня недостаточно данных в буфере, чтобы хорошо воспроизвести файл. (слишком медленно). Можете ли вы помочь мне с этим? Спасибо. - person Thir; 14.06.2011
comment
Быстрое и простое решение - просто выполните Thread.Sleep, когда в вашем буфереWaveProvider слишком много, и подождите, пока он не отключится. Лучшее решение, поставить MP3Frames в очередь. Затем другой поток отслеживает буферныйWaveProvider и, когда он становится низким, извлекает кадр MP3 из очереди, распаковывает его и вставляет в буферныйWaveProvider. - person Mark Heath; 14.06.2011
comment
Наконец, я решаю эту проблему, контролируя длину буфера с помощью простого оператора If перед добавлением байтов... Я думаю, что моя последняя проблема — это панорамирование звука, потому что я не использую WaveChannel, но я думаю, что смогу исправить это благодаря PanningSampleProvider. Еще раз спасибо! - person Thir; 14.06.2011