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
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
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.
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.