convierta video de 30 segundos a 240 fps a video de 2 minutos a 60 fps usando ffmpeg

convierta video de 30 segundos a 240 fps a video de 2 minutos a 60 fps usando ffmpeg

Tengo un video de 30 segundos a 240 fps de mi GoPro Hero10. Ahora quiero crear una "cámara lenta", que debería ser 1/4 de velocidad. Entonces la salida sería de 2 minutos a 60 fps. (El sonido también debe convertirse; sé que esto hace que el tono sea bajo, está bien)

Después de investigar un poco, se me ocurrió esto:

ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" -map "[v]" -map "[a]" output-0.25.mp4

Pero después de comprobarlo ffmpeg -i output-0.25.mp4, veo que los fps siguen siendo 240 (aunque la duración es correcta, es en cámara lenta, suena bien, pero el tamaño de archivo es bastante grande y, como se dijo, demasiados fps para reproducir en el dispositivo de destino).

Así que busqué de nuevo y se me ocurrió agregar, -r 60así que terminé con:

ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" -map "[v]" -map "[a]" -r 60 output-0.25.mp4

Ahora la comprobación también muestra los fps correctos, pero parece ser "menos cámara lenta" y el sonido es chirriante.

¿Que tengo que hacer?

Todo lo que quiero es"tome todos los fotogramas originales y guárdelos en un archivo, que se reproducirá a 'velocidad normal'".

Respuesta1

Existe el modo de configuración y la conversión al modo sin formato.

Usar setpts sería algo como esto:

ffmpeg input.mkv -map_metadata -1 -filter_complex "[0:v:0]setpts=PTS*4[v];[0:a:0]atempo=0.5,atempo=0.5[a]" -map [v] -map [a] -c:v libx265 -vtag hvc1 -c:a libmp3lame -shortest "output.mp4"
  • use un buen códec que reduzca el tamaño del archivo como H.265 (libx265)
  • Sospecho que debido a que los metadatos del video dicen 240 FPS en el video original y los metadatos no se eliminan durante la conversión, el video de salida también muestra 240 fps pero en realidad es 60 FPS. La opción -map_metadata -1 eliminaría los metadatos.

Usar la conversión al modo raw sería algo como esto:

En este ejemplo, asumo que el vídeo original tiene el códec H.264:

ffmpeg -i input.mp4 -map 0:v -c:v copy -bsf:v h264_mp4toannexb raw.h264
ffmpeg -fflags +genpts -r 60 -i "raw.h264" -i input.mp4 -map 0:v -map 1:a -filter:a "atempo=0.5,atempo=0.5" -c:v libx265 -vtag hvc1 "output.mp4"

En el primer comando el video original se convierte a raw, en el segundo comando se generan nuevas marcas de tiempo haciendo que el video se reproduzca 4 veces más lento, agregando el audio del video original al video raw, reduciendo la velocidad del audio 4 veces y finalmente convirtiendo el video raw. vídeo a H.265 para archivos de menor tamaño.

Respuesta2

Aquí hay una solución sin volver a codificar el video:

  • Extraiga la transmisión de video a una transmisión de video "sin procesar" HEVC (H.265):
    ffmpeg -y -an -i testfile.mp4 -c copy input_video.h265
  • Modifique a tick_rate" 60tics por segundo" usando hevc_metadatael filtro de flujo de bits:
    ffmpeg -y -i input_video.h265 -c copy -bsf:v hevc_metadata=tick_rate=60:num_ticks_poc_diff_one=1 input_video2.h265
  • Fusionar input_video2.h265con el audio "ralentizado":
    ffmpeg -y -i input_video2.h265 -vn -i testfile.mp4 -map_metadata -1 -af "atempo=0.5,atempo=0.5" -c:v copy -vtag hvc1 -c:a aac -shortest "output.mp4"

El audio "ralentizado" suena extraño, pero no encuentro mejor solución que usarlo atempodos veces.

información relacionada