Comment couper à des images exactes en utilisant ffmpeg?

22

J'essaie d'utiliser ffmpeg pour couper des fichiers vidéo à des moments précis. L'aide de ffmpeg affiche une option -timecode_frame_start pour spécifier la trame de départ mais je ne parviens pas à faire fonctionner cette commande. La vidéo résultante commence toujours au début de la vidéo d'origine. 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 changement dans les résultats. 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

Suis-je en train de manquer quelque chose?

curmil
la source
semble que cela a été répondu sur la liste de diffusion (et NB qu'avec la copie -vcodec, vous ne pouvez pas "vraiment" obtenir une découpe spécifique au cadre, car il ne peut se resynchroniser que sur les i-frames
rogerdpack
@ user39364 J'ai demandé sur la liste de diffusion et il s'avère que cette option ne fait pas ce que l'OP veut. J'ai aussi appris quelque chose de nouveau :)
slhck
Je voulais juste noter que j'ai trouvé une méthode pour couper à des images exactes en utilisant melt, voir Couper avec précision des fichiers vidéo à partir de la ligne de commande - Super User
sdaau

Réponses:

46

Je viens d'apprendre que le timecode_frame_startne fonctionne pas comme ça. La seule façon de commencer à des images spécifiques est de convertir un certain nombre d'images en ss.mssyntaxe, ou hh:mm:ss.ms. Donc, si votre vidéo est à 25 ips et que vous souhaitez commencer à 133 images, vous aurez besoin

133/25 = 5,32

Alors, lancez

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

Notez qu'il -c:v copyn'est pas possible de découper des images exactes avec la copie ( ) du flux binaire car toutes les images ne sont pas intra-codées et peuvent se suffire à elles-mêmes.

-ss sera toujours précis.

Si vous souhaitez encoder un nombre spécifique d'images, utilisez -frames:vpar exemple:

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

Vous avez également le choix d' utiliser des filtres vidéo , mais la prise en charge audio peut ne pas être exacte. Et apparemment, la recherche sur les cadres n'est toujours pas une fonctionnalité. Vous pouvez suivre ce fil de la liste de diffusion des utilisateurs de FFmpeg pour plus d'informations:

vous pouvez utiliser -vf selectpour une sélection précise des images (quelque chose comme -vf 'select=gte(n\,100)'sauter les 100 premières images)

slhck
la source
3
pour les vidéos avec des images perdues (par exemple 29,97 ips) qui durent plus de 10 minutes; comment feriez-vous pour calculer avec précision le temps d'une image particulière?
GFoley83
la select=gte(n\,100)méthode fonctionne mais la recherche mange la performance. Si vous testez en n'encodant que 30 images à la fois, plus la vidéo commence, plus le ffmpeg prend de temps à cause de la recherche.
Adam Grant
6

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 (inclut) 200e à (inclut) 300e image, le comptage de séquence commence à 0.

Nuo Chen
la source