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 -ss
bandera 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 ss
bandera 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 ss
bandera después del archivo de entrada, pero a costa de ser menos preciso.
Cuando coloca la ss
bandera después del archivo de entrada, FFmpeg decodificará desde el principio del archivo hasta que -ss
comience el tiempo. Luego descarga toda la información antes de ss
tiempo... Por lo que lleva mucho más tiempo, pero debería ser preciso.