Acheminez le flux ICECAST vers le périphérique fictif alsa

0

Je souhaite transmettre un flux icecast à udp via FFmpeg, mais si le flux icecast doit être supprimé, FFmpeg est également supprimé. Je suppose que si je pouvais acheminer le flux icecast vers un autre appareil factice, je pourrais en obtenir les données via FFmpeg. Par exemple:

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

Ensuite, en cas de chute du flux icecast, le flux de sortie udp sera lu en mode silencieux et continuera à être lu jusqu'à ce que ce flux soit à nouveau disponible. (Ceci est mon hypothèse).

Existe-t-il un moyen de router le flux icecast vers un autre appareil factice? Ou existe-t-il une autre variante permettant de router le flux icecast vers udp afin de le lire en mode silencieux en cas d'abandon du flux icecast, puis de revenir automatiquement à la lecture normale lorsque le flux icecast est à nouveau disponible?

Ivan Kolesnikov
la source
Vous avez tagué cette question avec pulseaudio. Doit-il s'agir d'un périphérique factice ALSA ou peut-il également s'agir d'une source Pulseaudio? Beaucoup plus facile à mettre en place (même si je ne suis pas sûr du comportement démarrage / arrêt, je devrais le savoir).
dirkt
@dirkt Merci pour le commentaire! C'est un dispositif factice ALSA. J'ai tagué la question avec pulseaudio, car si j'ai bien compris, nous pouvons utiliser pulseaudio pour router un flux icecast vers un périphérique fictif ALSA. Mais je peux me tromper) Dans tous les cas, je veux créer un périphérique audio virtuel -> y diriger un flux icecast -> obtenir ce flux à partir du périphérique audio virtuel via ffmpeg. Toute solution sera appropriée, sans aucune condition obligatoire)
Ivan Kolesnikov

Réponses:

1

J'interprète votre commentaire comme "utiliser Pulseaudio pour le faire est correct". Je n'ai pas testé cela, mais voici ce que je ferais:

Tout d’abord, créez un évier Pulseaudio "null":

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

Dans Pulseaudio, chaque récepteur a une .monitorsource associée . Vous pouvez ainsi émettre du son sur le icecastrécepteur et le traiter dans d'autres applications utilisant la icecast.monitorsource.

Si je vous ai bien compris, vous souhaitez recevoir le flux icecast sur votre ordinateur. Pour sortir le flux dans l’ icecastévier, procédez comme suit:

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

Lorsque le flux icecast se termine, mplayerse terminera également, alors enroulez-le dans un script shell à l'intérieur d'une whileboucle infinie , etc.

Je ne suis pas sûr de comprendre ce que vous essayez de faire avec la partie "stream to udp via ffmpeg". Dans tous les cas, vous pouvez maintenant lire à partir icecast.monitorde

ffmpeg -f alsa -i pulse ...

en utilisant pavucontrolou pamcdpour sélectionner la bonne source, ou, si vous ffmpegcompilez avec le support pulseaudio, directement

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

Toutefois, si l’idée est "Je souhaite distribuer ce flux icecast à d’autres ordinateurs de mon réseau domestique", il peut être préférable d’utiliser un module RTP Pulseaudio comme récepteur .

Comme je l'ai dit, rien de tout cela n'a été testé, vous devrez peut-être ajuster les pièces pour que cela fonctionne.

Modifier

Je ne suis pas sûr non plus qu'un dispositif factice ALSA fonctionnerait en premier lieu, à ma connaissance, il ne s'agit en réalité que de dispositifs "factices" et ne fournit pas de boucle de rappel. Vous devez utiliser le snd-alooppériphérique de bouclage pour cela, et celui-ci est un peu pénible, car vous rencontrez constamment des problèmes de taux d'échantillonnage, etc.

Vous valez donc mieux utiliser l'infrastructure Pulseaudio.

dirkt
la source
Merci beaucoup! J'ai vérifié et ça marche très bien! Silencieux lorsque le flux icecast est arrêté et que la lecture se poursuit sans erreur! La sortie UDP est stable!
Ivan Kolesnikov
1

Vous pouvez utiliser le périphérique de bouclage au lieu du périphérique factice.

Le périphérique Loopback n'étant pas activé par défaut, vous devez d'abord charger le module de noyau snd-aloop avec des arguments pour spécifier le type et le nombre de sous-flux souhaités:

# modprobe snd-aloop index=0 pcm_substreams=1

Ensuite, au lieu d’acheminer icecast vers hw:Dummy,0, vous pouvez l’acheminer hw:Loopback,0,0et lire ce flux dans ffmpeg depuis hw:Loopback,1,0.

Aaron Muir Hamilton
la source
Merci d'avoir répondu! Pouvez-vous s'il vous plaît expliquer comment acheminer un flux icecast vers alsa loopback device?
Ivan Kolesnikov
1
@ IvanKolesnikov Cela devrait être réalisable avec tout lecteur capable de diffuser depuis IceCast, tant que vous jouez sur le périphérique hw: Loopback, 0,0 Par exemple, avec MPV mpv --audio-device=alsa/hw:Loopback,0,0 http://example.com/path/to/icecast/streamou avec SoX, vous le feriez sox http://example.com/path/to/icecast/stream -t alsa hw:Loopback,1,0.
Aaron Muir Hamilton