web-dev-qa-db-fra.com

Utiliser ffmpeg pour découper une vidéo

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 partie -ss fonctionne correctement, mais le -t est ignoré. Il supprime correctement les secondes spécifiées initialement spécifiées avec -ss mais continue ensuite à 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?

301
Neil

Vous pouvez utiliser l'option -ss pour spécifier un horodatage de démarrage et l'option -t pour spécifier la durée de codage. Les horodatages doivent être au format HH:MM:SS.xxx 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 -t est une option de sortie et doit toujours être spécifié after -i.

Quelques conseils:

  • Pour les anciennes versions de ffmpeg, si vous utilisez -ss après -i, vous obtenez une recherche plus précise aux dépens d’une exécution plus lente. Voir aussi: Recherche avec FFmpeg
  • Vous pouvez utiliser -to au lieu de -t pour spécifier l'horodatage sur lequel vous souhaitez couper. Ainsi, au lieu de -i <input> -ss 30 -t 10, vous pouvez également utiliser -i <input> -ss 30 -to 40 pour obtenir le même résultat.

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

360
user37242

Comme d'autres personnes l'ont mentionné, placer -ss avant (beaucoup plus rapidement) ou après (plus précisément) le -i fait une grande différence. La section "Recherche rapide et précise" de la page de recherche de ffmpeg vous indique comment obtenir les deux. Je l'ai utilisée et cela fait toute la différence. En gros, vous mettez -ss avant AND 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 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

Le premier -ss cherche rapidement (environ) 8min0sec, puis le second -ss cherche précisément à 9min0sec et le -t 00:01:00 prend 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 peut être saccadé, illisible ou désynchronisé avec le flux audio, car ffmpeg est forcé de n'utiliser/diviser que sur i- cadres."

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 juste d'abord -c copy, mais si la vidéo est nulle, vous devrez la refaire.

86
seriesoftubes

J'ai trouvé que -ss combiné avec -c copy donnait un hachage d'une demi-seconde au début.

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

22
Chris

MANUELLEMENT

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

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"
14
Budman1

Pour moi, l'option -t n'a pas fonctionné, mais -vframes a fonctionné. Je préfère utiliser #frames, car je préfère couper chez 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

En passant, placer -ss au début de -i fait une grande différence en termes de temps d'exécution.

9
Ben

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.

4
VectorVortec