Uma web rádio com Icecast usando Debian

Publicado: 16/01/2012 em Linux, Multimidia, Serviços IP
Tags:, , ,

1. Introdução
Para fazer a transmissão e recepção de dados em termpo real no formato de streaming (fluxo), faz-se necessário cumprir algumas etapas essenciais:
a) preparar os dados utilizando um codificador/decodificador (codec);
b) acondicionar estes dados codificados em um arquivo de contêiner;
c) gerar um fluxo de dados através de um gerador de streaming;
d) gerenciar os usuários clientes do fluxo de dados através de um servidor de streaming; e
e) possuir um reprodutor de fluxo de dados do lado do cliente.

Neste primeira parte deste post vamos explorar alguns conceitos essenciais para entender este processo de streaming, particularmente quanto ao streaming de áudio.

1.1 A preparação dos dados a serem transmitidos
a) Formatos de arquivos de áudio
A disposição dos dados de áudio (excluindo metadados) é chamado de formato de codificação de áudio e pode ser não comprimido ou comprimidos (para reduzir o tamanho do arquivo). Assim, os formatos de arquivos de áudio podem ser agrupados da seguinte forma:

b) A compressão do áudio
Para realizar streaming, o conteúdo multimídia deve ser comprimido (codificados) usando um codificador (codec). Um codec codifica uma sequência de dados seja para transmissão, armazenamento ou para criptografia, e faz sua posterior decodificação para reprodução/edição. Ou seja, um codec de áudio é uma implementação específica em software ou hardware capaz de comprimir/descomprimir um áudio para/de um formato de codificação específico. Um exemplo de codec de áudio é o LAME. Para vídeos, existem alguns formatos de de compressão específicos tais como o H.264 (MPEG-4 Part 10) ou o VP8.

c) O arquivo de contêiner
O conteúdo codificado através de um determinado formato em particular é encapsulado dentro de um arquivo de contêiner, o qual é utilizado para identificar e intercalar diferentes tipos de dados. Formatos de arquivos de contêiner mais simples podem conter diferentes tipos de formatos de áudio, enquanto que os formatos de contêiner mais avançados podem suportar múltiplos streams de áudio e vídeo, legendas, capítulo-informação, e meta-dados (tags) – juntamente com as informações de sincronização necessárias para reproduzir os vários fluxos em conjunto. São exemplos de arquivos de contêiner: WAV, MP4, Flash Video (FLV,F4V), WebM, ASF, Ogg, RealMedia, QuickTime, AVI, ISMA e MPEG2.

1.2 O streaming (fluxo de dados)
Um “stream” pode ser definido como um fluxo de dados em um sistema computacional. Com “streaming”, o cliente de streaming do usuário (seja um navegador – browser – ou um aplicativo dedicado) disponibiliza em tempo real os conteúdos que chegam ao mesmo tempo em que continua recebendo os demais dados que estão sendo transmitidos. O termo “streaming” refere-se ao método de administração da transmissão e não ao conteúdo que é transmitido.

Para transmitir e receber um streaming de mídia (um fluxo de mídia) há necessidade de três componentes básicos:
– o gerador (fonte) de streaming (fluxo), onde pode-se exemplificar: Darkice3, IceS, Ezstream, o Liveice4, HelixDNA …;
– o servidor de fluxo, onde pode-se exemplificar: FFmpeg, Icecast, Gstreamer …; e
– um reprodutor de fluxo do cliente, onde pode-se exemplificar: cURL, FFmpeg, GStreamer, Mplayer, RealPlayer, VLC Media Player, xine …”.

Ao gerador cabe a responsabilidade de gerar o fluxo (uma cadeia de dados sequenciais), enquanto o servidor tem o papel de validar e gerenciar as conexões dos usuários que desejam receber o fluxo de dados (normalmente de áudio ou vídeo). Já pelo lado dos usuários, há necessidade de um cliente de “streaming” para reproduzir os conteúdos transmitidos.

O fluxo contínuo de dados é entregue a partir de um servidor de streaming para um cliente de streaming usando um protocolo de transporte, tal como o RTSP (Real-time Streaming Protocol). O RTSP (RFC-2326) define um formato de pacote padronizado para entrega de áudio e vídeo sobre redes IP.

Neste post descrevemos a implementação de uma entrega de áudio através de “Unicast”, que é o mais comum na internet, onde uma cópia separada da mídia é trasmitida do servidor para cada cliente receptor. Optamos também por usar como gerador de fluxo o ices2, como servidor de streaming o icecast2 e como cliente o VLC (todos softwares livres).

1.3 O projeto Icecast
O projeto Icecast é um projeto de streaming (fluxo) de mídia lançado em 1998 como software livre. Contém uma coleção de programas e bibliotecas para streaming de áudio através da Internet onde se destacam:
– IceS: o programa gerador (fonte) de streaming, o qual envia o fluxo de dados para o servidor de streaming icecast2;
– Icecast: servidor de validação e gerenciamento das conexões dos usuários;
– libshout: uma biblioteca para se comunicar com servidores Icecast;

O icecast2 é um gerador de “streams” de áudio para ouvintes. De outra forma, Icecast2 é um servidor de fluxo de mídia que atualmente suporta Ogg Vorbis e MP3 “streams” de áudio. Ele pode ser usado para criar uma estação de rádio na internet ou de forma privada rodar uma jukebox(*) e muitas outras coisas em entre os dois. É um aplicativo muito versátil, em que novos formatos podem ser adicionados com relativa facilidade e suporta padrões abertos para comunincação e interação. O Icecast é distribuído sob a licença GNU GPL, versão 2.

(*) A idéia de Jukebox é de uma máquina que reproduz música, inserindo moedas. Tem por função tocar músicas escolhidas pelo cliente que estejam em seu catálogo.

