Question Couper une partie du fichier vidéo de la position de départ à la position de fin avec FFmpeg [duplicate]


Cette question a déjà une réponse ici:

J'ai un fichier vidéo de 30 minutes, mais je veux extraire une vidéo de 00:09:23 à 00:25:33.

Je peux définir la position de départ avec -ss, mais je ne pouvais pas en trouver un pour la position finale. Toute aide s'il vous plaît?


118
2018-01-11 17:59


origine




Réponses:


Installez ffmpeg

Assurez-vous télécharger une version récente de ffmpeg, et n'utilisez pas celui fourni avec votre distribution (par exemple, Ubuntu). Les versions packagées de différentes distributions sont souvent obsolètes et ne se comportent pas comme prévu.

Ou compile-le toi-même.

Comment couper une vidéo sans ré-encoder

Utilisez ceci pour couper la vidéo de [start] pour [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Ici, les options signifient ce qui suit:

  • -ss spécifie l'heure de début, par ex. 00:01:23.000 ou 83 (en secondes)
  • -t spécifie la durée du clip (même format).
  • Récent ffmpeg a également un drapeau pour fournir l'heure de fin avec -to.
  • -c copy copie le premier flux binaire vidéo, audio et de sous-titres depuis l'entrée vers le fichier de sortie sans les recoder. Cela ne nuira pas à la qualité et fera exécuter la commande en quelques secondes.

Notez qu'avec les anciennes versions de ffmpeg, cette commande peut ne pas être précise lors de la copie des flux binaires.

Comment couper une vidéo, sans réencodage - méthode précise

Si vous avez une ancienne version de ffmpeg et que vous souhaitez une précision d'image, utilisez plutôt ceci:

ffmpeg -i in.mp4 -ss [start] -t [duration] -c copy out.mp4

Cependant, il y a un inconvénient. La vidéo devra être décodée jusqu'à ce qu'elle atteigne la position impliquée par -ss, et seulement alors il commence à copier le flux binaire. Cela peut prendre beaucoup de temps, surtout pour de très longues vidéos.

Comment couper une vidéo, avec ré-encodage

Si vous omettez le -c copy option, ffmpeg réencodera automatiquement la sortie vidéo et audio en fonction du format que vous avez choisi. Pour une vidéo et un son de haute qualité, lisez le x264 Guide de codage et le Guide de codage AAC, respectivement.

Par exemple:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

Comme expliqué par Recherche avec FFmpeg): Lors de l'utilisation -ss avant -i sur FFmpeg 2.1 et versions ultérieures, la recherche est précise pour les images lors du ré-encodage de la vidéo (c.-à-d. sans utiliser -c copy). Donc, vous n'avez pas à vous soucier de mettre -ss après -i pour la vitesse.


Conversion des points de fin en durée

Si vous devez utiliser une ancienne version de ffmpeg et ne peut pas utiliser le -to option, vous pouvez créer une liste d'édition des points d'entrée et de sortie et les convertir en points avec une durée. Pour cela, vous pouvez utiliser ce script Ruby J'ai écrit, qui calcule la différence:

require "Time"
def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end

Par exemple:

time_diff("00:09:23.000", "00:25:33.000")
=> "00:16:10.000" 

209
2018-01-11 21:02



Sur Ubuntu 12:10, -c: v et -c: a ne fonctionnait pas. J'ai dû utiliser "-acodec copy et -vcodec copy" à la place. - Samuel Lampa
@Samuel Ensuite, vous utilisez une version obsolète, qui n'est même pas un vrai FFmpeg, mais le fork de Libav. Voir: stackoverflow.com/a/9477756/1109017 - slhck
Merci pour cela! si vous ne spécifiez pas de durée, ira-t-il à la fin? - Jeff
@Jeff Oui! (caractère minimum) - slhck
@Prateek Lors de la copie du flux vidéo (au lieu de réencoder), vous ne pouvez couper que images clés. S'il y a des images clés aux secondes 1, 2 et 3, mais que vous voulez couper à la seconde 1,5, alors ffmpeg attendra la seconde 2 avant de pouvoir commencer à couper. Cela le rend inexact. - slhck


Je pense que vous pouvez utiliser la commande suivante maintenant.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Regardez aussi ffmpeg doc, ou cette page wiki.


18
2018-05-07 02:30



ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile version plus simple - nwgat
Je devais utiliser ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4 version (avec -copyts), sinon il coupe incorrectement (avec un écran noir au début). Merci pour le 2ème lien. - Necronomicron
C'est génial, la dernière chose que je voulais était de calculer la durée à partir des points d'extrémité. - Tomasz Gandor
L'option -to répond à la question réellement posée. Les autres réponses sont impertinentes ou obsolètes. - James Bowery


C'est étrange que personne n'ait suggéré la trim  filtre.

Supprimez tout sauf la seconde minute de saisie:

ffmpeg -i INPUT -vf trim=60:120

Ne conservez que la première seconde:

ffmpeg -i INPUT -vf trim=duration=1

Déposez tout sauf de la seconde 13 à la seconde 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
2018-04-07 15:10



Oui, bon de mentionner trim et atrim. Je les utilise généralement lors du filtrage, mais les utilisateurs doivent noter que le filtrage nécessite un recodage. - LordNeckbeard
Tu es mon héros. J'avais vraiment besoin d'un filtre pour faire ça. - fahadash


Vous pouvez utiliser ces deux méthodes qui fonctionnent pour Windows et Linux.

Il existe deux manières de diviser les fichiers vidéo par ffmpeg. Le premier est bon en soi, plus que cela - il est plus rapide, mais crée parfois des fichiers de sortie avec certaines failles. Donc, pour ces cas, il existe la deuxième façon de fractionner les fichiers vidéo: il est considérablement plus lent, les fichiers de sortie sont plus gros, mais il semble qu'ils soient toujours du même niveau de qualité que les fichiers d'entrée utilisés.

Voie 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Way 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start> - le début de la partie d'une vidéo ffmpeg est à couper. Format: 00:00:00.0000, ce qui signifie heures: minutes: secondes: millisecondes.

  • <duration> - la durée de la partie d'une vidéo ffmpeg est à couper. Même format que ci-dessus.

Exemples:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg coupe une partie du fichier vidéo à partir de 1 heure 19 minutes 0 seconde. La durée de la séquence vidéo est de 5 minutes 0 secondes.


3
2017-10-03 19:08



Ok, merci. Je vais vérifier les documents et essayer demain. - juGGaKNot
-sameq ne signifie pas "même qualité" et a été retiré de ffmpeg. Utilisation -codec copy au lieu. Aussi, ne pas oublier le -to option. - LordNeckbeard
J'ai corrigé les commandes dans votre devis, car elles étaient assez obsolètes. Veuillez ne pas copier-coller les informations sans les citer correctement. - slhck


Vous pouvez l'utiliser

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Ici, vous devez donner la durée de la vidéo. c'est à dire. 00: 25: 33-00: 09: 23


-1
2018-01-11 18:29



Comme je l'ai mentionné dans l'autre réponse: Avec votre commande, vous ré-encodez le fichier, ce qui n'est absolument pas nécessaire, ce qui réduit la qualité et augmente le temps de traitement. - slhck


J'utilise la syntaxe suivante pour couper la vidéo avec ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t est utilisé pour définir la durée en secondes - vous ne pouvez pas spécifier l'heure de fin, mais cela devrait fonctionner pour vous.


-2
2018-01-11 18:27



Pourquoi configurez-vous FFmpeg pour ré-encoder le fichier? Notez que -sameq ne signifie pas "même qualité" du tout. - slhck