Roteie o fluxo do ICECAST para um dispositivo fictício alsa

Roteie o fluxo do ICECAST para um dispositivo fictício alsa

Quero transmitir um fluxo de icecast para udp via FFmpeg, mas se o fluxo de icecast for descartado, o FFmpeg também será descartado. Suponho que se eu pudesse rotear o fluxo do icecast para um dispositivo fictício, então poderia obter dados dele via FFmpeg. Por exemplo:

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

Então, no caso de queda do fluxo do icecast, o fluxo udp de saída será reproduzido silenciosamente e continuará reproduzindo o áudio até que este fluxo esteja disponível novamente. (Esta é minha suposição).

Existe uma maneira de rotear o fluxo do icecast para um dispositivo fictício?Ou existe outra variante para rotear o fluxo do icecast para o udp para reproduzir silenciosamente em caso de interrupção do fluxo do icecast e, em seguida, retornar automaticamente à reprodução normal quando o fluxo do icecast estiver disponível novamente?

Responder1

Interpreto seu comentário como "usar o Pulseaudio para fazer isso está ok". Eu não testei isso, mas aqui está o que eu faria:

Primeiro, crie um coletor "nulo" do Pulseaudio:

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

No Pulseaudio, cada coletor possui uma .monitorfonte associada, portanto, desta forma você pode enviar o som para o icecastcoletor e processar em outros aplicativos usando a icecast.monitorfonte.

Se eu entendi corretamente, você querrecebero fluxo do icecast no seu computador. Para enviar o fluxo para o icecastcoletor, faça algo como

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

Quando o fluxo do icecast terminar, mplayerele também terminará, então envolva-o em um script de shell dentro de um whileloop infinito, etc.

Não tenho certeza se entendi o que você está tentando fazer com a parte "transmitir para udp via ffmpeg". De qualquer forma, agora você pode ler icecast.monitorcom

ffmpeg -f alsa -i pulse ...

ao usar pavucontrolou pamcdpara selecionar a fonte correta ou, se você ffmpegfor compilado com suporte a pulseaudio, diretamente

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

No entanto, se a ideia for "Quero distribuir esse fluxo de icecast para outros computadores na minha rede doméstica", talvez seja melhor usar umMódulo RTP Pulseaudiocomo a pia em primeiro lugar.

Como eu disse, nada disso é testado, talvez seja necessário ajustar peças para que funcione.

Editar

Também não tenho certeza se um dispositivo fictício ALSA funcionaria em primeiro lugar; no meu entender, eles são apenas dispositivos "fictícios" e não fornecem loopback. Você teria que usar o snd-aloopdispositivo de loopback para isso, e este é um pouco chato, porque você constantemente se depara com problemas de taxa de amostragem, etc.

Então é melhor usar a infraestrutura Pulseaudio.

Responder2

Você pode usar o dispositivo Loopback em vez do dispositivo Dummy.

O dispositivo Loopback não está habilitado por padrão, então você deve primeiro carregar o módulo do kernel snd-aloop com argumentos para especificar o tipo desejado e o número de substreams:

# modprobe snd-aloop index=0 pcm_substreams=1

Então, em vez de rotear o icecast para hw:Dummy,0, você pode roteá-lo hw:Loopback,0,0e ler esse fluxo no ffmpeg de hw:Loopback,1,0.

informação relacionada