Um servidor Icecast pode abrigar várias transmissões (ou pontos de montagem), cada um contendo um fluxo separado de conteúdo. O ‘ponto de montagem’ é um nome único no seu servidor que identifica um fluxo particular – ele se parece com um nome de arquivo, como ‘/canal1.ogg’. Um ouvinte só pode ouvir a um único ponto de montagem de cada vez. Isto significa que se pode ter um único servidor Icecast contendo múltiplas transmissões com conteúdos diferentes, ou possivelmente a mesma transmissão, mas com fluxos de diferentes taxas de bits ou qualidades. Neste caso, cada fluxo de difusão ou é um ponto de montagem separado.

O servidor Icecast2 é capaz de fazer “streaming” de conteúdos sobre o padrão HTTP Vorbis, Theora sobre HTTP, MP3 sobre o protocolo usado pelo SHOUTcast, AAC, e NSV sobre o protocolo SHOUTcast. É capaz de fazer video “streaming” via Theora. Ele usa programas externos, chamados de “clientes fontes”, para criar os fluxos, e o próprio projeto Icecast inclui um programa fonte conhecido como IceS. O cliente fonte funciona normalmente no local onde o áudio é gerado (por exemplo, um estúdio) e o servidor Icecast em um lugar onde exista muita largura de banda disponível.

Icecast2 requer os seguintes pacotes:
* libxml2
* libxslt
* curl
* ogg/vorbis

1.4 O gerador de streaming IceS
O IceS é um programa que decodifica áudio e o envia para um servidor Icecast para transmitir aos clientes. IceS pode ler dados de áudio de disco, tal como a partir de arquivos Ogg Vorbis (formato de arquivo livre e aberto), ou amostra de áudio ao vivo a partir de uma placa de som e faz sua codificação. O IceS pode tocar um arquivo de música, tocar uma lista (playlist) de arquivos ou capturar a entrada de uma placa de som e fazer o “streaming” do som ao Vivo (em tempo real).

Pode Ices tocar arquivos com formato MP3?
Não, pelo menos para a versão atual do Ices (versão 2.0.2 no momento deste post). Segundo a página oficial do projeto, não tem havido muito interesse em lidar com arquivos com formato MP3 com ices2. Se realmente desejar codificar o fluxo Vorbis a partir de arquivos com formatos não-Vorbis, então pode-se jogá-los com um aplicativo externo, por exemplo, xmms, e usar ices2 para capturar a partir da placa de som, mas deve-se estar ciente de que qualquer conversão de um formato com perdas para outro é ruim. Se for este caso, então certifique-se de que o material original é de alta qualidade.

1.5 O gerador de streaming Darkice
Darkice é um gerador de “streamer” de áudio ao vivo. Ele grava áudio a partir de uma interface de áudio (placa de som), codifica e envia para um servidor de streaming. É importante notar que darkice não é projetado para reproduzir fluxos usando uma lista de reprodução estática (playlist). Ele grava áudio de uma interface (por exemplo, de um cartão de som), codifica ele e o envia para um servidor de “streaming”. Darkice pode codificar em formatos ogg/Vorbis e mp3.
O Darkice usa “Lame” como um objeto partilhado como o seu codificador de mp3, e o Ogg Vorbis como o seu codificador Ogg Vorbis. A versão Darkice do Debian só é compilada com suporte a Ogg Vorbis devido a razões de patentes e, por isso, só trabalha com servidores IceCast2.

1.6 O gerador de streaming Ezstream
Ezstream é um cliente de fluxos de áudio e vídeo que alimenta qualquer servidor Icecast com dados de áudio e metadata a partir de uma entrada padronizada sem recodificação. Assim exige muito pouco dos recursos da CPU. Algumas listas de reprodução (playlists) podem ser reiniciadas (looped) e compostas com ficheiros de media MP3, Ogg Vorbis ou Ogg Theora.
Metadados de Shoutcast também são suportados.

Algumas referências para uso do Ezstream podem ser encontradas em Ezstream + Icecast2 = Headless Audio Server e também em icecast streaming with ezstream.

2. Fazer a Instalação dos pacotes necessários
a) Instalar o servidor:

# apt-get install icecast2 libogg0 libvorbis0a libxml2 libxslt1.1 curl

Realizada a instalação do icecast, os seguintes fatos devem ser observados:

  • será criado o grupo “icecast” (veja com o comando “$ cat /etc/group”).
  • será criado um novo usuário de sistema “icecast2” (veja com o comando “$ cat /etc/passwd”)
  • algumas instruções iniciais podem ser vistas em /etc/default/icecast2
  • serão criados, entre outros, os arquivos/diretórios:

drwxrwxr-x 4 icecast2 icecast 4096 Jan 15 19:18 /etc/icecast2
-rw-rw---- 1 icecast2 icecast 9025 Jan 15 19:18 /etc/icecast2/icecast.xml
drwxrwxr-x 2 icecast2 icecast 4096 Jan 15 19:13 /etc/icecast2/admin
drwxrwxr-x 2 icecast2 icecast 4096 Jan 15 19:13 /etc/icecast2/web

b) Instalar o gerador:
b.1) se preferir o IceS:

# apt-get install ices2

b.2) se preferir o Darkice:

# apt-get install darkice

3. Configurar o servidor icecast2 e iniciar o serviço

A maneira mais prática de configurar um servidor icecast é partir de um arquivo de configuração já pronto e personalizá-lo. Após a instalação do icecast no Debian, ele vem com um arquivo de configuração padrão em /etc/icecast2/icecast.xml. Basta copiá-lo e editá-lo, conforme descrito a seguir. Na verdade, são dois os arquivos que necessitam ser alterados: os arquivos /etc/default/icecast2 e /etc/icecast2/icecast.xml .

