FFMPEG duplica el primer cuadro al codificar

El uso de ffprobe muestra que ambos videos tienen el mismo número de cuadros, pero si extraigo los cuadros como imágenes, el comprimido tiene un cuadro adicional al principio (que es solo el primer cuadro duplicado).

Esto me causa muchos problemas ya que tengo que calcular las diferencias de cuadros entre los dos videos y tener un cuadro adicional hace que todo no esté sincronizado.

Aporte

ffmpeg -i "720p50_mobcal_ter.avi" -an -f mpeg2video -y "720p50_mobcal_ter.mpg"

Producción

ffmpeg version N-76684-g1fe82ab Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55.  6.100 / 55.  6.100
  libavcodec     57. 15.100 / 57. 15.100
  libavformat    57. 14.100 / 57. 14.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 15.100 /  6. 15.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, avi, from '720p50_mobcal_ter.avi':
  Metadata:
    encoder         : Lavf57.14.100
  Duration: 00:00:10.08, start: 0.000000, bitrate: 552974 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1280x720, 554059 kb/s, SAR 1:1 DAR 16:9, 50 fps, 50 tbr, 50 tbn, 50 tbc
Output #0, mpeg2video, to '720p50_mobcal_ter.mpg':
  Metadata:
    encoder         : Lavf57.14.100
    Stream #0:0: Video: mpeg2video, yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 50 fps, 50 tbn, 50 tbc
    Metadata:
      encoder         : Lavc57.15.100 mpeg2video
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg2video (native))
Press [q] to stop, [?] for help
frame=   41 fps=0.0 q=31.0 size=     984kB time=00:00:00.78 bitrate=10330.5kbits/frame=   80 fps= 78 q=31.0 size=    1323kB time=00:00:01.56 bitrate=6948.1kbits/frame=  124 fps= 80 q=31.0 size=    1725kB time=00:00:02.44 bitrate=5790.0kbits/frame=  168 fps= 81 q=31.0 size=    2084kB time=00:00:03.32 bitrate=5142.8kbits/frame=  212 fps= 81 q=31.0 size=    2482kB time=00:00:04.20 bitrate=4841.4kbits/frame=  255 fps= 82 q=31.0 size=    2840kB time=00:00:05.06 bitrate=4597.2kbits/frame=  296 fps= 82 q=31.0 size=    3133kB time=00:00:05.88 bitrate=4364.5kbits/frame=  338 fps= 82 q=24.8 size=    3453kB time=00:00:06.72 bitrate=4209.2kbits/frame=  382 fps= 82 q=31.0 size=    3723kB time=00:00:07.60 bitrate=4013.4kbits/frame=  426 fps= 83 q=31.0 size=    4005kB time=00:00:08.48 bitrate=3869.1kbits/frame=  470 fps= 83 q=24.8 size=    4276kB time=00:00:09.36 bitrate=3742.5kbits/frame=  504 fps= 83 q=31.0 Lsize=    4469kB time=00:00:10.06 bitrate=3639.3kbits/s
video:4469kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

Mi solución actual es recortar el video comprimido antes de calcular las diferencias, pero esto implica volver a codificar y perder calidad, lo que hace que los resultados sean inútiles.

Para hacer la pregunta un poco más completa, aquí están los comandos que estoy usando para recortar y calcular las diferencias:

ffmpeg -y -i "720p50_mobcal_ter.mpg" -an -f mpeg2video -vf select=gte(n\,1) "cut-720p50_mobcal_ter.mpg"


ffmpeg -y -i "720p50_mobcal_ter.avi" -i "cut-720p50_mobcal_ter.mpg" -filter_complex "blend=all_mode=difference,hue=s=0" -c:v libx264 -crf 18 -c:a copy "differences.mpg"

La pregunta es: ¿cómo puedo evitar tener el primer marco duplicado? Si esto no se puede evitar, ¿hay alguna manera de eliminarlo sin volver a codificar el video o simplemente saltándolo mientras se calculan las diferencias?

EDITAR:

Siguiendo la respuesta de @Mulvya, probé su sugerencia pero no funciona de alguna manera. Entiendo que es difícil encontrar el problema sin tener el archivo de video, así que, en cambio, estoy publicando una captura de pantalla con los primeros 4 cuadros de cada video para ayudarlo a visualizar mi problema.

ingrese la descripción de la imagen aquí

Como puede ver, el video comprimido tiene un tercer cuadro gris que estropea las diferencias.

La razón detrás de esta edición es que estoy seguro de que la respuesta dada debería funcionar, al menos desde mi comprensión de cómo funcionan las asignaciones de filtros, pero probablemente no funcione porque el problema aquí no es lo que pensé que era.

