
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 .monitor
fuente asociada, por lo que de esta manera puede enviar sonido al icecast
receptor y procesarlo en otras aplicaciones usando la icecast.monitor
fuente.
Si te entiendo bien, quieresrecibirla transmisión icecast en su computadora. Para enviar la transmisión al icecast
receptor, haga algo como
mplayer http://your.icecast.server -ao pulse::icecast
Cuando finalice la transmisión de icecast, mplayer
también terminará, así que envuélvalo en un script de shell dentro de un while
bucle 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.monitor
con
ffmpeg -f alsa -i pulse ...
mientras usa pavucontrol
o pamcd
para seleccionar la fuente correcta, o, si ffmpeg
está 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-aloop
dispositivo 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,0
y leer esa transmisión en ffmpeg desde hw:Loopback,1,0
.