Como processar um fluxo de transporte MPEG em loop com o FFmpeg

0

Esta é a minha configuração atual: Uma máquina Windows transmite um arquivo .ts via VLC Media Player na configuração "RTP / Transport Stream" para uma máquina Debian. O Stream se desenrola em um loop infinito. Na máquina Debian, eu quero que o FFmpeg pegue o fluxo de entrada e o encaminhe para localhost:[different port] . Eu monitore o fluxo encaminhado com ffplay .

Veja como eu inicio o ffmpeg:

ffmpeg -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5005?fifo_size=10000 -c copy -f mpegts udp://127.0.0.1:1234

O jogador é iniciado com

ffplay udp://localhost:1234

Até agora, tudo parece funcionar bem ... até que o vídeo transmitido termine e comece de novo. Nesse caso, o FFmpeg se espalha um pouco com essas mensagens:

[rtp @ 0x2c8e4a0] New audio stream 0:3 at pos:-1 and DTS:NOPTSsrate= 998.2kbits/s speed=   1x    
[NULL @ 0x2d19580] non-existing PPS 0 referenced
Last message repeated 14 times
[NULL @ 0x2d19580] non-existing PPS 0 referenced00:02:24.52 bitrate= 997.9kbits/s speed=   1x    
Last message repeated 13 times
[NULL @ 0x2d19580] non-existing PPS 0 referenced00:02:24.52 bitrate= 997.9kbits/s speed=0.996x    
Last message repeated 14 times
[NULL @ 0x2d19580] non-existing PPS 0 referenced00:02:24.52 bitrate= 997.9kbits/s speed=0.992x    
Last message repeated 14 times
[NULL @ 0x2d19580] non-existing PPS 0 referenced00:02:24.52 bitrate= 997.9kbits/s speed=0.988x    
Last message repeated 1 times
frame= 3584 fps= 21 q=-1.0 Lsize=   17616kB time=00:02:24.52 bitrate= 998.5kbits/s speed=0.862x

Além disso, o sinal de vídeo no monitor ffplay cai naturalmente. Se eu sair e reiniciar o FFmpeg com os mesmos parâmetros, ele funcionará bem. DuckDuckEste problema gerou a sugestão de adicionar -re -stream_loop -1 aos parâmetros do FFmpeg - isso realmente piorou: a saída de vídeo fica instável e rica em artefatos. Isso é explicado por essas mensagens de erro recorrentes:

Last message repeated 1 times
[rtp @ 0x2fbf4e0] max delay reached. need to consume packet
[rtp @ 0x2fbf4e0] RTP: missed 20 packets
[rtp @ 0x2fbf4e0] PES packet size mismatch

Ah, e além disso, isso não resolve o problema. Assim que o fluxo voltar ao início, o FFmpeg dropa a bola. Minha presunção é que é um problema relacionado ao timestamp, mas estou lutando para encontrar uma solução para isso.

É possível receber e encaminhar um fluxo em loop com o FFmpeg? Quais são os parâmetros de linha de comando apropriados para isso? A alteração do material de origem / formato do contêiner / protocolo de transporte não é uma opção.

    
por UnbescholtenerBuerger 01.12.2017 / 11:57

0 respostas