Cambia la velocidad de fotogramas de un video MP4 con ffmpeg

8

Tengo un video en formato mp4 con una velocidad de cuadro de .33(1 cuadro por 3 segundos). Quiero aumentar la velocidad de cuadros a 5 cuadros / seg. He intentado el siguiente comando pero no hace nada:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

¿Alguna idea de por qué ffmpeg ignora la -ropción?

mono de Fuego
fuente
Si usted está tratando de acelerar / frenar un vídeo, en lugar de los marcos de inserción / extracción duplicados, consulte superuser.com/questions/854753/... y / o askubuntu.com/questions/370692/...
Peter Cordes

Respuestas:

7

Sé que esta es una vieja pregunta, pero ninguna de las respuestas actuales es la forma recomendada.

Remuxing sin pérdida (video)

Como se señaló en los comentarios, hay una manera de hacer esto donde el video no tiene que volver a codificarse. Requiere la remezcla del archivo a un formato de contactor diferente MKV y luego volverlo a mezclar en un MP4. Aquí hay un ejemplo que cambia un video a 12 cuadros / segundo:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Si el video contiene audio también se puede reducir la velocidad que abajo sin cambiar el tono, pero es no una conversión sin pérdidas. El siguiente ejemplo asume que el video fuente era de 24 cuadros / segundo, por lo que el audio debía reducirse a la mitad (0.5) de velocidad usando el filtro atempo de ffmpeg .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

Orientación Wiki FFMPEG

Esta es la guía del wiki de ffmpeg . Tenga en cuenta que todas estas opciones requieren volver a codificar el video.

Acelerar / ralentizar el video

Puede cambiar la velocidad de una transmisión de video usando el filtro de video setpts. Tenga en cuenta que en los siguientes ejemplos, la transmisión de audio no cambia, por lo que idealmente debería deshabilitarse con -an.

Para duplicar la velocidad del video, puede usar:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

El filtro funciona cambiando la marca de tiempo de presentación (PTS) de cada cuadro de video. Por ejemplo, si se muestran dos cuadros sucesivos en las marcas de tiempo 1 y 2, y desea acelerar el video, esas marcas de tiempo deben ser 0.5 y 1, respectivamente. Por lo tanto, tenemos que multiplicarlos por 0.5.

