46 votes

Comment couper des images exactes avec ffmpeg ?

J'essaie d'utiliser ffmpeg pour couper des fichiers vidéo à des moments précis. L'aide de ffmpeg montre une option -timecode_frame_start pour spécifier l'image de départ mais je n'arrive pas à faire fonctionner cette commande. La vidéo résultante commence toujours au début de la vidéo originale. Voici un exemple de la commande que j'exécute :

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

J'ai déplacé l'option timecode_frame_start avant et après les autres options sans que les résultats ne changent. Y a-t-il une option supplémentaire que je dois spécifier ? J'ai essayé différents formats de fichiers, mkv, avi, mp4, et il ne semble pas que le problème soit lié au codec. Voici un fichier que j'ai essayé :

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

Ai-je oublié quelque chose ?

69voto

slhck Points 209720

timecode_frame_start ne fonctionne pas de cette manière.

Il n'est pas possible d'effectuer une recherche sur la base des numéros de cadre. La seule façon de commencer à des images spécifiques est de convertir un nombre d'images en ss.ms ou la syntaxe hh:mm:ss.ms . Ainsi, si votre vidéo est à 25 fps et que vous souhaitez commencer à 133 images, vous devez d'abord calculer l'horodatage :

133 / 25 = 5.32

Ensuite, courez :

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Notez que la découpe sur des images exactes avec la copie de flux binaire ( -c:v copy ) n'est pas possible, car toutes les images ne sont pas intra-codées ("keyframes"). Une vidéo doit commencer par une image clé pour être décodée correctement. Vous devrez donc recoder la vidéo, par exemple en H.264 à l'aide de la fonction -c:v libx264 comme indiqué ci-dessus. Vous pouvez également choisir un codec sans perte comme -c:v ffv1 qui préserve la qualité de la vidéo d'entrée.

En résumé, -ss sera toujours précis à l'image près lors du réencodage.

Si vous souhaitez également encoder un nombre spécifique de trames, utilisez la fonction -frames:v par exemple :

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

Notez que vous avez également la possibilité de utiliser le select / aselect filtres pour sélectionner les images/échantillons audio.

ffmpeg -i input.mp4 -vf 'select=gte(n\,100)' -c:v libx264 -c:a aac out.mp4

Cette méthode est toutefois plus lente que la méthode -ss présentée ci-dessus, puisque la vidéo entière sera décodée.

14voto

Nuo Chen Points 149

L'option

-vf select="between(n\,start_frame_num\,end_frame_num),setpts=PTS-STARTPTS"

par exemple,

-vf select="between(n\,200\,300),setpts=PTS-STARTPTS"

coupe la vidéo de (y compris) la 200ème à (y compris) la 300ème image, le comptage de la séquence commence à 0.

1voto

Expectator Points 11

Coupe sans perte est un outil GUI multiplateforme qui utilise FFmpeg comme backend et coupe votre vidéo sans perte. Vous pouvez choisir de couper à une image clé ou à n'importe quelle image.

0voto

M.Hamdy.Ghanem Points 21

J'ai une solution, mais je ne sais pas comment le faire en utilisant les commandes actuelles de ffmpeg (mes essais de copier aux images clés n'ont pas abouti non plus. Je voudrais savoir comment ffmpeg décide des points de coupe).

Je propose cet algorithme, pour diviser le segment (t1, t2) que l'on veut copier en 3 parties :

  1. une partie (t1-x, t1+y), qui est un bloc codé complet devant être recodé pour pouvoir copier précisément la partie (t1, y).
  2. une partie (t2-z, t3+w), qui est un bloc codé complet devant être recodé pour pouvoir copier précisément la partie (z, t2).
  3. une partie centrale (y, z) qui contient des blocs codés complets et qui peut être copiée telle quelle.
  4. Assembler les trois parties résultant des étapes précédentes.

Notez que les deux premières parties sont censées être petites (et l'une d'entre elles ou les deux peuvent être de longueur nulle), de sorte que le processus de réencodage sera rapide. Cela nous permettra d'avoir des coupes exactes avec une opération légèrement plus lente mais toujours super rapide que le réencodage de la vidéo complète. Cela peut être encore plus rapide si nous pouvons faire plusieurs coupes avec une seule commande, de sorte que nous traversons les images une seule fois. J'espère que quelqu'un pourra appliquer cela, et nous dire comment, ou mentionner l'équipe de ffmpeg, ou leur transmettre de toute façon.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X