3.1 Configurar /etc/default/icecast2

USERID=icecast2
GROUPID=icecast
ENABLE=true

3.2 Configurar /etc/icecast2/icecast.xml
Neste arquivo, são poucas as alterações a serem feitas sobre o arquivo padrão de configuração de forma a deixar o icecast operacional.
a) Por razões de segurança, deve-se alterar as senhas na seção de <authentication>:

<admin-user>admin</admin-user>
<admin-password>hackme</admin-password>
<source-password>admin</source-password>
<relay-password>admin</relay-password>

As senhas de <source-password> e <relay-password> devem ser as mesmas das colocadas nas configurações dos aplicativos fonte/relay de geração de fluxos de dados (tais como o IceS ou Darkice).

b) Definir o hostname da máquina de onde o fluxo de dados pode ser achado pelos usuários (ou seja, a máquina onde está o icecast instalado). Pode ser deixado como localhost quando os aplicativos de geração do fluxo de dados (IceS, Darkice ou outros) estiverem na mesma máquina do Icecast, ou colocar o endereço real da máquina do Icecast quando a geração do fluxo de dados estiver ocorrendo também a partir de outras máquinas. Veja os exemplos possíveis:
<hostname>localhost</hostname>
<hostname>210.23.56.120</hostname>
<hostname>meudominio.com.br</hostname>

c) A porta padrão para ouvir é a 8000. Mude isto caso seja necessário.

A seguir um exemplo de arquivo para /etc/icecast2/icecast.xml:

<icecast>
    <location>BR</location>
    <admin>webmaster@localhost</admin>

    <limits>
        <clients>100</clients>
        <sources>2</sources>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
        <!-- same as burst-on-connect, but this allows for being more
             specific on how much to burst. Most people won't need to
             change from the default 64k. Applies to all mountpoints  -->
        <burst-size>65535</burst-size>
        <!--
        <max-bandwidth>100M</max-bandwidth>
        -->
    </limits>

    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>secret2</source-password>
        <!-- Relays log in username 'relay' -->
        <relay-password>secret3</relay-password>
        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>
        <admin-password>secret1</admin-password>
    </authentication>

    <!-- This is the hostname other people will use to connect to your server.
    It affects mainly the urls generated by Icecast for playlists and yp
    listings. -->
    <hostname>localhost</hostname>

    <!-- You may have multiple <listener> elements -->
    <listen-socket>
        <port>8000</port>
        <!-- <bind-address>127.0.0.1</bind-address> -->
        <!-- use <shoutcast-mount> in here to implicitly define port n+1 -->
    </listen-socket>
    <!--
    <listen-socket>
        <port>8001</port>
        <ssl>1</ssl>
    </listen-socket>
    -->

    <fileserve>1</fileserve>

    <paths>
        <!-- basedir is only used if chroot is enabled -->
        <basedir>/usr/share/icecast2</basedir>

        <!-- Note that if <chroot> is turned on below, these paths must both
             be relative to the new root, not the original root -->
        <logdir>/var/log/icecast2</logdir>
        <webroot>/usr/share/icecast2/web</webroot>
        <adminroot>/usr/share/icecast2/admin</adminroot>

        <!-- Aliases: treat requests for 'source' path as being for 'dest' path
             May be made specific to a port or bound address using the "port"
             and "bind-address" attributes.
          -->
        <!--
        <alias source="/foo" dest="/bar"/>
          -->
        <!-- Aliases: can also be used for simple redirections as well,
             this example will redirect all requests for http://server:port/ to
             the status page
         -->
        <alias source="/" dest="status.xsl"/>
   </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <!-- <accesslog_ip>0<accesslog_ip> -->
        <!-- <playlistlog>playlist.log</playlistlog> -->
          <loglevel>3</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
          <logsize>10000</logsize> <!-- Max size of a logfile -->
        <!-- If logarchive is enabled (1), then when logsize is reached
             the logfile will be moved to [error|access|playlist].log.DATESTAMP,
             otherwise it will be moved to [error|access|playlist].log.old.
             Default is non-archive mode (i.e. overwrite)
        -->
        <!-- <logarchive>1</logarchive> -->
    </logging>

    <security>
        <chroot>0</chroot>
        <!--
        <changeowner>
            <user>nobody</user>
            <group>nogroup</group>
        </changeowner>
        -->
    </security>
</icecast>

