
Unbescholtener Bürger de volta com outra pergunta do FFmpeg. Meu objetivo é ter uma instância do FFmpeg em execução que receba um fluxo de transporte mpeg via RTP, execute operações arbitrárias no fluxo recebido, como transcodificação ou filtragem, e depois passe o fluxo de transporte alterado via RTP.
No entanto, não consigo funcionar nem na configuração mais básica: tenho um arquivo .ts que contém um único programa que consiste em um fluxo de vídeo e um fluxo de áudio. Eu uso uma instância do FFmpeg para transmitir este arquivo para localhost:
ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003
Com o ffplay, valido que isso funciona corretamente:
ffplay -i rtp://127.0.0.1:5003
O resultado parece bom, parece bom e não causa mensagens de erro no console.
Agora tento colocar outra instância do FFmpeg no meio e as coisas vão piorando. Eu só quero que o FFmpeg copie o stream da porta 5003 para a porta 5005 sem qualquer processamento ou transcodificação adicional:
ffmpeg -re -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5003?fifo_size=10000 -c copy -f rtp_mpegts rtp://127.0.0.1:5005
Recebo muitas mensagens de erro recorrentes nesse console e, quando monitoro o stream na porta 5005 com ffplay, aparecem muitos artefatos, falhas e interrupções. A saída do console é basicamente assim:
...
Input #0, rtp, from 'rtp://127.0.0.1:5003?fifo_size=10000':
Duration: N/A, start: 1.400022, bitrate: N/A
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Output #0, rtp_mpegts, to 'rtp://127.0.0.1:5005':
Metadata:
encoder : Lavf58.2.102
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.48 bitrate= 0.0kbits/s speed=0.957x
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.01 bitrate= 0.0kbits/s speed=0.991x
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.53 bitrate= 0.0kbits/s speed=1.01x
frame= 1 fps=0.5 q=-1.0 size= 57kB time=00:00:02.05 bitrate= 227.6kbits/s speed=1.01x
frame= 17 fps=6.7 q=-1.0 size= 83kB time=00:00:02.54 bitrate= 267.6kbits/s speed= 1x
frame= 32 fps= 11 q=-1.0 size= 121kB time=00:00:03.04 bitrate= 324.9kbits/s speed= 1x
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 50 packets
[rtp @ 0x3db64c0] PES packet size mismatch
frame= 37 fps= 10 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.15x frame= 37 fps=9.1 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.01x
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
[rtp @ 0x3db64c0] PES packet size mismatch
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
frame= 47 fps= 10 q=-1.0 size= 150kB time=00:00:04.57 bitrate= 269.3kbits/s speed=1.01x
...
Então... alguma ideia do que deu errado e como consertar? Uma olhada no monitor de recursos não indica nenhuma carga alta de CPU, memória ou rede.
Responder1
Então, aparentemente, meu problema foi o -re
sinalizador no comando que inicia a instância de passagem do FFmpeg.
Se eu tivesse consultado a documentação oficial de antemão, não teria que fazer esta pergunta:
-re
(entrada)Leia a entrada na taxa de quadros nativa. Usado principalmente para simular um dispositivo de captura ou fluxo de entrada ao vivo (por exemplo, ao ler um arquivo). Não deve ser usado com dispositivos de captura reais ou fluxos de entrada ao vivo (onde pode causar perda de pacotes).
http://ffmpeg.org/ffmpeg.html#Advanced-options
Foi exatamente isso que aconteceu comigo.