Question Utiliser ffmpeg pour découper la vidéo


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

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

le -ss une partie fonctionne bien, mais la -t est ignoré. Il supprime correctement les secondes spécifiées initiales spécifiées avec -ss mais continue ensuite à aller à la fin de l'entrée avec la copie.

Est-il possible d'utiliser ffmpeg pour couper la fin d'une vidéo sans la recoder?


249
2018-05-06 14:12


origine


cette syntaxe est correcte. - jiggunjer
stackoverflow.com/questions/18444194/ - Ciro Santilli 新疆改造中心 六四事件 法轮功


Réponses:


Vous pouvez utiliser le -ss option pour spécifier un horodatage de démarrage, et le -t option pour spécifier la durée d'encodage. Les horodatages doivent être dans HH:MM:SS.xxx format ou en secondes (s.msec).

Les éléments suivants coupaient les 30 premières secondes, puis coupaient tout ce qui se passait 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 -t est une option de sortie et doit toujours être spécifiée après  -i.

Quelques conseils:

  • Pour les anciennes versions de ffmpeg, si vous utilisez -ss après -i, vous obtenez une recherche plus précise au détriment d'une exécution plus lente. Voir également: Recherche avec FFmpeg
  • Vous pouvez utiliser -to au lieu de -t pour spécifier l’horodatage auquel vous voulez couper. Donc, au lieu de -i <input> -ss 30 -t 10 tu pourrais aussi faire -i <input> -ss 30 -to 40 pour réaliser la même chose.

  • Si votre ffmpeg ne supporte pas -c, ou -to, il est probablement très dépassé. Compiler une nouvelle version vous ou télécharger une version statique de leur page d'accueil. Ce n'est vraiment pas compliqué.


301
2018-05-15 00:03



@Mondain En fait, vous obtenez plus de précision en mettant -ss après. Et Slhck mentionne ceci ici blog.superuser.com/2012/02/24/...  aussi dans la documentation de ffmpeg pour -ss mentionne une différence entre le mettre avant ou après. - barlop
+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
Cela ne fonctionne pas pour moi (mp4). Il ne fait que produire 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
Cela a produit 3-4 s écran noir au début de mon clip vidéo. Modification de Chris avec omission -c copy enlevé l'écran noir initial, voir sa réponse pour plus de détails. - Joel Ostblom
Vous écrivez "Ce qui suit clipperait les 30 premières secondes, puis écraserait tout ce qui est 10 secondes après cela:" <- Qu'est-ce que cela signifie? Par clip, vous voulez dire inclure? 'cos clip peut signifier un clip out. En supposant que vous voulez dire inclure. Voulez-vous dire commencer à 30 secondes et inclure seulement 10 secondes à partir de là? Si oui, alors je vous suggère d'écrire que ce serait beaucoup plus clair. - barlop


Comme d’autres personnes l’ont mentionné, mettre -ss avant (beaucoup plus rapide) ou après (plus précis) le -i fait une grande différence La section "Recherche rapide et précise" sur la page de recherche de ffmpeg vous indique comment les obtenir, et je les ai utilisées, et cela fait une grande différence. En gros tu mets -ss avant ET après le -i, assurez-vous de laisser suffisamment de temps avant de commencer à couper pour avoir une autre image clé. Exemple: Si vous souhaitez créer un clip de 1 minute, de 9min0sec à 10min 0sec dans Video.mp4, vous pouvez le faire rapidement et avec précision à l'aide de:

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

La première -ss cherche rapidement à (environ) 8min0sec, puis le second -ss cherche avec précision à 9min0sec, et le -t 00:01:00 sort un clip de 1min0sec.

Notez également ce point important de cette page: "Si vous utilisez -ss avec -c:v copy, le flux binaire résultant pourrait finir par être instable, ne pas pouvoir être lu ou désynchronisé avec le flux audio, puisque ffmpeg est obligé d'utiliser / diviser uniquement sur les i-frames. "

Cela signifie que vous devez ré-encoder la vidéo, même si vous souhaitez simplement la copier, ou risquer d’être instable et désynchronisée. Tu pourrais essayer juste -c copy D'abord, mais si la vidéo est nul, vous devrez le refaire.


69
2018-01-20 04:07



le même avertissement s'applique à -c:a copy pour cette façon de chercher. - jiggunjer
La meilleure réponse, cette façon a fonctionné le mieux pour moi. - Ondra Žižka


Je l'ai trouvé -ss combiné avec -c copy a entraîné une demi-seconde de coupure au départ.

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


17
2018-05-09 02:24



Il y a une autre réponse qui traite de la précision. Le recodage avec l'option par défaut n'est souvent PAS ce que vous voulez faire! - Tomasz Gandor
Bon point @TomaszGandor - Chris
Je n'ai pas compris la réponse de @ TomaszGandor, mais en supprimant -c copy réparé - Iulian Onofrei


MANUELLEMENT

Ouvrez le fichier dans un lecteur multimédia qui avance par image Fichier AVISynth avec 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)

Coupez ensuite avec le format de temps 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 un contenu tel que:

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

Exécutez ffmpeg:

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

12
2017-09-04 05:48





Pour moi -t l'option n'a pas fonctionné, mais -vframes travaillé. Je préfère utiliser #frames, comme je préfère couper à I-Frames et j'ai découvert GOP pour la vidéo en utilisant 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

Au fait, mettre -ss en face de -i fait une grande différence dans le temps d'exécution.


7
2018-05-19 03:14



Réellement -vframes (ou -frames:v) devrait venir après -i parce que c'est une option de sortie. - slhck


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

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

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


1
2017-12-08 11:24