Algumas explicações:

  • <clients> máximo de clientes (ouvintes) que podem acessar o serviço;
  • <sources> número máximo de transmissões (canais de áudio);
  • <burst-on-connect> se for habilitado (valor 1), o servidor envia grande quantidade de áudio ao cliente para que este possa fazer uma boa bufferização; com o valor 0, essa característica fica desabilitada;
  • <burst-size> tamanho desse buffer em bytes ;
  • <source-password> – será utilizado para autenticação do aplicativo fonte do áudio (o gerador);
  • <admin-password> – será utilizado para autenticação do usuário que fará tarefas de administração do icecast;
  • <fileserve> permite que o icecast forneça arquivos estáticos, isto é, também atue como um servidor para transmissões assíncronas. Se o valor for 0 para o fileserve, então a transmissão de arquivos estáticos não estará disponível;
  • <basedir> indica qual a raiz do sistema a ser utilizada; normalmente o valor dessa opção é / (barra), a não ser que se rode o icecast em chroot (veja mais abaixo);
  • <logdir> pasta onde ficarão os arquivos de registro (logs); pode ser qualquer pasta e a mesma deve ser do usuário e do grupo no qual o icecast roda; tipicamente em sistemas unix usa-se /var/log/icecast ou algo do tipo;
  • <pidfile> arquivo que conterá o id do processo do servidor;
  • <webroot> diretório para o conteúdo não administrativo (root servindo de arquivo), uma página de status é fornecida. Apenas para leitura do icecast;
  • <adminroot> o diretório da interface web de administração. Contém arquivos administrativos (xslt). Apenas para leitura do icecast;
  • <alias> cria um sinônimo, para o caso de se querer que um ponto de montagem tenha mais de um nome; no caso acima, o alias faz com que o ponto de montagem /status.xsl aponte para o /;
  • <accesslog> arquivos onde ficarão os registros de acesso e pedidos ao servidor;
  • <errorlog> arquivo onde estarão as mensagens de erro;
  • <playlistlog> arquivo contendo os registro dos metadados dos streamings;
  • <loglevel> nível de verbosidade dos logs (4 Debug, 3 Info, 2 Warn, 1 Erro); quanto maior, mais detalhado será o registro das atividades;
  • <chroot> determina se o icecast rodará ou não dentro de uma “jaula”, isto é, numa raiz diferente da raiz do sistema definida na seção Caminhos de arquivos (seção paths), usando para isso a syscall chroot();
  • <changeowner> determina sob qual usuário e grupo o icecast rodará no sistema.

3.3 Iniciar o servidor icecast2

Usar o comando:
# /etc/init.d/icecast2 start

Mas não há necessidade de fazer o restart Icecast caso tenha alterado a configuração deste servidor: para fazer valer a nova configuração basta enviar um sinal SIGHUP através da linha de comando. Faça isto através do seguinte comando:

# killall -HUP icecast2

4. Configurar o gerador IceS (se escolhido)

4.1 Criar uma playlist
Pode-se executar uma música, um playlist pré-selecionado de músicas ou fazer uma transmissão ao vivo. Para o caso de se desejar uma playlist de música, o primeiro passo que se recomenda é criar uma pasta para gerenciar esta tarefa:

$ mkdir -p /home/usuario/musica/radio

Coloque nesta pasta as músicas, lembrando que para utilizar o IceS estas deverão ser do tipo *.OGG. Para gerar automaticamente a playlist sem ter que digitar nome e caminho da cada música, usar o comando:

$ find /home/usuario/musica/radio/ -iname "*.ogg" > /home/usuario/musica/radio/playlist.txt

Assim, a playlist deve ter sido criada. Verifique se na pasta “radio” se foi criado um arquivo com o nome de “playlist.txt” e se ele contém o nome e o caminho das músicas, conforme exemplificado abaixo:


/home/usuario/musica/radio$ cat playlist.txt
/home/usuario/musica/radio/musica-6.ogg
/home/usuario/musica/radio/musica-7.ogg
/home/usuario/musica/radio/musica-4.ogg
/home/usuario/musica/radio/musica-a11.ogg
/home/usuario/musica/radio/musica-3.ogg
/home/usuario/musica/radio/musica-8.ogg
/home/usuario/musica/radio/musica-5.ogg
/home/usuario/musica/radio/musica-a10.ogg
/home/usuario/musica/radio/musica-2.ogg
/home/usuario/musica/radio/musica-9.ogg
/home/usuario/musica/radio/musica-1.ogg

4.2 Preparar pastas para gerenciar o playList

Para executar uma Playlist pré-selecionada de músicas ou fazer uma transmissão ao vivo, deve-se configurar alguns arquivos que se encontram na pasta de exemplos (/usr/share/doc/ices2/examples/):

Arquivo Para Playlist: ices-playlist.xml
Arquivo para Ao Vivo (Tempo Real): ices-alsa.xml e ices-oss.xml
Neste post estamos interessados na execução de uma playlist. Assim, deve-se fazer:
# cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/ices2/.

Para logs, defininiremos o seguinte:
# mkdir /etc/ices2/
# mkdir /var/log/ices

4.3 Configurar o IceS
Executando os passos anteriores, o arquivo de configuração do IceS estará em /etc/ices2/ices-playlist.xml. São poucas as modificações neste arquivo padrão para deixar este gerador de fluxo operacional:

a) É conveniente executar o IceS em background. Assim:
<background>1</background>

b) Definir a localização do servidor de streaming. Se o servidor de streaming (no nosso caso utilizaremos o Icecast) estiver na mesma máquina do IceS basta utilizar localhost. Caso contrário, colocar o endereço da máquina remota do Icecast. Veja exemplos de possibilidades:
<hostname>localhost</hostname>
<hostname>210.23.56.120</hostname>
<hostname>meudominio.com.br</hostname>

c) Password relativo a fonte do fluxo de dados, que deve ser a mesma utilizada no arquivo de configuração do Icecast:
<password>secret2</password>

d) Logs, conforme definido acima:
<logpath>/var/log/ices</logpath>
<logfile>ices.log</logfile>

e) Taxa de amostragem
Taxa de amostragem (“sample rate”) é o número de amostras de áudio realizados por segundo, medido em Hz ou kHz. Largura de banda é a diferença entre as frequências mais altas e mais baixas transportadas em um fluxo de áudio. A taxa de amostragem de reprodução ou gravação determina a freqüência máxima de áudio que podem ser reproduzidas, como mostrado a seguir:

Sample Rate (kHz) Maximum Frequency (kHz)
22,05 10
32 14,5
44,1 20
48 21,8

Qual taxa de amostragem utilizar?

44,1 kHz é a taxa de amostragem de CDs de áudio que dão uma frequência máxima de reprodução de 20 kHz. 20 kHz é a mais elevada frequência audível geralmente por seres humanos, fazendo com que 44,1 kHz seja uma escolha lógica para a maioria do material de áudio.

