
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 60
así 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
"60
tics por segundo" usandohevc_metadata
el 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.h265
con 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 atempo
dos veces.