Tenga en cuenta que este método soltará cuadros para lograr la velocidad deseada. Puede evitar la pérdida de fotogramas especificando una velocidad de fotogramas de salida más alta que la entrada. Por ejemplo, para pasar de una entrada de 4 FPS a una que se acelera hasta 4 veces que (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Para ralentizar su video, debe usar un multiplicador mayor que 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Suave

Puede suavizar el video lento / rápido con el filtro de video minterpolate. Esto también se conoce como "interpolación de movimiento" o "flujo óptico".

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Otras opciones incluyen slowmoVideo y Butterflow. Acelerar / ralentizar el audio

Puede acelerar o ralentizar el audio con el filtro de audio atempo. Para duplicar la velocidad del audio:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

El filtro atempo se limita al uso de valores entre 0.5 y 2.0 (por lo que puede reducirlo a no menos de la mitad de la velocidad original y acelerar a no más del doble de la entrada). Si lo necesita, puede sortear esta limitación al unir varios filtros atempo. Lo siguiente con cuadruplica la velocidad del audio:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Con un filtro gráfico complejo, puede acelerar el video y el audio al mismo tiempo:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
pseudoavant
fuente
1
Es posible acelerar / ralentizar simplemente remuxing, pero FFmpeg no sabe cómo hacerlo . por ejemplo, para mkv, mkvtoolnix puede hacerlo. Por ejemplo, mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv cambiar la velocidad de cuadros en el contenedor MKV . Puede remux a MKV y volver a MP4, o encontrar una herramienta que lo haga directamente para MP4. La codificación del video requiere mucha CPU y pérdida, por lo que es una opción horrible.
Peter Cordes
Totalmente de acuerdo en que se prefiere remuxing a una velocidad de fotogramas más baja, ya que es un enfoque sin pérdidas que requiere mucho menos recursos. Sin embargo, en la práctica no he encontrado buenas herramientas para hacerlo con MP4. No lo he intentado realmente recientemente, pero cuando escribí esta respuesta por primera vez, estaba haciendo remuxing MP4-> MKV-> MP4 y no pude hacerlo funcionar usando mkvtoolnix, ffmpeg y / o mp4box. Tendré que probar con los parámetros que sugiera.
pseudosavant
6

Si el archivo de entrada no tiene una velocidad de fotogramas válida, puede que tenga que configurarlo explícitamente

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Martin Beckett
fuente
Esto se transcodifica cuando realmente solo necesita remux. (A menos que realmente desee duplicar / soltar cuadros en lugar de ralentizar / acelerar el video.)
Peter Cordes
3

Solo podría lograr que la velocidad de fotogramas modificada surta efecto si el archivo de entrada se clasifica como un archivo "sin procesar":

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Sin especificarlo -f h264, el valor predeterminado sería 25 fps y no se podría cambiar. Aparentemente, esto se debió a que la transmisión carecía de información de velocidad de fotogramas y esta es la velocidad de fotogramas predeterminada de ffmpeg.

Aparentemente, cuando se usa -rcomo opción de salida, duplica o suelta fotogramas para que el video se reproduzca a la misma velocidad, ¡en este caso, no lo que desea! Pero cambiar la velocidad de fotogramas de entrada como se indicó anteriormente hará que el video se acelere o desacelere, sin cuadros perdidos o duplicados.

Malvinoso
fuente
1
Mi útil respuesta. No hay que volver a codificar aquí
yota
1

Tal característica, de cambiar la velocidad de fotogramas, se llama "conforme" y a menudo se usa para producir cámara lenta o avance rápido como mostrar el crecimiento de una planta en minutos en cuestión de días. ffmpeg no permite sobrescribir / cambiar la velocidad de fotogramas sin volver a codificar . Si lo hace, la duración cambiará y el audio no estará sincronizado a menos que se repare por separado. Pero me temo que el audio no es de interés en su caso con una velocidad de fotogramas de .33

Desea ajustarse porque solo quiere cambiar la velocidad de fotogramas, pero ffmpeg ignora en -rsilenciosi se especifica framerate en el archivo de entrada. Dado que su archivo de entrada está en formato .mp4, su propio framerate tiene prioridad sobre-rcuando no se necesita volver a codificar. Para esto necesitas una herramienta diferente: mencoder.

Suponiendo que su archivo de entrada no contiene sonido, probablemente cierto para cualquier video con velocidad de fotogramas de .33, lo que necesita es:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Observe que, por defecto, mencoder produce resultados en formato AVI.

Tankman 六四
fuente
1
Esto está mal. Si rse especifica como un interruptor de salida, ffmpeg producirá una salida a esa velocidad de fotogramas especificada, independientemente de la velocidad de fotogramas de la entrada. Si rse especifica como un interruptor de entrada, ffmpeg duplicará o soltará cuadros según sea necesario para alimentar el número especificado de cuadros por segundo de entrada al filtro / codificador.
Gyan
El comportamiento que describe cuando res un cambio de entrada contradice mi experimento anterior en formato .mp4, la nota de Malvineous (en esta página) y la descripción del error 403 trac.ffmpeg.org/ticket/403 ; su descripción cuando rse usa en la salida ocurre cuando se vuelve a codificar, mientras que el escenario de OP parece ser un caso conforme (corregir la velocidad de fotogramas sin volver a codificar) por el hecho de que tenía una velocidad de fotogramas de .33.
Tankman 六四
1
Verifique el informe pegado aquí . Tenga en cuenta la línea de comando en la parte superior, los metadatos de entrada y salida y finalmente el no. de cuadros codificados.
Gyan
1
Convino en que el OP solo quiere conformar el archivo, pero su comando dado se está volviendo a codificar, ya que no se especifican los conmutadores de copia. En ese escenario, ffmpeg debería generar una nueva transmisión a rfps.
Gyan
Gracias Mulvya por la convincente salida de muestra. Sí, tienes razón en el uso de -r. Ese uso no pudo afectar mis experimentos anteriores en respuesta a OP porque, pensando en un caso conforme, nunca eliminé el parámetro de copia de ffmpeg, y por -rlo tanto es ignorado. Escribí una solicitud de función: trac.ffmpeg.org/ticket/5170
Tankman 六四
0

La forma más rápida es crear un archivo BAT en el directorio con las siguientes filas:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Necesita tener mkvmerge y ffmpeg en el mismo directorio. Cambia cada archivo mp4 en segundos automáticamente sin pérdida de calidad.

Peder Gerdin
fuente