O áudio pode ser gravado para uma largura de banda abaixo de 20kHz por alguns motivos:
– para reduzir o tamanho do arquivo;
– para reduzir o uso de CPU;
– quando o próprio material original for menor do que a largura de banda de 20kHz.

32kHz de taxa de amostragem vai dar boa qualidade de gravação de voz, embora não a melhor. Isto dará uma banda de áudio de 14,5 kHz que é um pouco abaixo da largura de banda de rádio FM. Taxa de amostragem de 32 kHz é, portanto, bom para:
– falas;
– todos os outros tipos de áudio onde arquivos menores que 44,1 kHz de taxas de amostragem são desejados com apenas ligeiro comprometimento da qualidade de som.

Recomendação para uma boa configuração
Considerando uma qualidade aceitável mas com boa economia de banda, utilizei a seguinte configuração:

Para Rippar (veja mais abaixo neste post,
usando o aplicativo RipperX)
Encoder= OggVorbis encoder
bitrate= 48kbps
VBR= yes
VBR quality= 0
High quality mode= yes
Para o IceS <nominal-bitrate>48000</nominal-bitrate>
<samplerate>32000</samplerate>
<channels>2</channels>

A seguir um exemplo de arquivo /etc/ices2/ices-playlist.xml:

<?xml version="1.0"?
<ices>
    <!-- run in background -->
    <background>1</background> <!--  Deixe o valor 1 para rodar em background (segundo plano) -->
    <!-- where logs, etc go. -->
    <logpath>/var/log/ices</logpath> <!--  Diretório para logs do ices2 -->
    <logfile>ices.log</logfile> <!--  arquivo de log -->
    <loglevel>2</loglevel>   <!-- 1=error,2=warn,3=info,4=debug -->
    <!-- set this to 1 to log to the console instead of to the file above -->
    <consolelog>0</consolelog>
    <!-- optional filename to write process id to. Use one diferent file for each instance of IceS -->
    <pidfile>/var/log/ices/ices_canal1.pid</pidfile>

     <stream>
        <!-- Aqui poderá definir algumas informações sobre sua PlayList -->
        <metadata>
            <name>Radio Sepir</name>
            <genre>Genero Livre</genre>
            <description>Musicas Legais</description>
        </metadata>

        <input>
            <module>playlist</module>
            <param name="type">basic</param>
            <param name="file">/home/usuario/musica/radio/playlist.txt</param> <!-- Caminho completo para o arquivo da sua playlist. Vamos criá-lo a seguir. -->
            <!-- random play -->
            <param name="random">0 </param> <!-- Deixe zero para seguir a ordem da playlist -->
            <param name="restart-after-reread">0</param>
            <param name="once">0</param>
        </input>   

    <instance>
            <hostname>localhost</hostname>
            <port>8000</port> <!-- Caso tenha alterado a porta, altere aqui também -->
            <password>secret2</password> <!-- Coloque a senha utilizada anteriormente no icecast para source-pass -->
            <mount>/canal1.ogg</mount> <!-- Ponto de Montagem da sua Rádio. Defina o nome que desejar, ex: nome_qualquer.ogg. Importante: não use "ç", acentos, espaços e evite "-" e "_". -->
            <reconnectdelay>2</reconnectdelay>
            <reconnectattempts>5</reconnectattempts>
            <maxqueuelength>80</maxqueuelength>
            <encode> <!-- Define a transmissão e a qualidade do audio. CUIDADO: quanto maiores os valores, mais banda utilizará. -->
               <nominal-bitrate>48000</nominal-bitrate> <!-- bps. e.g. 48000 for 48 kbps -->
               <samplerate>32000</samplerate>
               <channels>2</channels> <!-- Defina 2 para Stereo e 1 para Mono -->
            </encode>
    </instance>
  </stream>
</ices>
<!-- Fim do Arquivo de Configuração ices-playlist.xml -->

Algumas explicações:
Uma explicação detalhada de cada parâmetro pode ser encontrada na documentação oficial do IceS em IceS 2.0.2 Docs — Config File. Vamos aqui descrever apenas alguns aspectos que chamaram mais a atenção.

i) Para sessão de configuração geral
<pidfile>: declaração de um nome de arquivo com o caminho a ser criado na hora da partida do IceS. Este arquivo conterá então um único número que representa o ID do processo do IceS em execução. Esta ID de processo pode então ser utilizado para sinalizar a aplicação de certos eventos. Melhor utilizar um arquivo para cada instância do IceS criada.

ii) Para sessão de configuração do módulo de entrada
A configuração do módulo de entrada pode ser realizada de quatro maneiras distintas:
a) Forma básica:
<param name=’type’>basic</param>
<param name=’file’>playlist.txt</param>
<param name=’once’>0</param>
<param name=’restart-after-reread’>0</param>
Onde:
– type basic: seleciona o módulo ‘basic’ de playlist.
– file: nome do arquivo de onde conseguir a playlist. este arquivo deverá ser um arquivo texto “plain ASCII” contendo uma lista de arquivos de áudio Ogg Vorbis para transmitir, cada um em uma linha separada.
– once: defina como 0 para repetir o playlist indefinidamente. Defina como 1 para tocar a lista apenas uma única vez.
– restart-after-reread: se a playlist é re-lida pela metade, o que pode ocorrer caso a playlist for atualizada, então esta será reiniciada a partir do início da playlist. Por padrão, vem desabilitado.

b) Forma com script:
<module>playlist</module>
<param name=’type’>script</param>
<param name=’program’></param>
Onde:
type script: seleciona o módulo ‘script’ de playlist.
program: nome de um programa ou script para chamar. Com um pouco de criatividade pode-se implementar regras para frequências, gênero da música dependendo da hora do dia e outras inserções para vinculação colocadas com regularidade.

