Как транслировать полуживой звук через Интернет

StackOverflow https://stackoverflow.com/questions/390127

  •  23-08-2019
  •  | 
  •  

Вопрос

Я хочу написать что-то вроде Skype, т.е.У меня есть постоянный аудиопоток на одном компьютере, а затем повторно сжимать его в формате, подходящем для скрытого подключения к Интернету, получите его на другом конце и воспроизведите.

Предположим также, что подключение к Интернету достаточно современное и быстрое, т.е.DSL или что-то подобное, никаких медленных соединений по телефону и тому подобное.Используемые компьютеры также будут довольно современными (двухъядерные процессоры Intel с частотой 2 ГГц или выше).

Я знаю, как обращаться со звуком на машинах.Чего я не знаю, так это того, как эффективно передавать звук.

Проблемы заключаются в следующем:

  1. Я хотел бы получить хорошее качество звука по всей линии.

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

  3. Если из-за непредвиденных задержек 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

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