Enrutar la transmisión ICECAST al dispositivo ficticio alsa

Enrutar la transmisión ICECAST al dispositivo ficticio alsa

Quiero transmitir una transmisión icecast a udp a través de FFmpeg, pero si la transmisión icecast se eliminará, FFmpeg también se eliminará. Supongo que si pudiera enrutar la transmisión de Icecast a un dispositivo ficticio, entonces podría obtener datos a través de FFmpeg. Por ejemplo:

ffmpeg -f alsa -i hw:Dummy,0 -f mpegts udp://ip:port

Luego, en caso de que se caiga la transmisión icecast, la transmisión udp de salida se reproducirá en silencio y continuará reproduciendo audio hasta que esta transmisión esté disponible nuevamente. (Esta es mi suposición).

¿Hay alguna manera de enrutar la transmisión de icecast a un dispositivo ficticio alsa?¿O existe otra variante para enrutar la transmisión de icecast a udp para reproducirla en silencio en caso de que se interrumpa la transmisión de icecast y luego volver automáticamente a la reproducción normal cuando la transmisión de icecast esté disponible nuevamente?

Respuesta1

Interpreto tu comentario como "usar Pulseaudio para hacerlo está bien". No he probado esto, pero esto es lo que haría:

Primero, cree un receptor "nulo" de Pulseaudio:

pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast

En Pulseaudio, cada receptor tiene una .monitorfuente asociada, por lo que de esta manera puede enviar sonido al icecastreceptor y procesarlo en otras aplicaciones usando la icecast.monitorfuente.

Si te entiendo bien, quieresrecibirla transmisión icecast en su computadora. Para enviar la transmisión al icecastreceptor, haga algo como

mplayer http://your.icecast.server -ao pulse::icecast

Cuando finalice la transmisión de icecast, mplayertambién terminará, así que envuélvalo en un script de shell dentro de un whilebucle infinito, etc.

No estoy seguro de entender lo que intenta hacer con la parte "transmitir a udp a través de ffmpeg". En cualquier caso, ahora puedes leer icecast.monitorcon

ffmpeg -f alsa -i pulse ...

mientras usa pavucontrolo pamcdpara seleccionar la fuente correcta, o, si ffmpegestá compilando con soporte de pulseaudio, directamente

ffmpeg -f pulse -i icecast.monitor ...

Sin embargo, si la idea es "Quiero distribuir esa transmisión Icecast a otras computadoras en mi red doméstica", puede ser mejor usar unMódulo Pulseaudio RTPcomo el fregadero en primer lugar.

Como dije, nada de esto está probado, es posible que tengas que ajustar piezas para que funcione.

Editar

Tampoco estoy seguro de que un dispositivo ficticio de ALSA funcione en primer lugar; según tengo entendido, en realidad son solo dispositivos "ficticios" y no proporcionan bucle invertido. Tendrías que usar el snd-aloopdispositivo loopback para eso, y este es un poco molesto, porque constantemente te encuentras con problemas de frecuencia de muestreo, etc.

Así que es mejor que utilices la infraestructura de Pulseaudio.

Respuesta2

Puede utilizar el dispositivo Loopback en lugar del dispositivo ficticio.

El dispositivo Loopback no está habilitado de forma predeterminada, por lo que primero debe cargar el módulo del kernel snd-aloop con argumentos para especificar el tipo deseado y la cantidad de subsecuencias:

# modprobe snd-aloop index=0 pcm_substreams=1

Luego, en lugar de enrutar icecast a hw:Dummy,0, puede enrutarlo hw:Loopback,0,0y leer esa transmisión en ffmpeg desde hw:Loopback,1,0.

información relacionada