Precisión del fotograma de copia de flujo ffmpeg

Precisión del fotograma de copia de flujo ffmpeg

Sé que esto podría no ser posible, pero al menos agradecería entender lo que está pasando.

Tengo un vídeo con fotogramas clave forzados cada 2 segundos. Idealmente, esperaba poder obtener cortes perfectos sin tener que volver a codificar. Por ejemplo:

ffmpeg -ss 00:00:00 -i original.mp4 -t 2 -c copy slices_0.mp4
ffmpeg -ss 00:00:02 -i original.mp4 -t 2 -c copy slices_1.mp4
ffmpeg -ss 00:00:04 -i original.mp4 -t 2 -c copy slices_2.mp4
...

Esto no parece funcionar del todo.

Profundizando más en ello, parece que el primer corte tiene precisión de fotograma, pero todo lo que sigue tiene un ligero desplazamiento (puede que tenga otros problemas, pero por ahora solo me estoy centrando en esto). El primer cuadro aparece bien:

# same output
ffmpeg -ss 00:00:03 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:00 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

Pero todo lo que sigue está cancelado:

# not the same output
ffmpeg -ss 00:00:04 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:01 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

Haga lo que haga, obtengo el mismo resultado. Si miro el PTS del original para el cuadro 60, obtengo 2,002000 (en lugar de 2). Pero, incluso si uso esto para mi porción, obtengo el mismo desplazamiento.

¿Qué está sucediendo?

(Probablemente no esté relacionado, pero también tengo curiosidad por saber por qué el primer fotograma de 0_slices.mp4 tiene un PST/DST desplazado, aunque el original no lo tiene)

Respuesta1

Si desea una búsqueda precisa de cuadros, intente colocar su -ssbandera después de su archivo de entrada.

Entonces algo como esto:

ffmpeg -i original.mp4 -ss 00:00:04 -vframes 1 -f image2 0.png.

Poner la ssbandera antes del archivo de entrada será una "suposición aproximada" en términos de PTS, pero debe ajustarse a un marco I para que funcione. Sucede mucho más rápido que poner la ssbandera después del archivo de entrada, pero a costa de ser menos preciso.

Cuando coloca la ssbandera después del archivo de entrada, FFmpeg decodificará desde el principio del archivo hasta que -sscomience el tiempo. Luego descarga toda la información antes de sstiempo... Por lo que lleva mucho más tiempo, pero debería ser preciso.

información relacionada