iMovie (non senza perdita di dati, ma migliore di prima)
iMovie v10 (rilasciato qualche tempo dopo la domanda iniziale) ora gestisce meglio più tipi di media, quindi evita la ricodifica dell'importazione per la maggior parte dei contenuti H.264 (mp4, m4v, mov, AVHDC, mts, mt2s).
Tuttavia, si ricodificherà ancora all'esportazione, quindi non può essere tecnicamente senza perdita, un'altra nuova caratteristica, tuttavia, è la possibilità di personalizzare la qualità dell'esportazione, che può essere più vicina alla perdita. Ho il sospetto che questa parte della risposta possa applicarsi ugualmente ad altri software di editing video "project driven" (ad esempio Premiere o Final Cut) perché penso che generalmente tutti ricodificheranno in output, sebbene di solito siano molto facili da usare per un taglio preciso.
Personalmente, in genere penso che una singola ricodifica non sia un grosso problema, ma capisco che hai specificamente chiesto una soluzione senza perdite, quindi ...
Senza perdite (ma molto più complicato!)
Esistono limiti tecnici sulla precisione con cui è possibile tagliare un video senza dover ricodificare almeno una parte di esso e dipende sostanzialmente dalla frequenza i-frame. Se ogni fotogramma è un i-frame, puoi tagliare ovunque, ma se sono solo pochi secondi, puoi tagliare senza perdita di dati su quei i-frame senza perdere il contenuto o dover ricodificare (almeno parte del stream) in modo che possa iniziare con un i-frame.
ffmpeg
Queste domande e risposte SO sollevano specificamente la questione di come tagliare tra i-frame usando ffmpeg
. Non conosco alcuna app GUI per fare questo, ma fondamentalmente si esegue un comando simile al seguente:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Le due volte specificate sono inizio e durata , e possono essere specificate come secondi oppure hh:mm:ss.ss
e -acodec copy
e -vcodec copy
dire a ffmpeg di non ricodificare.
Non sono esattamente sicuro di cosa succede se tagli troppo presto, ma penso che il video sia essenzialmente vuoto (o forse corrotto, a seconda del lettore) fino a quando non incontra un i-frame. Quindi probabilmente vorrai trovare l'i-frame più vicino prima del tuo taglio. Questa risposta risolve quel problema usando ffprobe
e awk
, sebbene in modo un po 'imbarazzante. Essenzialmente si usa ffprobe
per scansionare i frame e trovare il fotogramma chiave più vicino ( flags=K
) prima del punto di taglio ideale. L'output completo per ciascun fotogramma del video può essere visualizzato in questo modo:
ffprobe -select_streams v -show_frames <INPUT>
La risposta collegata fornisce questo comando per trovare un fotogramma chiave prima di un orario specifico:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
E infine, se hai davvero bisogno di tagliare da qualche parte tra due i-frame, puoi dividere il video e ricollegarti. Sulla base delle informazioni fornite da questa risposta , dovrebbe essere simile a:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Dove si list_of_videos.txt
trova un semplice file di testo che elenca i file che si desidera concatenare.
Sommario
iMovie è probabilmente abbastanza buono per la maggior parte dei casi (dalla v10) e molto semplice.
ffmpeg può farlo senza perdita (o molto vicino a senza perdita), con un po 'di giocherellando; il livello di difficoltà dipende da quanto sei esigente riguardo al punto di partenza preciso e alla frequenza degli i-frame.