web-dev-qa-db-fra.com

Utiliser ffmpeg pour changer le framerate

J'essaie de convertir un clip vidéo (MP4, yuv420p) de 30 ips à 24 ips. Le nombre d'images est correct, ma sortie devrait donc passer de 20 minutes à 30 images par seconde à 25 minutes à 24 images par seconde. Tout le reste devrait rester le même.

Tout ce que j’essaie d’essayer avec ffmpeg convertit la fréquence d’image mais modifie le nombre d’images pour conserver la même durée ou modifie la durée sans modifier le nombre d’images en mémoire.

J'ai donc typiquement essayé des choses comme:

ffmpeg -y -r 30 -i seeing_noaudio.mp4 -r 24 seeing.mp4

(Je le fais sur Windows mais normalement sur Linux). Cela convertit le nombre d'images par seconde, mais supprime les images de sorte que la durée totale ne soit pas modifiée.

Ou j'ai essayé 

ffmpeg -y -i seeing_noaudio.mp4 -filter:v "setpts=1.25*PTS" seeing.mp4

Ce qui change la durée mais pas le framerate.

Je devrais sûrement pouvoir faire cela avec une seule commande ffmpeg sans avoir à ré-encoder ou même comme certaines personnes ont suggéré de revenir aux images brutes originales.

Aidez-moi, s'il vous plaît

21
J Brand

Avec ré-encodage:

ffmpeg -y -i seeing_noaudio.mp4 -vf "setpts=1.25*PTS" -r 24 seeing.mp4

Sans ré-encodage:

Première étape - extraire la vidéo dans un flux binaire brut

ffmpeg -y -i seeing_noaudio.mp4 -c copy -f h264 seeing_noaudio.h264

Remux avec un nouveau framerate

ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4
26
Gyan

Spécifiez simplement le nombre d'images par seconde souhaité dans l'option "-r" avant le fichier d'entrée:

ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4

Les options affectent le fichier suivant APRES eux. "-r" avant un fichier d'entrée oblige à réinterpréter son en-tête comme si la vidéo était encodée à la fréquence d'image indiquée. Aucune recompression n'est nécessaire. Il y avait un petit utilitaire avifrate.exe pour corriger les en-têtes de fichiers avi directement pour changer le nombre d'images par seconde. La commande ffmpeg ci-dessus fait essentiellement la même chose mais doit copier le fichier entier.

2
MKaama

Autant que je sache, vous ne pouvez pas faire cela avec ffmpeg sans ré-encodage. J'avais un fichier 24fps que je voulais à 25fps pour correspondre à un autre matériel avec lequel je travaillais. J'ai utilisé la commande ffmpeg -i inputfile -r 25 outputfile qui fonctionnait parfaitement avec une entrée webm, matroska et aboutissait à une sortie h264, matroska utilisant l'encodeur: Lavc56.60.100

Vous pouvez accomplir la même chose à 6 images par seconde, mais comme vous l'avez noté, la durée ne changera pas (ce qui est dans la plupart des cas une bonne chose, sinon vous perdrez la synchronisation audio). Si cela ne correspond pas à vos besoins, je vous suggère d'essayer this answer bien que mon expérience me montre qu'il recode encore le fichier de sortie.

Pour une meilleure précision des images, il est préférable de décoder en flux bruts comme suggéré précédemment. J'utilise un script pour cela tel que reproduit ci-dessous:

#!/bin/bash
#This script will decompress all files in the current directory, video to huffyuv and audio to PCM
#unsigned 8-bit and place the output #in an avi container to ease frame accurate editing.
for f in *
do
ffmpeg -i "$f" -c:v huffyuv -c:a pcm_u8 "$f".avi
done

Il est clair que ce script suppose que tous les fichiers du répertoire en cours sont des fichiers multimédias, mais peut facilement être modifié pour limiter le traitement à une extension spécifique de votre choix. Sachez que la taille de votre fichier augmente considérablement lorsque vous décompressez en flux bruts.

0
Elder Geek