Come divido in modo efficiente un video lungo in più video più brevi?


0

Usando ffmpeg posso specificare l'ora di inizio e la durata di ciascun segmento. Ad esempio ho scritto

ffmpeg -i "originalvideo.mp4" -ss 00:00 -t 2:34 -vcodec copy -acodec copy "smallervideo1.mp4"

Ho un foglio di calcolo in cui ho 3 colonne; nome del video più piccolo, ora di inizio e ora di fine. Potrei creare ciascun comando separatamente per ogni video, ma ciò richiederebbe un po 'di tempo dato che sto dividendo i file di origine in circa 100 video più piccoli.

Esiste un metodo in cui posso trasferire i valori dal foglio di calcolo in ffmpeg e generare automaticamente ogni video con il nome appropriato?

Risposte:


1

Questo può essere fatto con un semplice script shell, in questo caso uno script Bash. Se si dispone di un file delimitato da spazi bianchi come input, che contiene il nome del file di output, il timestamp di inizio e il timestamp di fine, ad esempio:

$ cat cuts.txt
foo.mp4 00:00:00 00:00:01
bar.mp4 00:01:20 00:02:00

Quindi leggi questo con un semplice ciclo e costruisci il tuo comando ffmpeg:

while read -r filename start end; do
  ffmpeg -i "input.mp4" -ss "$start" -to "$end" -c copy "$filename"
done < cuts.txt

Questo taglia semplicemente il flusso di bit senza codifica - -c copyè una scorciatoia per -vcodec copy -acodec copy(e copia anche i sottotitoli). È possibile specificare un codificatore video (ad es. -c:v libx264) E un codificatore audio (ad es. -c:a aac -b:a 192k) Per ricodificare il video.

Una versione più portatile, ma di base con Python 3:

#!/usr/bin/env python3
import subprocess
with open("cuts.txt") as f:
  for line in f.readlines():
    filename, start, end = line.strip().split(' ')
    cmd = ["ffmpeg", "-i", "input.mp4", "-ss", start, "-to", end, "-c", "copy", filename]
    subprocess.run(cmd, stderr=subprocess.STDOUT)

Nota: se lo esegui su Windows, dovresti aggiungere ffmpeg al tuo PERCORSO o specificare il suo percorso completo come C:/Program Files/ffmpeg/bin/ffmpeg.exe.


Grazie @slhck. Ho un foglio di calcolo, ma suppongo di poterlo ottenere facilmente in quel formato. Lo proverò.
Michael Horwitz,

Puoi semplicemente esportarlo in CSV da Excel, ad esempio, ma usare un unico spazio come delimitatore. Oppure, se si dispone di una virgola come delimitatore, utilizzare while read -r -d, filename start end …per specificare un altro delimitatore. (Usare .split(',')in Python in quel caso.)
slhck,

da quando uso Windows sono andato con l'approccio Python. Sono bloccato e non sono sicuro di quale sia il problema. Il mio codice è import subprocess with open("cuts3.txt") as f: for line in f.readlines(): filename, start, end = line.strip().split(' ') cmd = 'C:\ffmpeg\bin\ffmpeg.exe -i Recordings\recording6.6.17.mp4 -ss {start} -to {end} -c copy "{filename}"'.format(**locals()) subprocess.run(cmd, shell=True) print ("loop over")Il file txt èGreetings.mp4 0:00:00 0:02:35 Introduction.mp4 0:02:35 0:05:10
Michael Horwitz, il

@MichaelHorwitz I commenti non sono molto utili per questo tipo di risoluzione dei problemi ... la formattazione del codice a blocchi non funziona qui. Ma ricevi messaggi di errore? Si noti che per Windows è necessario utilizzare le barre in avanti per eseguire il comando.
slhck,

Vedi le mie modifiche sopra, forse questo funziona meglio per te.
slhck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.