Utiliser ffmpeg pour découper une vidéo


333

J'utilise ffmpeg pour découper une section d'un fichier volumineux comme ceci:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

La -sspartie fonctionne bien mais la -test ignorée. Il supprime correctement les secondes spécifiées initialement spécifiées avec -ssmais continue à aller à la fin de l'entrée avec la copie.

Existe-t-il un moyen d'utiliser ffmpeg pour couper la fin d'une vidéo sans la recoder?


1
cette syntaxe est correcte.
jiggunjer

Réponses:


394

Vous pouvez utiliser l' -ssoption pour spécifier un horodatage de démarrage et l' -toption pour spécifier la durée d'encodage. Les horodatages doivent être au HH:MM:SS.xxxformat ou en secondes ( s.msec).

Les éléments suivants coupent les 30 premières secondes, puis tout ce qui se passe 10 secondes après:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Notez que ceci -test une option de sortie et doit toujours être spécifié après -i .

Quelques conseils:

  • Pour les anciennes versions de ffmpeg, si vous utilisez -ssaprès -i, vous obtiendrez une recherche plus précise au détriment d’une exécution plus lente. Voir aussi: Rechercher avec FFmpeg
  • Vous pouvez utiliser -toau lieu de -tspécifier l’horodatage sur lequel vous voulez couper. Donc, au lieu de -i <input> -ss 30 -t 10vous pourrait également faire -i <input> -ss 30 -to 40pour atteindre le même objectif.

  • Si votre ffmpeg ne prend pas en charge -c, ou -to, il est probablement très obsolète. Compilez vous-même une nouvelle version ou téléchargez une version statique à partir de leur page d'accueil. C'est vraiment pas compliqué.


1
@Mondain En fait, vous obtenez plus de précision en mettant le -ss après. Et slhck mentionne ceci ici blog.superuser.com/2012/02/24/… aussi dans la documentation de ffmpeg pour -ss il mentionne une différence entre le mettre avant ou après.
barlop

5
+1 Je suis venu ici pour savoir comment tout ignorer après les 35 premières secondes, merci:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
Cela ne fonctionne pas pour moi (mp4). Il produit juste un écran noir de 5 secondes:frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
Clocksmith

2
Cela produit 3-4 s écran noir au début de mon clip vidéo. La modification de Chris en omettant de -c copysupprimer l'écran noir initial, voir sa réponse pour plus de détails.
Joelostblom

4
Vous écrivez "Les éléments suivants découperaient les 30 premières secondes, puis tout ce qui se passe 10 secondes après:" <- Qu'est-ce que cela signifie? Voulez-vous dire inclure par clip? "cos clip" peut signifier "clip out". En supposant que vous vouliez dire inclure. Voulez-vous dire commencer à partir de 30 secondes et inclure seulement 10 secondes à partir de là? Si c'est le cas, alors je vous suggère d'écrire que ce serait beaucoup plus clair.
Barlop

95

Comme d'autres personnes l'ont mentionné, mettre -ssavant (beaucoup plus rapidement) ou après (plus précisément) -ifait toute la différence. La section "Recherche rapide et précise" de la page de recherche de ffmpeg vous explique comment obtenir les deux. Je l'ai utilisée et cela fait toute la différence. En gros, vous mettez -ssavant ET après le -i, assurez-vous de laisser assez de temps avant de commencer à couper pour avoir une autre image clé. Exemple: si vous souhaitez créer un clip d’une minute, de 9min0sec à 10min 0sec dans Video.mp4, vous pouvez le faire rapidement et avec précision en utilisant:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

La première -ssvise à rapide (environ) 8min0sec, puis la seconde -ssvise précisément à 9min0sec, et le -t 00:01:00fait sortir un clip 1min0sec.

Notez également le point important de cette page: "Si vous utilisez -sswith -c:v copy, le flux de données résultant peut être saccadé, illisible ou non synchronisé avec le flux audio, car ffmpeg est forcé de n'utiliser / diviser que sur des images i. "

Cela signifie que vous devez ré-encoder la vidéo, même si vous souhaitez simplement la copier, sinon vous risquez de la perdre et de la désynchroniser. Vous pouvez essayer d’ -c copyabord, mais si la vidéo est nulle, vous devrez la refaire.


le même avertissement s'applique à -c:a copycette façon de chercher.
jiggunjer

1
La meilleure réponse, de cette façon a fonctionné le meilleur pour moi.
Ondra Žižka

3
Il semble que "-ss" soit maintenant rapide et précis dans ffmpeg 2.1+ sans le spécifier deux fois. trac.ffmpeg.org/wiki/Seeking
Conrad Meyer

25

J'ai trouvé que -sscombinée avec -c copyrésultait en une côtelette d'une demi-seconde au début.

Pour éviter cela, vous devez supprimer le -c copy(qui fera certes un transcodage).


4
Il y a une autre réponse qui traite de la précision. Le réencodage avec l'option par défaut n'est souvent PAS ce que vous voulez faire!
Tomasz Gandor

Bon point @TomaszGandor
Chris

1
Je n'ai pas du tout compris la réponse de @TomaszGandor, mais la supprimer a été -c copycorrigée.
Iulian Onofrei

14

MANUELLEMENT

Ouvrez le fichier dans un lecteur multimédia qui avance image par image et lisez un fichier AVISynth contenant des données telles que:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Ensuite, coupez avec le format d’heure EXACT:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

et

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Créez maintenant un fichier txt avec les fichiers vidéo avec des contenus tels que:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Exécuter ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

Pour moi, l' -toption n'a pas fonctionné, mais a -vframesfonctionné. Je préfère utiliser #frames, car je préfère couper chez I-Frames et j'ai découvert GOP pour l'utilisation vidéo ffprobe.

La ligne de commande qui a fonctionné pour moi est la suivante:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

À propos, mettre -ssen avant -ifait une grande différence dans le temps d'exécution.


1
En fait -vframes(ou -frames:v) devrait venir après -iparce que c'est une option de sortie.
Slhck

5

Comme avec user225366, l'option -t ne fonctionne pas pour les vidéos courtes, mais elle le fait pour les vidéos plus longues. Pour les courtes vidéos, il semble que -frames: v is better. C'est ce qui a fonctionné pour moi.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

La copie -acodec doit être ajoutée si la vidéo contient de l'audio, comme le montrent les autres réponses.


0

Je ne vois pas beaucoup le mentionner (je ne suis pas un expert, alors il y a peut-être un piège), mais si votre fichier contient d'autres flux tels que des sous-titres et d'autres métadonnées telles que des chapitres, etc., il est possible de couper / couper et de conserver tous les flux avec le même fichier. commande suivante

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Avec -map 0vous prenez tous les flux du fichier et -c copycopiez-les tous tels quels.
Si vous -toomettez le début via -ss, la vidéo en entrée sera coupée du début à la seconde 60.

Il mapest également utile de bidouiller avec si vous souhaitez que seuls des flux spécifiques soient conservés (vous n'avez peut-être pas besoin de toutes les sources audio du fichier, ni de certains sous-titres).

J'utilise ceci lorsque j'ai besoin de fractionner de gros fichiers MKV qui ne peuvent pas être stockés dans le stockage FAT32.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.