GNU/Linux >> Tutoriales Linux >  >> Linux

Cortar los videos según la hora de inicio y finalización usando ffmpeg

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.
00:01:00: Este es el momento en que comenzará su video recortado.
-a: Esto especifica la duración desde el inicio (00:01:40) hasta el final (00:02:12).
00:02:00: Este es el tiempo en el que terminará su video recortado.
-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.


Linux
  1. Establecer la fecha, la hora y la zona horaria en un servidor Linux

  2. Establezca la fecha y la hora del sistema usando C++ en Linux

  3. Copiar y chmod/chown al mismo tiempo

  4. Hacer ping y tcpdump al mismo tiempo

  5. Usar awk para sumar los valores de una columna, en función de los valores de otra columna

Cómo obtener la fecha y hora actuales en Python

Cómo acercar y alejar videos usando FFmpeg

La guía completa para usar ffmpeg en Linux

Firefox llega a los 100 grandes, y es hora de que empieces a usar este navegador de código abierto

Uso del script Apache2Buddy para rendimiento y estabilidad

¿En qué se parecen el tiempo de CPU y el uso de CPU?