Pergunta

Eu quero escrever algo como Skype, ou seja, eu tenho um fluxo de áudio constante em um computador e, em seguida, Recompress -lo em um formato que seja adequado para uma conexão de internet latente, recebê-la na outra extremidade e jogá-lo.

Let também supor que a ligação à Internet é bastante moderno e rápido, ou seja, DSL ou iguais, há conexões lentas mais de telefone e tal. Os computadores envolvidos também será bastante moderno (Dual Core Intel CPUs de 2 GHz ou mais).

Eu sei como lidar com o áudio nas máquinas. O que eu não sei é como transmitir o áudio de uma forma eficiente.

Os desafios são:

  1. Eu gostaria obter uma boa qualidade de áudio em toda a linha.

  2. O fluxo deve ser recebido sem gotas. A corrente pode, no entanto, ser recebido com um pequeno atraso (um segundo atraso é aceitável). Imagino que o software de transporte pode primeiro determinar a latência média (e max), em seguida, iniciar o fluxo e dizer ao receptor que esperar para que a latência máxima antes de começar a reproduzir o áudio. Com isso, se a latência não recebe qualquer superior, todo o fluxo será jogável do outro lado sem gaguejar ou gotas.

  3. Se, devido a latências IP inesperados ou bloqueios, o fluxo de faz ficar cortada, eu quero ser capaz de perceber isso para que eu possa tomar ações (por exemplo, abort o fluxo) e, eventualmente, iniciar uma nova transmissão.

Quais são as minhas opções se eu quiser fazer uso de software pronto para a compressão e tranmission? Não tenho a intenção de escrever meu próprio motor de compressão de áudio, realmente. OTOH, eu pretendo vender a solução em um mercado vertical, ou seja, eu posso pagar alguns dólares de taxas de licença por cópia, mas não $ 100s.

Eu acho que a solução mais simples seria apenas para abrir um fluxo TCP, enviar alguns pacotes para trás e para determinar seu tempo de execução (ou até mesmo usar UDP para isso), então usar os resultados como o guia para o meu valor de latência max , então simplesmente disparar os dados de áudio em sua forma bruta (não comprimido bit estéreo 16), juntamente com um código de sincronismo através da conexão TCP. O receptor lê os dados e joga-lo com o atraso pré-determinado. Isso só poderia trabalhar com o tipo de conexão rápida que eu esperava.

Eu só quero saber se há melhores soluções para alcançar este objetivo, com melhor desempenho (menor latência) e menos dados (comprimido).

BTW, eu primeiro tentar implementar isso no OS X, mas pode querer fazê-lo no Windows, também, caso tenha êxito.

Foi útil?

Solução

Para transmitir áudio através da Internet, você provavelmente deve olhar usando RTP. Ele é usado para SIP, H.323, e muitos outros usam isso para streaming de conteúdo de áudio. Você pode até querer olhar apenas usando um lirbary SIP. Ele já tem muito do que parece que você quer. SIP pode ter muito boa qualidade, se você tem um bom codec, e largura de banda suficiente.

Outras dicas

VLC suporta vários tipos de transcodificação de áudio e vídeo. Pode ser algo que você quer confira .

Eu sei que esse segmento é uma espécie-a de idade, no entanto, uma visão que eu quero compartilhar com você é esta: você não pode usar TCP para isso que você está tentando fazer por causa da latência você precisar - você disse 1 segundo é aceitável, e desde que eu supor que mais de 1s não é.

Seu latência com TCP não é determinado com PING para host. O problema com o TCP é que quando você se conectar, e você aceitar viver com certa latência, nenhum problema com uma conexão vai encolher janela TCP, todos os dados que são recebidos serão descartados e subjacente protocolo terá que lidar com isso. Neste momento, você vai perder sua vantagem 1seg mais em tempo real e o fluxo será descartado.

TCP é bom para a situação em que grandes atrasos são aceitáveis ??(digamos, 10 segundos ou mais) que lhe permitirá ter sempre dados suficientes para comer e jogar fora antes da conexão é restabelecida.

Se eu estivesse no seu lugar, eu vou tentar o seguinte:

  • UDP para o transporte
  • alguns baixo atraso de codificação - AAC-LD por exemplo, mas mp3 também seria OK
  • ter alguma matemática set-up sobrecarga sobre o UDP isso, se um pacote for perdido, fluxo de áudio pode recuperar.

BTW, quadros em mp3 estão 40msec longa. Com alguma 'mágica' você poderia mascarar alguns quadros perdidos.

Shoutcast + SAM Broadcaster ou Winamp. Irá fazer o truque com facilidade.

Se você estiver olhando para começar sua própria estação de rádio na Internet usando icecast2 você pode:

  • instalar icecast em seu VPS
    #sudo apt-get install icecast
  • instalar ezstream também em você VPS
    #sudo apt-get install ezstream
  • criar um arquivo de lista de reprodução com seus arquivos

Playlist.m3u (você pode ler mais forma wikipedia )

    #EXTM3U

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

    #EXTINF:321,Example Artist - Example title
    Example.ogg
  • criar um arquivo de configuração XML ezstream

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>

Ou você pode tentar o seguinte: aplicação nodejs

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top