iMovie (pas sans perte, mais meilleur qu'avant)
iMovie v10 (publié peu de temps après que la question avait été posée à l'origine) permet de mieux gérer davantage de types de supports, ce qui évite l' importation lors du réencodage de la plupart des contenus H.264 (mp4, m4v, mov, AVHDC, mts, mt2s).
Cependant, il sera toujours réencodé à l'exportation et ne pourra donc pas être techniquement sans perte. Une autre nouvelle fonctionnalité est toutefois la possibilité de personnaliser la qualité d'exportation, ce qui peut être plus proche de sans perte. Je suppose que cette partie de la réponse peut s’appliquer également à d’autres logiciels de montage vidéo (tels que Premiere ou Final Cut), car ils ré-encodent généralement à la sortie, bien qu’ils soient généralement très faciles à utiliser pour un découpage précis.
Personnellement, je pense généralement qu’un simple recodage n’est pas un gros problème, mais je comprends que vous avez spécifiquement demandé une solution sans perte, alors ...
Sans perte (mais bien plus compliqué!)
Il existe des limitations techniques quant à la précision avec laquelle vous pouvez couper une vidéo sans avoir à recoder au moins une partie de celle-ci, et cela dépend fondamentalement de la fréquence de la i-frame. Si chaque image est une i-frame, vous pouvez couper n’importe où, mais si elles ne le sont que toutes les quelques secondes, vous ne pouvez couper que sans perte sur ces i-frames sans perdre de contenu ni recodifier (au moins une partie de la flux) afin qu'il puisse commencer avec un i-frame.
ffmpeg
Ce SO Q & A soulève spécifiquement la question de savoir comment couper entre les images i en utilisant ffmpeg
. Je ne connais aucune application graphique pour faire cela, mais en gros, vous exécutez une commande qui ressemble à ceci:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Les deux heures spécifiées sont le début et la durée , et peuvent être spécifiées en secondes ou hh:mm:ss.ss
, et le -acodec copy
et -vcodec copy
dire à ffmpeg de ne pas ré-encoder.
Je ne sais pas exactement ce qui se passera si vous coupez trop tôt, mais je pense que la vidéo est essentiellement vierge (ou peut-être corrompue, en fonction du lecteur) jusqu'à ce qu'elle rencontre une image i. Donc, vous voudrez probablement trouver le cadre i le plus proche avant votre coupe. Cette réponse résout ce problème en utilisant ffprobe
et awk
, quoique un peu maladroitement. Essentiellement, vous utilisez ffprobe
pour numériser les images et trouver l'image clé la plus proche ( flags=K
) avant votre point de coupure idéal. La sortie complète pour chaque image de la vidéo peut être vue comme ceci:
ffprobe -select_streams v -show_frames <INPUT>
La réponse liée fournit cette commande pour rechercher une image clé avant une heure spécifique:
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
Enfin, si vous devez vraiment couper quelque part entre deux images i, vous pouvez diviser la vidéo et la rejoindre. D'après les informations de cette réponse , cela devrait ressembler à ceci :
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Où list_of_videos.txt
est un simple fichier texte listant les fichiers que vous souhaitez concaténer.
Résumé
iMovie est probablement assez bon dans la plupart des cas (depuis la v10) et très facile.
ffmpeg peut le faire sans perte (ou très proche de sans perte), avec un peu de bidouillage; Le niveau de difficulté dépend de votre précision quant au point de départ précis et à la fréquence des images i.