Как транслировать полуживой звук через Интернет
-
23-08-2019 - |
Вопрос
Я хочу написать что-то вроде Skype, т.е.У меня есть постоянный аудиопоток на одном компьютере, а затем повторно сжимать его в формате, подходящем для скрытого подключения к Интернету, получите его на другом конце и воспроизведите.
Предположим также, что подключение к Интернету достаточно современное и быстрое, т.е.DSL или что-то подобное, никаких медленных соединений по телефону и тому подобное.Используемые компьютеры также будут довольно современными (двухъядерные процессоры Intel с частотой 2 ГГц или выше).
Я знаю, как обращаться со звуком на машинах.Чего я не знаю, так это того, как эффективно передавать звук.
Проблемы заключаются в следующем:
Я хотел бы получить хорошее качество звука по всей линии.
Поток должен приниматься без перепадов.Однако поток может быть принят с небольшой задержкой (допускается вторая задержка).Я предполагаю, что транспортное программное обеспечение могло бы сначала определить среднюю (и максимальную) задержку, затем запустить поток и сказать получателю дождаться этой максимальной задержки, прежде чем начать воспроизведение звука.При этом, если задержка не увеличится, весь поток будет воспроизводиться на другой стороне без заиканий и падений.
Если из-за непредвиденных задержек IP или блокировок поток делает быть отрезанным, я хочу иметь возможность заметить это, чтобы иметь возможность предпринять действия (например,прервать поток) и в конечном итоге начать новую передачу.
Какие у меня есть варианты, если я хочу использовать готовое программное обеспечение для сжатия и передачи?На самом деле у меня нет намерения писать свой собственный движок сжатия звука.OTOH, я планирую продавать решение на вертикальном рынке, то есть я могу позволить себе несколько долларов лицензионных сборов за копию, но не 100 долларов.
Я предполагаю, что самым простым решением было бы просто открыть поток TCP, отправить несколько пакетов туда и обратно, чтобы определить время их выполнения (или даже использовать для этого UDP), затем использовать результаты в качестве ориентира для моего максимального значения задержки, а затем просто передать аудиоданные в необработанном виде (несжатое 16-битное стерео) вместе с временным кодом через TCP-соединение.Приемник считывает данные и воспроизводит их с заранее заданной задержкой.Это может сработать с тем типом быстрого соединения, который я ожидаю.
Мне просто интересно, есть ли лучшие решения для достижения этой цели с лучшей производительностью (меньшая задержка) и меньшим объемом данных (сжатие).
Кстати, сначала я пытаюсь реализовать это в OS X, но, возможно, захочу сделать это и в Windows, если это окажется успешным.
Решение
Для передачи звука через Интернет вам, вероятно, следует рассмотреть возможность использования RTP.Он используется для SIP, H.323 и многих других для потоковой передачи аудиоконтента.Возможно, вы даже захотите просто использовать библиотеку SIP.В нем уже есть многое из того, что вам нужно. ГЛОТОК может иметь довольно хорошее качество, если у вас есть хороший кодек и достаточная пропускная способность.
Другие советы
Я знаю, что эта тема очень старая, однако я хочу поделиться с вами одной мыслью:вы не можете использовать TCP для того, что вы пытаетесь сделать, из-за необходимой вам задержки - вы сказали, что 1 секунда приемлема, и исходя из этого я предполагаю, что более 1 секунды - нет.
Ваша задержка TCP не определяется PING до хоста.Проблема с TCP заключается в том, что когда вы подключаетесь и соглашаетесь жить с определенной задержкой, ЛЮБАЯ проблема с соединением приведет к сокращению окна TCP, все полученные данные будут удалены, и базовый протокол должен будет их обработать.В это время вы потеряете преимущество в 1 секунду над реальным временем, и трансляция будет прекращена.
TCP хорош для ситуации, когда допустимы большие задержки (скажем, 10 секунд и более), что позволит вам всегда иметь достаточно данных для приема и воспроизведения до восстановления соединения.
Если бы я был на вашем месте, я бы попробовал следующее:
- UDP для транспорта
- какое-нибудь кодирование с низкой задержкой — например, AAC-LD, но и mp3 тоже подойдет.
- иметь некоторую математическую настройку служебных данных по UDP, поэтому, если один пакет потерян, аудиопоток может восстановиться.
Кстати, длина кадров в mp3 составляет 40 мс.С помощью некоторой «магии» вы можете замаскировать несколько пропущенных кадров.
ShoutCAST + SAM Broadcaster или Winamp.Справится с задачей легко.
Если вы хотите начать свою собственную интернет -радиостанцию с помощью ICECAST2, вы можете:
- установите Icecast на свой VPS
#sudo apt-get install icecast
- установите ezstream также на свой VPS
#sudo apt-get install ezstream
- создать файл списка воспроизведения с вашими файлами
playlist.m3u (подробнее можно прочитать в форме Википедия)
#EXTM3U #EXTINF:123, Sample artist - Sample title Sample.mp3 #EXTINF:321,Example Artist - Example title Example.ogg
- создать файл конфигурации ezstream xml
конфиг.xml
<ezstream>
<url>http://localhost:8000/stream</url>
<!--
If a different user name than "source" should be used, set it in
<sourceuser/>:
-->
<!-- <sourceuser>mr_stream</sourceuser> -->
<sourcepassword>hackme</sourcepassword>
<format>MP3</format>
<filename>playlist.m3u</filename>
<stream_once>1</stream_once>
<svrinfoname>My Stream</svrinfoname>
<svrinfourl>http://www.oddsock.org</svrinfourl>
<svrinfogenre>RockNRoll</svrinfogenre>
<svrinfodescription>This is a stream description</svrinfodescription>
<svrinfobitrate>128</svrinfobitrate>
<svrinfochannels>2</svrinfochannels>
<svrinfosamplerate>44100</svrinfosamplerate>
<svrinfopublic>0</svrinfopublic>
</ezstream>
Или вы можете попробовать это: приложение nodejs