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.