Tengo un video mkv (h264) que es 23.976 fps (24000/1001) pero quiero convertirlo a 25 fps sin volver a codificar y perder calidad. Sé que mkvmerge puede hacerlo (con la opción --default-Duration '0: 25fps') pero me gustaría hacerlo directamente desde ffmpeg si es posible De acuerdo con los documentos, esto debería funcionar:
ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv
pero cuando lo ejecuto solo obtengo el mismo video fps. ¿Cuál es el método correcto para hacerlo (si existe) en ffmpeg?
-r
no es compatible con la copia de flujo y no hay filtros de flujo de bits para cambiar la velocidad de fotogramas.Respuestas:
Este es el método que usa las versiones actuales de FFmpeg. Se basa en que el demuxer concat no reescala el PTS de las entradas después del primer archivo, sino que simplemente aplica un desplazamiento fijo. Digamos que tiene una transmisión de 30 fps con una escala de tiempo de
15360
(típica de salida FFmpeg). Eso significa que el marco0
tiene PTS0
y el marco30
tiene PTS15360
. Esto se convertiría en una transmisión de 45 fps si pudiéramos cambiar la escala de tiempo23040
sin afectar los valores de PTS.Esencialmente, eso es lo que hace el siguiente método.
1 . Identificar las propiedades de origen.
Desea tener en cuenta las propiedades de origen, especialmente la resolución y
tbn
.2a . (Opcional) Cambie la escala de tiempo a algo conveniente para simplificar los cálculos.
Esto nos atrapa
Si realiza este paso, la nueva escala de tiempo debe ser igual o un múltiplo integral de la velocidad de fotogramas original.
2b . Calcule la escala de tiempo necesaria, de modo que para la velocidad de fotogramas objetivo
x
, el PTS del número de fotogramax
en la fuente debe tener el mismo valor que el nuevotbn
. Si realizó el paso 2a, esto es muy fácil y es simplemente la nueva velocidad de fotogramas. Entonces, para fps objetivo45
,tbn
debería ser nuevo45
.3 . Generar video ficticio.
Todas las propiedades deben ser iguales como resolución, perfil H.264, formato de píxeles, recuento de referencias ... etc. para obtener mejores resultados.
4 Concat los videos.
Primero haz un archivo de texto
Entonces, el concat
El archivo de salida tendrá el segundo video reproduciéndose a 45 fps.
5 . Ahora, corta el preroll falso
y tu tienes
¡Dije que esto era complicado!
fuente