Aqui está o truque ... O FFmpeg e suas ferramentas relacionadas, FFserver e FFplay, não possuem nenhum mecanismo para troca de entrada ao vivo para uma única saída em execução. Eles também não têm nenhuma maneira interna de acionar um evento externo quando um fluxo UDP é iniciado; pelo menos nenhum que eu tenha sido capaz de encontrar.
Para realizar a ação pretendida, a solução one seria iniciar uma instância do FFmpeg para enviar um fluxo da sua imagem do PSB para o seu servidor, e depois - quando o UDP original o fluxo começa a chegar - mate esse fluxo e inicie um segundo com o conteúdo do fluxo UDP. Tanto o FFmpeg quanto o FFplay irão 'girar' (isto é, ficar em um estado de escuta) se uma entrada do fluxo UDP for especificada, mas o fluxo não estiver sendo recebido, portanto, uma instância registrada do FFplay pode ser usada como disparador. (Ao iniciar uma segunda instância do FFmpeg enquanto o primeiro está em execução, você apenas vai eliminar a transmissão do stream para o seu servidor).
Naturalmente, matar o primeiro fluxo e iniciar um segundo pode não ser o ideal, mas se uma interrupção muito curta no fluxo do RTMP for aceitável, ele deve fazer o truque para você. Se nenhuma interrupção for aceitável, você terá que seguir a rota de empurrar a imagem do PSB e os fluxos UDP para pipes nomeados e, em seguida, empurrá-los para o seu servidor RTMP através de uma terceira instância do FFmpeg usando o demuxer de concat. Nesse caso, você precisaria de codificadores de áudio e vídeo com correspondência exata nos dois fluxos iniciais para que o concat funcionasse e, como você está transmitindo um fluxo de terceiros, há um potencial para problemas se o streamer original alterar suas configurações.
De qualquer forma, aqui está um link para um script bash bem básico que executa o cenário kill1-start2 como descrevi. (Script on Slexy. org) . Vou avisá-lo de que não sou especialista em scripts, por isso alguém pode encontrar um método mais simples e / ou mais limpo de fazer isso.