
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 .monitor
fonte associada, portanto, desta forma você pode enviar o som para o icecast
coletor e processar em outros aplicativos usando a icecast.monitor
fonte.
Se eu entendi corretamente, você querrecebero fluxo do icecast no seu computador. Para enviar o fluxo para o icecast
coletor, faça algo como
mplayer http://your.icecast.server -ao pulse::icecast
Quando o fluxo do icecast terminar, mplayer
ele também terminará, então envolva-o em um script de shell dentro de um while
loop 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.monitor
com
ffmpeg -f alsa -i pulse ...
ao usar pavucontrol
ou pamcd
para selecionar a fonte correta ou, se você ffmpeg
for 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-aloop
dispositivo 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,0
e ler esse fluxo no ffmpeg de hw:Loopback,1,0
.