Existe uma maneira de misturar entre dois fluxos RTMP (dependendo do que está acima) usando algo como o FFMPEG?

5

(Desculpas sobre o título da pergunta, não tenho certeza de como traduzi-lo)

Estou trabalhando em uma solução / servidor de streaming pronto para uso para uma LAN local, usando o fantástico nginx-rtmp para lidar com fluxos RTMP recebidos de nossos PCs principais e entregar (esperançosamente) um sinal ininterrupto para o Twitch e outros serviços de streaming.

Uma das principais coisas que eu gostaria de alcançar é fazer com que o servidor mude, digamos, para uma webcam local (ou outro fluxo) se não estivermos enviando nada para ele, o que aperfeiçoaria a abordagem de tempo de inatividade zero Eu estou apontando para. Eu olhei em usando ffmpeg para isso, com argumentos ao longo da linha de:

ffmpeg -i "rtmp://127.0.0.1/in/stream" -i "rtmp://127.0.0.1/webcam/stream" -vcodec copy -acodec copy rtmp://127.0.0.1/out/stream

mas o ffmpeg se recusa a iniciar a saída a menos que esteja recebendo ambas as entradas e pare completamente se perder uma.

O problema é que não consigo pensar em nenhuma alternativa, a não ser:

  • conectando-se ao gancho on_publish_done do nginx-rtmp e disparando um script ou algo para acionar um fluxo de webcam para iniciar após um pequeno atraso (e depois parar esse fluxo usando a interface de controle) ou
  • ter outro sistema executando algo como o Open Broadcaster Software e lidar com a mixagem

Se alguém tem alguma idéia, não importa o quão boba, eu realmente aprecio isso, porque eu estou perplexa!

    
por duck. 19.02.2014 / 00:02

1 resposta

2

Até onde sei, seu fluxo de trabalho não pode ser feito dentro do FFmpeg. Esse fluxo de trabalho pode ser feito do lado do servidor no Wowza Streaming Engine usando um módulo chamado Loop até Live.

link

Lógica básica.

  1. O fluxo 1 é o fluxo de "backup". Pode ser um arquivo de pré-lançamento de VOD ou uma transmissão ao vivo.
  2. O fluxo 2 é o fluxo principal.
  3. Se apenas o fluxo 1 estiver em execução, então o fluxo atual 1. Quando o fluxo 2 estiver presente, mude para o fluxo 2 em um quadro-chave.
  4. Se o fluxo 2 for interrompido, mude para o fluxo 1 em um quadro-chave.

Eu não encontrei essa lógica no FFmpeg.

Observe que é ideal que todos os fluxos sejam idênticos ao alternar de um para o outro.

Vídeo: codec, largura, altura, FPS, distância do quadro-chave (GOP) e taxa de bits. Áudio: Codec, canais, frequência e taxa de bits.

FFmpeg é uma cadeia de filtros dependente de ordem que recebe entrada, modifica e produz saída. Você pode colocar imagens ou vídeos e imagens de saída ou vídeo. O áudio é semelhante ao que você pode colocar um codec, modificá-lo e despejá-lo no formato de áudio de sua escolha.

Você pode ter várias entradas e várias saídas. No caso de múltiplas entradas, estas podem ser alteradas para um único fluxo de saída.

Áudio e vídeo provenientes de diferentes fontes para criar uma saída.

ffmpeg -i video.input -i audio.input -[modifications] -output

Áudio e vídeo provenientes de uma fonte, mas indo para várias saídas. Eu cubro isso em um post no meu blog.

link

O FFmpeg é simples por design e não encontrei nada no código que possa suportar seu fluxo de trabalho. Não significa que eu não tenha sentido falta disso.

Eu sei que esta não é a resposta que você queria, no entanto, você pode adicionar código ao FFmpeg para suportar essa funcionalidade ou criar uma ferramenta para executar essa função fora do FFmpeg. Qualquer código criado também deve ter entrada neutra e suporte a RTSP, RTMP, MPEG-TS, RTP / SDP, HLS e um arquivo de loop. Como isso não resolve o seu problema, não tenho expectativa de receber sua recompensa de 50%.

    
por 12.04.2017 / 19:14