Rota fluxo ICECAST para alsa dispositivo fictício

0

Eu quero transmitir um stream icecast para o ufp via FFmpeg, mas se o stream icecast for descartado, o FFmpeg também cai. Eu suponho que se eu pudesse encaminhar o stream icecast para um dispositivo fictício, então eu poderia obter dados dele via FFmpeg. Por exemplo:

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

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

Existe uma maneira de encaminhar o stream icecast para outro dispositivo fictício? Ou existe outra variante para encaminhar o fluxo icecast para o udp para reproduzir silenciosamente em caso de abandono do fluxo icecast e depois voltar automaticamente ao normal jogando quando o stream icecast estiver disponível novamente?

    
por Ivan Kolesnikov 11.08.2017 / 08:31

2 respostas

1

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

Primeiro, crie um coletor "nulo" Pulseaudio:

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

No Pulseaudio, cada coletor tem uma fonte .monitor associada, de modo que você pode emitir som para o icecast sink e processar em outros aplicativos usando a icecast.monitor source.

Se eu entendi corretamente, você precisa receber o stream icecast no seu computador. Para enviar o fluxo para o icecast sink, faça algo como

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

Quando o fluxo icecast terminar, mplayer também será encerrado, então coloque isso em um script de shell dentro de um loop while infinito, etc.

Não tenho certeza se entendi o que você está tentando fazer com a parte "stream to udp via ffmpeg". De qualquer forma, agora você pode ler a partir de icecast.monitor com

ffmpeg -f alsa -i pulse ...

ao usar pavucontrol ou pamcd para selecionar a fonte correta ou, se o seu ffmpeg estiver compilado com o suporte pulseaudio, diretamente

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

No entanto, se a ideia for "Eu quero distribuir esse fluxo icecast para outros computadores na minha rede doméstica", pode ser melhor usar um Módulo Pulseaudio RTP como o coletor em primeiro lugar.

Como eu disse, nada disso foi testado, você pode ter que ajustar partes para que funcione.

Editar

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

Então, é melhor usar a infraestrutura do Pulseaudio.

    
por 14.08.2017 / 12:05
1

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 kernel do snd-aloop com argumentos para especificar o tipo e o número de substreams desejados:

# modprobe snd-aloop index=0 pcm_substreams=1

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

    
por 14.08.2017 / 21:31