c) Forma de entrada através de um dispositivo de áudio
<module>oss</module>
<param name=’device’>/dev/dsp</param>
<param name=’rate’>44100</param>
<param name=’channels’>2</param>
<param name=’metadata’>1</param>
onde:
device: especifica qual o device a usar. /dev/dsp pode ser uma boa escolha para cartões de som OSS, ou /dev/audio para dispositivos de áudio Sun.
rate/channels: Configura a taxa de amostragem e o número de canais da interface de áudio para gravar.
metadata: se definido como 1, você pode atualizar os metadados “on the fly”. Por padrão, IceS irá ler os metadados a partir da entrada padrão (atualizando quando receber uma linha em branco), mas definindo o próximo parâmetro pode-se tê-lo lido a partir de um arquivo designado após a recepção de um sinal USR1. Metadados deve conter pares ‘name = value’ em linhas separadas. Por exemplo:

TITLE = Sonho de uma noite de verão
ARTISTA = João Maria
ALBUM = Greatest Hits
CONTACT = http: //www.meucontato.com/

Observações:

  • para codificar a partir Line-In, o IceS faz a leitura a partir do DSP da placa de som, mas de onde se recebe o áudio dependerá das definições do mixer. Use um utilitário como aumix/alsamixer para ver as configurações e alterar o dispositivo de captura ou gravação. Normalmente, o padrão é o Mic.
  • é possível configurar para outros devices tais como sun e alsa. Para detalhes destas configurações acessar IceS 2.0.2 Docs — Input Modules

d) Forma de entrada através de um módulo STDIN
Este módulo de entrada terá 16 bits PCM de dados da entrada padrão:
<module>stdinpcm</module>
<param name=’rate’>44100</param>
<param name=’channels’>2</param>
Samplerate and number of channels for incoming data.

iii) Para sessão de configuração da instância do fluxo
<password>secret2</password>
Defina esta opção como a senha que o servidor de streaming (Icecast) requer para autenticar as fontes. Ou seja, a senha colocada aqui deve ser a mesma utilizada na configuração do icecast2;

<mount>/canal1.ogg</mount>
Especifica o ponto de montagem para esta instância do IceS. Neste exemplo resultará em um stream que estará disponível em http://localhost:8001/canal1.ogg. Todos os fluxos de Ogg Vorbis devem ter pontos de montagem que terminam em. Ogg (por exemplo, /canal1.ogg). Isto é devido à forma como a maioria dos “media players” estão construídos para inferir o tipo de fluxo. “Streams” MP3 normalmente não contém uma extensão (por exemplo, seria ferenciado apenas como /canal1). Pontos de montagem também não devem conter espaços ou caracteres estranhos.

<reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
Quando algo dá errado (por exemplo, falhas no servidor ou a rede cair) e o IceS desconecta do servidor, estes parâmetros controlam o intervalo de tempo entre tentativas de reconexão e quantas vezes ele tentará se reconectar. O delay é em segundos. Se for definido o parâmetro “reconnectattempts” como -1, o IceS tentará se reconectar indefinidamente. Neste caso, é razoável propor um valor grande para “reconnectdelay”.

<maxqueuelength>80</maxqueuelength>
Descreve o tamanho das filas internas de dados. Isso basicamente permite que seja controlado a quantidade de dados que fica “buffered” antes do IceS decidir que não pode enviá-los para o servidor dentro de um tempo aceitável, bem como desligar ou esvaziar a fila (descartando os dados) e continuar. Apenas para usuários avançados.

<savefile>output_file.ogg</savefile>
Às vezes deseja-se que o fluxo que está sendo transmitido seja salvo no disco. Isto pode ser útil principalmente para gravações ao vivo em que se deseje fazê-las disponíveis sob demanda mais tarde.

4.4 Iniciar e parar IceS
Utilize os comandos:


# killall ices2
# ices2 /etc/ices2/ices-playlist.xml

OBS:
a) O primeiro comando acima serve para parar qualquer serviço IceS que esteja ativo (quando necessário). O segundo comando serve para iniciar o serviço IceS;
b) o IceS pode também ser iniciado da área do usuário. Mas para isto o diretório de logs do IceS deve ser alterado para uma pasta local do usuário. Altere em seu arquivo de configuração.

4.5 Múltiplas instâncias do IceS em um mesmo computador

É possível ter mais de uma rádio transmitindo em um mesmo computador. O servidor icecast pode abrigar múltiplas transmissões (ou pontos de montagem), cada uma contendo um fluxo separado do conteúdos. Um ‘mountpoint “é um nome exclusivo no servidor que identifica um fluxo particular – ele se parece com um nome de arquivo, tal como’/stream.ogg’. Um ouvinte pode ouvir apenas um ponto de montagem de cada vez. Isto significa que se pode ter um servidor icecast único, o qual contém múltiplas transmissões com conteúdo diferentes, ou que possibilite a mesma transmissão com diferentes bitrates ou qualidades. Neste caso, cada transmissão é um ponto de montagem em separado.

Para implementar mais de uma transmissão simultânea, é necessário editar os arquivos de configuração e ter especial atenção para que não sejam utilizados os mesmos nomes para os pontos de montagem no servidor icecast2. Se a primeira instância do iceS usou o ponto de montagem /cana1.ogg então a outra instância poderia ser /canal2.ogg

  • Passo 1- preparar novo arquivo de configuração: # cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/ices2/ices-playlist_2.xml
  • Passo 2- editar ices-playlist_2.xml de modo semelhante ao mostrado anteriormente. De forma prática, o essencial é alterar apenas a linha que deve apontar para o novo playlist: <param name=”file”>/home/usuario/musica/radio/playlist_2.txt</param>
  • Passo 3- criar uma nova playlist: $ find /home/usuario/musica/radio/ -iname "*.ogg" > /home/usuario/musica/radio/playlist_2.txt
  • Passo 4- Configurar /etc/icecast2/icecast.xml
    O parametro “<sources>” do arquivo de configuração do icecast deve estar compatível com o número de fontes de rádio desejada. Neste exemplo, como serão duas estações de rádio, este parâmetro deverá estar configurado com o valor 2 ou maior. Por exemplo “<sources>2</sources>”.
  • Passo 5- reiniciar o icecast2 e as duas instâncias do IceS:


