Intenta usar esto. Es la forma ffmpeg más rápida y mejor que he encontrado:
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
¡Este comando recorta tu video en segundos!
Explicación del comando:
-i: Esto especifica el archivo de entrada. En ese caso, es (input.mp4).
-ss: Usado con -i, este busca en el archivo de entrada (input.mp4) para posicionar.
-a: Esto especifica la duración desde el inicio (00:01:40) hasta el final (00:02:12).
-c copia: Esta es una opción para recortar a través de la copia de flujo. (Nota:muy rápido)
El formato de tiempo es:hh:mm:ss
Tenga en cuenta que la respuesta actual altamente votada está desactualizada y el ajuste sería extremadamente lento. Para obtener más información, consulte este artículo oficial de ffmpeg.
Esto es lo que uso y solo tomará unos pocos segundos ejecutar:
ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4
Referencia:recortar archivos de video usando FFmpeg por Alexander Refsum Jensenius .
Generado mp4
los archivos también se pueden usar en iMovie
. Más información relacionada con obtener la duración completa usando el modelo get_duration(input_video).
Si desea concatenar varias escenas de corte, puede usar el siguiente script de Python:
#!/usr/bin/env python3
import subprocess
def get_duration(input_video):
cmd = ["ffprobe", "-i", input_video, "-show_entries", "format=duration",
"-v", "quiet", "-sexagesimal", "-of", "csv=p=0"]
return subprocess.check_output(cmd).decode("utf-8").strip()
def main():
name = "input.mkv"
times = []
times.append(["00:00:00", "00:00:10"])
times.append(["00:06:00", "00:07:00"])
# times = [["00:00:00", get_duration(name)]]
if len(times) == 1:
time = times[0]
cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", "output.mp4"]
subprocess.check_output(cmd)
else:
open('concatenate.txt', 'w').close()
for idx, time in enumerate(times):
output_filename = f"output{idx}.mp4"
cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
subprocess.check_output(cmd)
with open("concatenate.txt", "a") as myfile:
myfile.write(f"file {output_filename}\n")
cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "output.mp4"]
output = subprocess.check_output(cmd).decode("utf-8").strip()
print(output)
if __name__ == "__main__":
main()
El script de ejemplo cortará y fusionará escenas entre 00:00:00 - 00:00:10
y 00:06:00 - 00:07:00
.
Si desea cortar el video completo (en caso de que desee convertir mkv
formato en mp4
) simplemente elimine el comentario de la siguiente línea:
# times = [["00:00:00", get_duration(name)]]
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4
Usa -c copia para hacer en el instante. En ese caso, ffmpeg no volverá a codificar el video, solo lo cortará al tamaño correspondiente.
Probablemente no tenga un fotograma clave en la marca de 3 segundos. Debido a que los fotogramas que no son clave codifican diferencias con respecto a otros fotogramas, requieren todos los datos a partir del fotograma clave anterior.
Con el contenedor mp4 es posible cortar en un fotograma no clave sin volver a codificar usando una lista de edición. En otras palabras, si el fotograma clave más cercano antes de 3s está en 0s, copiará el video comenzando en 0s y usará una lista de edición para decirle al reproductor que comience a reproducir 3 segundos después.
Si está utilizando el último ffmpeg de git master, lo hará mediante una lista de edición cuando se invoque mediante el comando que proporcionó. Si esto no funciona para usted, probablemente esté utilizando una versión anterior de ffmpeg o su reproductor no admite listas de edición. Algunos reproductores ignorarán la lista de edición y siempre reproducirán todo el contenido multimedia del archivo de principio a fin.
Si desea cortar con precisión comenzando en un fotograma que no es clave y quiere que se reproduzca comenzando en el punto deseado en un reproductor que no admite listas de edición, o quiere asegurarse de que la parte cortada no esté realmente en el archivo de salida (por ejemplo si contiene información confidencial), puede hacerlo volviendo a codificar para que haya un fotograma clave precisamente en la hora de inicio deseada. La recodificación es la predeterminada si no especifica copy
. Por ejemplo:
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
Al volver a codificar, es posible que también desee incluir opciones adicionales relacionadas con la calidad o un codificador AAC en particular. Para obtener más información, consulte la Guía de codificación x264 de ffmpeg para video y la Guía de codificación AAC para audio.
Además, el -t
La opción especifica una duración, no una hora de finalización. El comando anterior codificará 8 segundos de video a partir de 3 segundos. Para empezar en 3s y terminar en 8s usa -t 5
. Si está utilizando una versión actual de ffmpeg, también puede reemplazar -t
con -to
en el comando anterior para finalizar a la hora especificada.