Espero tener un tercer cuadro casi negro en el video de diferencias, y no el cuadro completo del original.

EDIT 2: probé la nueva solución que de alguna manera funcionó la primera vez, pero ahora ya no.

Aquí está la lista de los comandos que estoy usando, el resultado sigue siendo el mismo de la captura de pantalla, pero ahora el problema se ha movido al segundo cuadro en lugar del tercero (básicamente es como sería la captura de pantalla sin 00000.png) marcos)

ffmpeg  -i "720p50_mobcal_ter.avi" -an -f mpeg1video -y "compressed.mpg" 
ffmpeg  -i "720p50_mobcal_ter.avi" -vf fps=50 "original\image-%05d.png"
ffmpeg  -i "compressed.mpg" -vf fps=50 "compressed\image-%05d.png"
ffmpeg  -y -i "720p50_mobcal_ter.avi" -i "compressed.mpg" -filter_complex "[1:v]trim=start_frame=1,setpts=PTS-STARTPTS[cut];[0:v][cut]blend=all_mode=difference,hue=s=0" -c:v libx264 -crf 18 -c:a copy "differences.mpg" 
ffmpeg  -i "differences.mpg" -vf fps=50 "differences\image-%05d.png"

El video fuente que estoy usando está aquí en caso de que quieras probarlo tú mismo.

También tuve este problema con el último binario de zeranoe. Resuelto usando el filtro fps para la salida.

Respuestas (2)

Puede omitir ese primer cuadro durante el proceso de cálculo.

ffmpeg -y -i "720p50_mobcal_ter.avi" -i "720p50_mobcal_ter.mpg" -filter_complex "[1:v]trim=start_frame=1,setpts=PTS-STARTPTS[cut];[0:v][cut]blend=all_mode=difference,hue=s=0" -c:v libx264 -crf 18 -c:a copy "differences.mpg"

Editar : según lo solicitado, agregué los comandos que usé para reproducir el comportamiento pero no experimenté el problema.

ffmpeg -i "720p50_mobcal_ter.y4m" -c:v copy "720p50_mobcal_ter.avi"
ffmpeg -i "720p50_mobcal_ter.avi" -c:v mpeg2video "720p50_mobcal_ter.mpg"
ffmpeg -i "720p50_mobcal_ter.avi" -i "720p50_mobcal_ter.mpg" -filter_complex blend=all_mode=difference,hue=s=0 -c:v libx264 -crf 18 "differences.mp4"

ffmpeg -i "720p50_mobcal_ter.avi" avi\frames%03d.png
ffmpeg -i "720p50_mobcal_ter.mpg" mpg\frames%03d.png

Mi compilación ffmpeg, tomada de Zeranoe

ffmpeg version N-77380-g2dba040 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 11.100 / 55. 11.100
  libavcodec     57. 18.100 / 57. 18.100
  libavformat    57. 20.100 / 57. 20.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 21.100 /  6. 21.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Si bien estoy seguro de que su respuesta es correcta, no funcionó por algunas razones y actualicé la pregunta para proporcionar más detalles que pueden ser útiles.
Restablezca el PTS según el comando editado y verifique.
Edité el OP nuevamente porque todavía tengo problemas.
Echará un vistazo al video fuente.
No se puede reproducir el problema. Marcos alineados aquí. Consulte datafilehost.com/d/8b05aaaf
¿Cuál es tu comando para generar AVI?
Ha pasado un tiempo, pero creo que usé este ffmpeg -i input.y4m -an -vcodec rawvideo -y output.aviporque necesito que esté descomprimido. Aunque no estoy tan seguro, tal vez ayude si publicas el comando que usaste para compilar el .avi.
ffmpeg -i input.y4m -c:v copy output.avi-- el flujo de video de entrada ya es rawvideo, por lo que no es necesaria la generación de AVI. Pruebe una versión más nueva de ffmpeg.
Recreó el AVI con su comando y actualizó a la última versión, aún no hay diferencias con los resultados anteriores. ¿Puedes escribir todos los comandos que usaste para llegar a tu video de diferencias? Tal vez hay algo mal en la forma en que comprimo el video.
Obtengo resultados idénticos con una transcodificación de mpeg1video y los comparo con mpeg2video
No tengo idea de por qué sucede esto, pero con su comando de codificación todo funciona bien, así que aceptaré su respuesta.

Analicé más a fondo este problema y descubrí que existe incluso con la versión 2.8.1 de ffmpeg. ¡Pero sorprendentemente, el primer cuadro se duplica solo mientras se transcodifica el video de entrada con 23.976 fps! Cuando transcodifico video con cualquier otro fps (24, 25, 29.976, 30), los cuadros iniciales parecen estar bien.