# killall ices2
# /etc/init.d/icecast2 restart
# ices2 /etc/ices2/ices-playlist_2.xml
# ices2 /etc/ices2/ices-playlist.xml

Para certificar-se que as instâncias foram realmente criadas, verifique conforme exemplo a seguir:

$ ps aux | grep -E "COMMAND|ices"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     29619  3.8  0.0 113988  3072 ?        Sl   18:19   2:19 ices2 /etc/ices2/ices-playlist-canal1.xml
root     29624  3.9  0.0 113916  3012 ?        Sl   18:19   2:24 ices2 /etc/ices2/ices-playlist-canal2.xml
root     29629  4.0  0.0 113868  3000 ?        Sl   18:19   2:25 ices2 /etc/ices2/ices-playlist-canal3.xml

5. Para ouvir a rádio
Com o navegador, abra a URL onde está inslado o serviço de rádio e se ouvir o streming de áudio tudo estará funcionando:
http://localhost:8000/canal1.ogg
e
http://localhost:8000/canal2.ogg

Como opção, utilize um player de áudio para ouvir sua rádio. Existem boas opções para isto, como através do VLC ou mplayer:
a) VLC: use a opção “Midia -> Abrir fluxo de Rede” e digite o seguinte endereço….
http://localhost:8000/canal1.ogg para ouvir a rádio 1; ou http://localhost:8000/canal2.ogg para ouvir a rádio2;
b) mplayer: digite o comando mplayer http://localhost:8000/canal1.ogg ou mplayer http://localhost:8000/canal2.ogg para ouvir a rádio1 ou rádio2, respectivamente.

6. A rádio na página html (através de embed player)

De uma forma simples, coloque o código abaixo em sua página html:

<audio src="http://<ip-servidor ou nome-servidor>:8000/canal1.ogg" controls="controls"> Tente usar outro navegador para abrir o player <a href="http://br.mozdev.org/download/" target="_blank"> Firefox, </a> <a href="http://www.google.com/chrome" target="_blank">Chrome, </a> <a href="http://www.opera.com/browser/download/" target="_blank">ou Opera. </a> </audio>

7. Consumo de banda

A codificação do áudio é uma etapa importante, pois impacta na largura de banda que será ocupada para transmitir o stream. Por exemplo, se um áudio for codificado (ogg, mp3 ou outro formato) em um bitrate de 128Kbps, e stream esteja em modo estéreo, cada ouvinte da rádio vai consumir 256 Kbps de banda. Para se ocupar uma banda menor, poderia-se trabalhar com 32Kbps stereo que ainda proporcionará uma qualidade aceitável.

Com o intuito de se ter uma banda pequena, por experiências práticas, possíveis valores ideais para uma rádio via internet seriam bitrate de 16 ou 24kbps, sample rate de 11,025KHz ou 22,05KHz e 16 bits “per sample”.

8. Acompanhar os acessos e possíveis erros do Icecast e IceS
Os logs de acessos, alertas e erros podem ser visualizados através dos seguintes arquivos:

/var/log/icecast2/access.log
/var/log/icecast2/error.log
/var/log/ices/ices.log

OBS: caso seja necessário acompanhar a produção de mensagens de logs em medida em que estas são produzidas, abra terminais específicos e em cada um execute um dos comandos a seguir:

$ tail -f /var/log/icecast2/access.log
ou
$ tail -f /var/log/icecast2/error.log
ou
$ tail -f /var/log/ices/ices.log

9. Página de administração

Acesse a página….

http://localhost:8000/
e obtenha a seguinte página:

Página de administração do Icecast2

11. “Ripar” um CD
Um aplicativo bastante prático (muito fácil de usar) para fazer a ripagem de faixas de áudio CD é o RipperX, um programa escrito em GTK. Ele suporta buscas CDDB para informações de álbum e faixas. O aplicativo está disponível nos repositórios da distribuição Debian.

Fiz alguns testes com o RipperX, ripando um arquivo de música WAV de 36MB, onde obtive os seguintes resultados:

# Teste bitrate VBR VBR Quality Encoder priority Arquivo .ogg gerado
1 48kbps YES 6 10 1,0 MB
2 64kbps YES 6 10 1,4 MB
3 128kbps YES 6 10 2,5 MB
4 128kbps NO 10 2,5 MB

Se desejar codificar o áudio em MP3, utilize um codificador especializado. Um bom exemplo é o Lame.

# apt-get install lame

Codificador Lame

12. Glossário

  • Codec: é o acrônimo de Codificador/Decodificador, dispositivo de hardware ou software que codifica/decodifica sinais. Existem dois tipos de codecs: sem perdas e com perdas.Exemplos de algoritmos com perda de qualidade:

a) algoritmos especificados para áudio digital:
Vorbis;
MPEG-Layer 3, conhecido por meio da sigla MP3. É um formato restrito e patenteado;
Advanced Audio Coding, codec proprietário conhecido por meio da sigla AAC. Projetado para ser o sucessor do MP3;
Dolby Digital/AC-3 e variantes EX; Surround EX;
Windows Media Audio, conhecido por meio da sigla WMA.

