GNU/Linux >> Linux Esercitazione >  >> Linux

Tagliare i video in base all'ora di inizio e di fine usando ffmpeg

Prova a usare questo. È il modo migliore e più veloce di ffmpeg che ho capito:

 ffmpeg -ss 00:01:00 -to 00:02:00  -i input.mp4 -c copy output.mp4

Questo comando taglia il tuo video in pochi secondi!

Spiegazione del comando:

-i: Questo specifica il file di input. In tal caso, è (input.mp4).
-ss: Usato con -i, cerca la posizione nel file di input (input.mp4).
00:01:00: Questo è il momento in cui inizierà il tuo video ritagliato.
-a: Specifica la durata dall'inizio (00:01:40) alla fine (00:02:12).
00:02:00: Questo è il momento in cui terminerà il tuo video ritagliato.
-c copia: Questa è un'opzione per tagliare tramite stream copy. (NB:molto veloce)

Il formato dell'ora è:hh:mm:ss

Tieni presente che l'attuale risposta altamente votata è obsoleta e il taglio sarebbe estremamente lento. Per ulteriori informazioni, guarda questo articolo ufficiale su ffmpeg.


Ecco cosa uso e ci vorranno solo pochi secondi eseguire:

ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4

Riferimento:tagliare i file video utilizzando FFmpeg di Alexander Refsum Jensenius .

mp4 generato i file potrebbero anche essere usati in iMovie . Ulteriori informazioni relative all'ottenimento della durata completa utilizzando il modello get_duration(input_video).

Se vuoi concatenare più scene tagliate puoi usare il seguente script 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()

Lo script di esempio taglierà e unirà le scene tra 00:00:00 - 00:00:10 e 00:06:00 - 00:07:00 .

Se vuoi tagliare il video completo (nel caso in cui desideri convertire mkv formato in mp4 ) decommenta semplicemente la riga seguente:

# 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 per fare in istantaneamente. In tal caso ffmpeg non ricodificherà il video, ma lo ritaglierà in base alle dimensioni.


Probabilmente non hai un fotogramma chiave al segno dei 3 secondi. Poiché i fotogrammi non chiave codificano le differenze rispetto ad altri fotogrammi, richiedono tutti i dati a partire dal fotogramma chiave precedente.

Con il contenitore mp4 è possibile tagliare in un fotogramma non chiave senza ricodificare utilizzando un elenco di modifica. In altre parole, se il fotogramma chiave più vicino prima di 3s è a 0s, copierà il video a partire da 0s e utilizzerà un elenco di modifiche per dire al giocatore di iniziare a riprodurre 3 secondi dopo.

Se stai usando l'ultimo ffmpeg da git master, lo farà usando un elenco di modifica quando viene richiamato usando il comando che hai fornito. Se questo non funziona per te, probabilmente stai utilizzando una versione precedente di ffmpeg o il tuo lettore non supporta gli elenchi di modifica. Alcuni lettori ignoreranno l'elenco di modifica e riprodurranno sempre tutti i media nel file dall'inizio alla fine.

Se vuoi tagliare con precisione a partire da un fotogramma non chiave e vuoi che venga riprodotto a partire dal punto desiderato su un lettore che non supporta gli elenchi di modifica, o vuoi assicurarti che la parte tagliata non sia effettivamente nel file di output (ad esempio se contiene informazioni riservate), puoi farlo ricodificando in modo che ci sia un fotogramma chiave esattamente all'ora di inizio desiderata. La ricodifica è l'impostazione predefinita se non specifichi copy . Ad esempio:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Durante la ricodifica potresti anche voler includere ulteriori opzioni relative alla qualità o un particolare codificatore AAC. Per i dettagli, consulta la Guida alla codifica x264 di ffmpeg per i video e la Guida alla codifica AAC per l'audio.

Inoltre, il -t L'opzione specifica una durata, non un'ora di fine. Il comando precedente codificherà 8 secondi di video a partire da 3 secondi. Per iniziare alle 3 e terminare alle 8 usa -t 5 . Se stai usando una versione corrente di ffmpeg puoi anche sostituire -t con -to nel comando precedente per terminare all'ora specificata.


Linux
  1. Quando è stata l'ultima volta che hai usato Windows?

  2. Che cos'è una versione continuativa di Linux e qual è il vero vantaggio del suo utilizzo

  3. Come ruotare i video usando FFMpeg dalla riga di comando

  4. Imposta la data, l'ora e il fuso orario su un server Linux

  5. Qual è la differenza tra l'uso di `sh` e `source`?

Come ottenere la data e l'ora correnti in Python

Come ingrandire e rimpicciolire i video utilizzando FFmpeg

La guida completa per l'utilizzo di ffmpeg in Linux

Firefox raggiunge i 100 più grandi ed è ora di iniziare a utilizzare questo browser open source

Utilizzo di awk per sommare i valori di una colonna, in base ai valori di un'altra colonna

In che modo il tempo della CPU e l'utilizzo della CPU sono uguali?