531 votes

Utilisation de ffmpeg pour découper une vidéo

J'utilise ffmpeg pour découper une section d'un grand fichier comme celui-ci :

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

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

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

622voto

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

La méthode suivante consiste à couper les 30 premières secondes, puis à couper tout ce qui se trouve 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é 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 prix d'une exécution plus lente. Voir aussi : Recherche avec FFmpeg

  • Vous pouvez utiliser -to 代わりに -t pour spécifier l'horodatage auquel vous voulez couper. Ainsi, au lieu de -i <input> -ss 30 -t 10 vous pouvez également faire -i <input> -ss 30 -to 40 pour obtenir la même chose.

  • Si votre ffmpeg ne supporte pas -c ou -to il est probablement très obsolète. Compiler une nouvelle version vous-même ou télécharger une construction statique depuis leur page d'accueil. Ce n'est vraiment pas compliqué.

6 votes

@Mondain En fait, vous obtenez plus de précision en mettant le -ss après. Et Slhck le mentionne 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.

3 votes

D'après la documentation, la partie que vous dites à propos de -t qui est seulement une option de sortie est incorrecte : When used as an input option (before -i), limit the duration of data read from the input file. When used as an output option (before an output filename), stop writing the output after its duration reaches duration.

166voto

seriesoftubes Points 1751

Comme d'autres personnes l'ont mentionné, mettre -ss avant (beaucoup plus rapide) ou après (plus précise) la -i fait une grande différence. La section "Fast And Accurate Seeking" sur la page ffmpeg seek vous indique comment obtenir les deux, et je l'ai utilisé, et cela fait une grande différence. En gros, vous mettez -ss avant ET après le -i Assurez-vous de laisser suffisamment de temps avant l'endroit où vous voulez commencer à couper pour avoir une autre image clé. Exemple : Si vous voulez faire un clip d'une minute, de 9min0sec à 10min 0sec dans Video.mp4, vous pouvez le faire à la fois rapidement et précisément 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 jusqu'à (approximativement) 8min0sec, et ensuite la seconde -ss cherche avec précision à 9min0sec, et la -t 00:01:00 retire un clip de 1min0sec.

Notez également ce point important de cette page : "Si vous utilisez -ss con -c:v copy le flux binaire résultant peut finir par être haché, non lisible ou désynchronisé par rapport au flux audio, puisque ffmpeg est obligé d'utiliser/de diviser uniquement les i-frames".

Cela signifie que vous devez réencoder la vidéo, même si vous souhaitez simplement la copier, au risque qu'elle soit hachée et désynchronisée. Vous pouvez essayer de -c copy d'abord, mais si la vidéo est nulle, vous devrez la refaire.

2 votes

-ss comme option d'entrée est à la fois rapide et précis à partir de FFmpeg 2.1, il n'y a donc pas besoin de l'inclure comme option de sortie aussi : trac.ffmpeg.org/wiki/Seeking

0 votes

Est-il possible de clarifier : Cette réponse dit "Vous pourriez essayer de juste -c copy d'abord, mais si la vidéo est nulle, vous devrez la refaire." Cependant, seulement -c copy est fournie dans la réponse, il n'y a pas de discussion sur les options à ajouter si le résultat n'est pas coupé correctement. Quelles sont les options à ajouter ?

45voto

alastairs Points 3281

J'ai trouvé que -ss combiné avec -c copy a entraîné une chute d'une demi-seconde au départ.

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

2 votes

Il a ajouté 7 secondes au début de la sortie quand j'ai utilisé -c copy をもって -ss .

0 votes

J'ai découvert qu'en supprimant l'option -c, il n'est pas nécessaire d'ajouter un deuxième -ss avant l'option -t.

15voto

budman1 Points 300

MANUELLEMENT

Ouvrez le fichier dans un lecteur multimédia qui avancera et lira une image 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)

Ensuite, coupez 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"

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"

Maintenant, créez un fichier txt avec les fichiers vidéo avec des contenus comme :

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

Lancez ffmpeg :

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

0 votes

Si vous utilisez -c copy, les images clés d'origine et leur position seront conservées. Vos vidéos seront coupées en fonction de ces images clés, donc non, le temps ne sera pas exact.

11voto

Zimba Points 753

Utiliser ce format :

ffmpeg <start time> <input file> <cut duration> <out file>

Par exemple, coupez un clip de 60 secondes après une minute de vidéo.

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

Notes :
heure de départ avant fichier en entrée est plus rapide.
heure de départ après fichier en entrée est exacte/précise.

0 votes

Heure de début antes de L'option d'entrée est précise/précise, aussi, pour FFmpeg 2.1+.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X