b) algoritmos especificados para vídeo digital:
Theora;
H.264/MPEG-4 AVC, que não utilize algoritmo H.264 Lossless;
H.263;
Windows Media Video, conhecido por meio da sigla WMV;
MPEG-4 Parte dois (em Inglês: MPEG-4 Part Two);
MPEG-2.

Para mais detalhes veja o post Comparison of audio formats.

  • Theora logoTheora: é um formato (algoritmo) para codificação de vídeo, com perda de dados, desenvolvido pela Fundação Xiph.org sendo uma parte do projeto Ogg. O codec libtheora é uma implementação do formato de compressão de vídeo Theora. O Theora é semelhante ao MPEG-4 parte 2, XviD e DivX. Sua extensão de arquivo é .ogv. O Theora é frequentemente usado em um contêiner Ogg. Isto é então chamado de Ogg Theora.
  • Vorbis logoVorbis: é um formato (algoritmo) para codificação de áudio, destinado a gravar música e voz consumindo pouco espaço virtual, desenvolvido pela Fundação Xiph.org. O Vorbis faz compactação com perda de qualidade, de modo a reduzir intensamente o espaço virtual necessário para reter os arquivos. Vorbis é comumente usado em conjunto com o formato de contêiner Ogg e, portanto, é muitas vezes referida como Ogg Vorbis. A especificação do Vorbis é de domínio público.
  • Ogg logoOgg: é uma especificação de contêiner, ou seja, uma especificação de um formato de arquivo destinado ao encapsulamento de multimídia orientado a stream. O formato de contêiner Ogg pode multiplexar uma série de fluxos independentes de áudio, vídeo, texto (como legendas) e metadados. É muito utilizado na internet para implementação de rádios e carregamentos de vídeos ao vivo em que não há necessidade de se ter todo o conteúdo baixado para começar a ouvi-lo/vê-lo. Sendo um formato de contêiner, Ogg pode incorporar audio e video em vários formatos (tais como Dirac, MNG, CELT, MPEG-4, MP3 e outros). A especificação do Ogg é livre e de domínio público.
  • MP3 logoMP3: MPEG-1/2 Audio Layer 3 é um tipo de compressão de áudio com perdas cujo bitrate (taxa de bits) é da ordem de kbps (quilobits por segundo), sendo 128 kbps a taxa padrão. Nesta taxa, a redução do tamanho do arquivo é de cerca de 90%, ou seja, o tamanho do arquivo passa a ser 1/10 do tamanho original. Para efeitos de comparação, as músicas de um CD de audio comum possuem uma taxa de amostra de dados de 1411,2 kbps. Na qualidade MP3 padrão, de 128 kbps, um arquivo MP3 necessita de 0,92 MB/min. de áudio para ser armazenado. A Thomson Consumer Electronics controla o licenciamento da patente do MPEG-1/2 Layer 3 nos poucos países que reconhecem patentes de software, tais como Estados Unidos e Japão. Em setembro de 1998, o Instituto Fraunhofer enviou um comunicado a diversos desenvolvedores de programas MP3, exigindo cobrança de royalties por essa patente. O comunicado informava que o licenciamento era necessário para “distribuir e/ou vender decodificadores e/ou codificadores”, e que os produtos não licenciados infringiam os “direitos sobre a patente do Instituto Fraunhofer e da Thomson. Para produzir, vender e/ou distribuir produtos que se utilizem do padrão MPEG-1/2 Audio Layer 3 e, portanto, de suas respectivas patentes, é necessário obter uma licença”. Tal iniciativa revelou a necessidade de promover formatos realmente livres, como o padrão ogg vorbis.
  • Lame LogoLame: é um codificador (codec) de áudio MPEG Layer III (MP3) de alta qualidade, licenciado sob a LGPL, que pode ser usado com a maioria dos programas que convertem arquivos WAV em arquivos MP3 ou a partir de outros formatos ou suportes. Nos dias atuais, LAME tem sido considerado o melhor codificador de MP3 de médias para altas taxas de bitrates, e para VBR. Melhorias na qualidade e na velocidade ainda estão acontecendo, provavelmente fazendo LAME ser o único codificador de MP3 que ainda tem desenvolvimento ativo.
  • chroot logochroot: um aplicativo “chrootado” é trancado em um diretório específico e não pode passar para o resto da árvore de diretórios, e vê esse diretório como seu diretório raiz “/” (“root”). O objetivo é um serviço seguro.Mas qualquer aplicação que deve funcionar com privilégios de root é inútil no escopo do chroot, já que o root pode sair do chroot. Veja o manual do comando “chroot” para maiores detalhes. O chroot permite alterar o diretório-raiz. Isto é, pode-se designar uma “nova” hierarquia de diretório-raiz onde sua web residirá. Nessa hierarquia de diretório, cria-se um sistema de arquivos Linux em miniatura. Esse ambiente é muitas vezes chamado de “prisão” porque mesmo se invasores conseguirem explorar alguma fraqueza no sistema de web, o acesso deles não poderá vazar para o sistema de arquivos principal.

Links úteis
1- Documentação do Icecast
2- Run Your Own Webradio Station With Icecast2 And Ices2
3- Radiostreaming for beginners
4- Montando um servidor de Webradio
5- Servidor de Webradio
6- Ogg Vorbis Streaming: ices2 HOWTO
7- Comparison of video container formats
8- Comparison of audio coding formats

comentários
  1. Marcos Felipe disse:

    Amigo so serve se o conector de audio estiver na maquina do ices2 ????
    Meu servidor é nas nuvens e não tenho como por um driver nele …rsrsrs xD

Deixe um comentário, pois isto é muito motivante para continuarmos este trabalho

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s