Как транслировать полу-живое аудио через интернет - PullRequest
2 голосов
/ 24 декабря 2008

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

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

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

Проблемы:

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

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

  3. Если из-за непредвиденных задержек или блокировок IP поток действительно обрезается, я хочу иметь возможность заметить это, чтобы я мог предпринять действия (например, прервать поток) и в конце концов начать новую передачу.

Какие есть варианты, если я хочу использовать готовое программное обеспечение для сжатия и передачи? На самом деле я не собираюсь писать свой собственный механизм сжатия звука. ОТО, я планирую продавать решение на вертикальном рынке, то есть я могу позволить себе несколько долларов лицензионных сборов за копию, но не 100 долларов.

Полагаю, самым простым решением было бы просто открыть поток TCP, отправить несколько пакетов назад и вперед, чтобы определить их время выполнения (или даже использовать для этого UDP), а затем использовать результаты в качестве руководства для моего значения максимальной задержки затем просто запустите аудиоданные в их необработанном виде (несжатый 16-битный стереозвук) вместе с временным кодом через соединение TCP. Приемник считывает данные и воспроизводит их с заранее определенной задержкой. Это может работать только с ожидаемым типом быстрого соединения.

Мне просто интересно, есть ли лучшие решения для достижения этой цели, с лучшей производительностью (меньшая задержка) и меньшим количеством данных (сжатые).

Кстати, я сначала пытаюсь реализовать это на OS X, но, возможно, захочу сделать это и на Windows, если это окажется успешным.

Ответы [ 5 ]

1 голос
/ 24 февраля 2016

Если вы хотите запустить собственную интернет-радиостанцию ​​с помощью icecast2 Вы можете:

  • установить Icecast на свой VPS
    #sudo apt-get install icecast
  • установить ezstream также на свой VPS
    #sudo apt-get install ezstream
  • создать файл списка воспроизведения с вашими файлами

playlist.m3u (вы можете прочитать больше форма wikipedia )

    #EXTM3U

    #EXTINF:123, Sample artist - Sample title
    Sample.mp3

    #EXTINF:321,Example Artist - Example title
    Example.ogg
  • создать файл конфигурации ezstream xml

config.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

1 голос
/ 18 августа 2011

ShoutCAST + SAM Broadcaster или Winamp. С легкостью справится.

1 голос
/ 24 декабря 2008

Для передачи звука через Интернет вы, вероятно, должны использовать RTP. Это используется для SIP, H.323, и многие другие используют это для потокового аудио контента. Возможно, вы даже захотите посмотреть, просто используя SIP Lirbary. В нем уже есть многое из того, что звучит так, как вы хотите. SIP может иметь довольно хорошее качество, если у вас хороший кодек и достаточная пропускная способность.

1 голос
/ 18 июля 2011

Я знаю, что поток довольно старый, но я хочу поделиться с вами одним из выводов: вы не можете использовать TCP для этого, что пытаетесь сделать из-за требуемой задержки - вы сказали 1 секунда приемлема, и из этого я предполагаю, что более 1 секунды не.

Ваша задержка по TCP не определяется с помощью PING для хоста. Проблема с TCP заключается в том, что когда вы подключаетесь и соглашаетесь жить с определенной задержкой, любая проблема с соединением приведет к сокращению окна TCP, все полученные данные будут отброшены, и базовый протокол должен будет их обработать. В это время вы потеряете преимущество в 1 с по сравнению с режимом реального времени, и поток будет сброшен.

TCP подходит для ситуации, когда допустимы большие задержки (скажем, 10 секунд или более), что позволит вам всегда иметь достаточно данных, чтобы их можно было съесть и воспроизвести до восстановления соединения.

Если бы я был на вашем месте, я попробую следующее:

  • UDP для транспорта
  • некоторое кодирование с низкой задержкой - например, AAC-LD, но mp3 тоже будет в порядке
  • имеет некоторые математические настройки по UDP, поэтому, если один пакет потерян, аудиопоток может восстановиться.

Кстати, кадры в mp3 имеют длину 40 мсек. С помощью некоторой «магии» вы можете замаскировать несколько выпавших кадров.

1 голос
/ 24 декабря 2008

VLC поддерживает различные типы аудио и видео транскодирования. Может быть что-то, что вы хотите проверить .

...