Sou novo no ices2 e no icecast2, mas consegui configurar um stream onde posso me ouvir em meus fones de ouvido. Então, algum sucesso básico com o sistema. Agora, o verdadeiro objetivo:
Gostaríamos de transmitir em 8 idiomas diferentes usando os recursos de interface de áudio de um gravador Zoom R16. Fazendo arecord --dump-hw-params hw1,0
no R16, ele retorna:
Recording WAVE 'hw1,0' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "default":
--------------------
ACCESS: RW_INTERLEAVED
FORMAT: U8 S16_LE S16_BE S24_LE S24_BE S32_LE S32_BE FLOAT_LE FLOAT_BE MU_LAW A_LAW S24_3LE S24_3BE
SUBFORMAT: STD
SAMPLE_BITS: [8 32]
FRAME_BITS: [8 1024]
CHANNELS: [1 32]
RATE: [1 384000]
PERIOD_TIME: (2 4294967295)
PERIOD_SIZE: [1 1398102)
PERIOD_BYTES: [128 1398102)
PERIODS: [3 1024]
BUFFER_TIME: (7 4294967295]
BUFFER_SIZE: [3 4194304]
BUFFER_BYTES: [384 4194304]
TICK_TIME: ALL
--------------------
Pergunta 1: Qual é o significado dos números com espaços entre eles, como SAMPLE_BITS: [8 32]
? Isso significa que os bits de amostra podem ser 8, 16 ou 32?
Pergunta 2: Como resolver "EROR input-alsa/alsa_open_module Formato de exemplo não disponível: argumento inválido"
Quando tento iniciar o ices2, ele simplesmente fecha e o log diz:
[2023-12-10 20:48:46] INFO ices-core/main IceS 2.0.3 started...
[2023-12-10 20:48:46] EROR input-alsa/alsa_open_module Sample format not available: Invalid argument
[2023-12-10 20:48:46] EROR input/input_loop Couldn't initialise input module "alsa"
[2023-12-10 20:48:46] INFO ices-core/main Shutdown complete
O arquivo de configuração que estou usando para ices2 é:
<?xml version="1.0"?>
<ices>
<!-- run in background --> <background>0</background>
<!-- where logs go. --> <logpath>/var/log/ices2</logpath>
<logfile>ices.log</logfile>
<!-- size in kilobytes --> <logsize>2048</logsize>
<!-- 1=error, 2=warn, 3=infoa ,4=debug --> <loglevel>4</loglevel>
<!-- logfile is ignored if this is set to 1 --> <consolelog>0</consolelog>
<!-- optional filename to write process id to --> <pidfile>/var/log/ices2/ices.pid</pidfile>
<stream>
<!-- metadata used for stream listing -->
<metadata>
<name>8 Languages</name>
<genre>Dharma Teaching</genre>
<description>Translation of 2024 International Spring Festival</description>
<url>http://localhost/</url>
</metadata>
<!-- Input module.
This example uses the 'alsa' module. It takes input from the
ALSA audio device (e.g. line-in), and processes it for live
encoding. -->
<input>
<module>alsa</module>
<param name="rate">48000</param>
<param name="channels">8</param>
<param name="device">hw:1,0</param>
<param name="periods">2</param>
<!-- Read metadata (from stdin by default, or -->
<!-- filename defined below (if the latter, only on SIGUSR1) -->
<param name="metadata">1</param>
<param name="metadatafilename">testES</param>
</input>
<!-- Stream instance.
You may have one or more instances here. This allows you to
send the same input data to one or more servers (or to different
mountpoints on the same server). Each of them can have different
parameters. This is primarily useful for a) relaying to multiple
independent servers, and b) encoding/reencoding to multiple
bitrates.
If one instance fails (for example, the associated server goes
down, etc), the others will continue to function correctly.
This example defines a single instance doing live encoding at
low bitrate. -->
<instance>
<!-- Server details.
You define hostname and port for the server here, along
with the source password and mountpoint. -->
<hostname>localhost</hostname>
<port>8000</port>
<password>hackme</password>
<mount>/spanish.ogg</mount>
<yp>1</yp> <!-- allow stream to be advertised on YP, default 0 -->
<!-- Live encoding/reencoding:
channels and samplerate currently MUST match the channels
and samplerate given in the parameters to the alsa input
module above or the remsaple/downmix section below. -->
<encode>
<quality>0</quality>
<samplerate>24000</samplerate>
<channels>8</channels>
</encode>
<!-- stereo->mono downmixing, enabled by setting this to 1 -->
<downmix>0</downmix>
<!-- resampling.
Set to the frequency (in Hz) you wish to resample to, -->
<resample>
<in-rate>48000</in-rate>
<out-rate>24000</out-rate>
</resample>
</instance>
</stream>
</ices>
Mas no geral, o que eu gostaria de saber é:
Pergunta 3: O que precisa ser inserido no arquivo de configuração para que o canal 1 do gravador possa ser transmitido em espanhol, o canal 2 em francês, o canal 3 em alemão, ... canal 8. Presumo que realmente precise de 8 configurações diferentes arquivos e execute 8 instâncias do ices2, mas como selecionar o canal certo?
Editar: posso dizer também que isso funciona para gravar um arquivo wav de 8 canais:
arecord -D hw:1,0 -f S32_LE -r 48000 -c 8 testr16.wav
OK, fiz funcionar, com estas áreas principais:
~/.asoundrc
-- Use
dsnoop
para dividir-- Todos os fluxos de um dispositivo de hardware precisam usar o mesmo ipc_key.
- O dispositivo está
plug:{name from .asoundrc}
- Acerte os canais. Eu tinha deixado configurado para 8 canais, embora a alsa agora estivesse fornecendo um pcm de canal único, o que resultou em ruídos estridentes sendo transmitidos!
/etc/icecast2/icecast.xml
teve que aumentar<sources>8</sources>
Aqui está o final
~/.asoundrc
. Observe que como todos os canais dsnoop vêm do mesmo dispositivo de hardware, eles precisam ter o mesmo ipc_key. Caso contrário, assim que você iniciar a gravação de um canal, o restante reportará como Dispositivo está ocupado .Não se esqueça de reiniciar o ALSA:
sudo /etc/init.d/alsa-utils restart
Então criei 8 arquivos de configuração ices2 separados,
E aqui está o arquivo de configuração. As três coisas que mudam são o dispositivo, a montagem e o pid:
dispositivo:
plug:ch1
paraplug:ch8
montar:
ch1.ogg
parach8.ogg
arquivo PID:
r16.1.pid
parar16.8.pid
Algumas boas informações aqui:
https://alsa.opensrc.org/Asoundrc https://bootlin.com/blog/audio-multi-channel-routing-and-mixing-using-alsalib/