FFmpeg. Decodificación CUDA. Duración pasada demasiado grande. FPS variables

Por favor, vea mi información de flujo de UDP de entrada:

ffprobe upp://IP:PUERTO

Input #0, mpegts, from 'udp://IP:PORT':
  Duration: N/A, start: 42243.737022, bitrate: N/A
  Program 17
  . . .
    Stream #0:0[0x781]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt470bg, top first), 720x576 [SAR 12:11 DAR 15:11], 24.67 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x782](Tam): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, s16p, 64 kb/s
    Stream #0:2[0x783](Kan): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, s16p, 64 kb/s

Y ejecuta este comando de nuevo:

ffprobe upp://IP:PUERTO

Input #0, mpegts, from 'IP:PORT':
  Duration: N/A, start: 42589.601022, bitrate: N/A
  . . . 
  Program 17
    Stream #0:0[0x781]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt470bg, top first), 720x576 [SAR 12:11 DAR 15:11], 24.58 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x782](Tam): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, s16p, 64 kb/s
    Stream #0:2[0x783](Kan): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, s16p, 64 kb/s

Preste atención al valor de FPS. En la primera ejecución 24,67 y en la segunda 24,58

Quiero transcodificar esta transmisión con el siguiente comando:

ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -deint 2 -i "udp://IP:PUERTO" -mapa 0:#0x0781 -mapa 0:#0x0782 -vcodec h264_nvenc -acodec libfdk_aac -f flv rtmp:// IP/prueba/nombre

Por favor, consulte el registro:

Past duration 0.981102 too large
frame=83 fps=0.0 q=18.0 size=502kB time=00:00:04.05 bitrate=1015.4kbits/s dup=0 drop=80 speed=7.42x  
frame=96 fps=90 q=18.0 size=643kB time=00:00:04.69 bitrate=1122.1kbits/s dup=0 drop=93 speed=4.38x  
frame=111 fps=70 q=18.0 size=802kB time=00:00:05.14 bitrate=1278.1kbits/s dup=0 drop=108 speed=3.26x 
frame=121 fps=57 q=19.0 size=921kB time=00:00:05.61 bitrate=1344.7kbits/s dup=0 drop=118 speed=2.64x 
frame=137 fps=49 q=19.0 size=1096kB time=00:00:06.25 bitrate=1436.4kbits/s dup=0 drop=134 speed=2.26x

También puedo agregar el parámetro de velocidad de fotogramas "-r". De la siguiente manera:

ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -deint 2 -r 25 -i "udp://IP:PUERTO" -mapa 0:#0x0781 -mapa 0:#0x0782 -vcodec h264_nvenc -r 25 -acodec libfdk_aac - f flv rtmp://IP/prueba/nombre

En este caso no se muestra esta advertencia. Pero el proceso de transcodificación de FFmpeg falló después de 10 a 15 segundos, sin ningún error en el registro.

Todo funciona bien si lo hago a través de la decodificación de software:

ffmpeg -y -i "udp://IP:PUERTO" -mapa 0:#0x0781 -mapa 0:#0x0782 -vcodec h264_nvenc -acodec libfdk_aac -f flv rtmp://IP/prueba/nombre

Además, todo funciona bien si lo transcodifico al archivo local y especifico la velocidad de fotogramas:

ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -deint 2 -r 25 -i "udp://IP:PUERTO" -mapa 0:#0x0781 -mapa 0:#0x0782 -vcodec h264_nvenc -r 25 -acodec libfdk_aac - f flv resultado.flv

Este problema afecta solo a algunos flujos de entrada.
¿Cómo puedo transcodificar este flujo UDP a flujo FLV con decodificación CUDA?

Respuestas (1)

La clave -drop_second_field 1 solucionó este problema.
Y el comando de resultado se ve de la siguiente manera:

ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -deint 2 -drop_second_field 1 -i "udp://IP:PORT"
-vcodec h264_nvenc -acodec libfdk_aac -f flv rtmp://IP/prueba/nombre


Lo que pienso sobre este problema: por el momento en la decodificación cuda podemos usar solo 2 variantes de desentrelazado:

  • -deint 1 es bob desentrelazado,
  • -deint 2 es desentrelazado adaptativo.

Ambas variantes aumentan la tasa de bits, porque después de desentrelazar cada campo (la mitad del cuadro) que se muestra como cuadro (la tasa de cuadros se duplica), la tasa de bits aumenta y si los fps son variables, tenemos un problema con las marcas de tiempo. Y cuando habilitamos soltar el segundo campo, todo se ve bien con la tasa de bits y las marcas de tiempo.