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 importazione re-encode per la maggior parte degli H.264 (mp4, m4v, mov, AVHDC , mts, mt2s).
Continuerà comunque a ricodificare l'esportazione, quindi non può essere tecnicamente privo di perdite: un'altra nuova funzionalità, tuttavia, è la possibilità di personalizzare la qualità dell'esportazione, che può essere più vicina a quella senza perdita di dati. Sospetto che questa parte della risposta possa essere applicata anche ad altri software di editing video "project driven" (ad es. Premiere o Final Cut) perché penso che generalmente tutti ricodificano in uscita, sebbene di solito siano molto facili da usare per il taglio preciso.
Personalmente, in genere penso che una singola ricodifica non sia un problema enorme, ma capisco che hai chiesto specificamente una soluzione senza perdita, quindi ...
Lossless (ma molto più complicato!)
Ci sono limitazioni tecniche su quanto sia possibile tagliare con precisione un video senza dover ricodificare almeno una parte di esso, e fondamentalmente dipende dalla frequenza di i-frame. Se ogni fotogramma è un i-frame, puoi tagliare ovunque, ma se sono solo ogni pochi secondi, puoi tagliare senza perdita a quei i-frame senza perdere il contenuto o dover ricodificare (almeno una parte del stream) in modo che possa iniziare con un i-frame.
ffmpeg
Questo SO Q & solleva in particolare la domanda su come tagliare tra i fotogrammi usando ffmpeg
. Non conosco app GUI per farlo, ma in pratica esegui 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 start e duration e possono essere specificate come secondi o hh:mm:ss.ss
, e -acodec copy
e -vcodec copy
indicano ffmpeg no ricodificare.
Non sono esattamente sicuro di cosa succederà se tagli troppo presto, ma penso che il video sia essenzialmente vuoto (o forse danneggiato, a seconda del giocatore) finché non incontra un i-frame. Quindi probabilmente vorrai trovare l'i-frame più vicino prima del taglio. Questa risposta risolve il problema utilizzando ffprobe
e awk
, anche se un po 'scomodo. In sostanza, si utilizza 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 rientrare. In base alle informazioni di questa risposta , dovrebbe essere qualcosa del tipo:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Dove list_of_videos.txt
è un semplice file di testo che elenca i file che vuoi concatenare.
Sommario
iMovie è probabilmente abbastanza buono per la maggior parte dei casi (dalla versione 10), e molto semplice.
ffmpeg può farlo senza perdita di dati (o molto vicino a losslessly), con un po 'di giocherellare; il livello di difficoltà dipende da quanto sia pignolo il punto di partenza preciso e la frequenza dei fotogrammi i.