Voici la méthode utilisant les versions actuelles de FFmpeg. Il repose sur le démultiplexeur concat ne pas redimensionner le PTS des entrées après le premier fichier, mais simplement appliquer un décalage fixe. Disons que vous avez un flux de 30 ips avec une échelle de temps 15360
(typique de la sortie FFmpeg). Cela signifie que la trame 0
a PTS 0
et la trame 30
a PTS 15360
. Cela deviendrait un flux de 45 fps si nous pouvions changer l'échelle de temps 23040
sans affecter les valeurs PTS.
C'est essentiellement ce que fait la méthode ci-dessous.
1 . Identifiez les propriétés de la source.
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
30 fps, 30 tbr, 15360 tbn (default)
Vous souhaitez noter les propriétés de la source, en particulier la résolution et tbn
.
2a . (Facultatif) Modifiez l'échelle de temps en quelque chose de pratique, pour simplifier les calculs.
ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4
Cela nous amène
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
30 fps, 30 tbr, 30 tbn (default
Si vous effectuez cette étape, la nouvelle échelle de temps doit être égale ou un multiple entier de la fréquence d'images d'origine.
2b . Calculez l'échelle de temps nécessaire, de sorte que pour la x
fréquence d' images cible , le PTS de la trame # x
dans la source ait la même valeur que la nouvelle tbn
. Si vous avez effectué l'étape 2a, c'est très simple et c'est simplement le nouveau framerate. Donc, pour les fps cibles 45
, le nouveau tbn
devrait être 45
.
3 . Générez une vidéo factice.
ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4
Toutes les propriétés doivent être identiques comme la résolution, le profil H.264, le format de pixel, le nombre de références ... etc. pour de meilleurs résultats.
4 Concattez les vidéos.
Créez d'abord un fichier texte
file '0.mp4'
file 'in-v30.mp4'
Ensuite, le concat
ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4
Le fichier de sortie aura la deuxième vidéo en cours de lecture à 45 ips.
5 . Maintenant, coupez le pré-rouleau factice
ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4
et tu as
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
45 fps, 45 tbr, 11520 tbn (default)
J'ai dit que c'était compliqué!
-r
n'est pas compatible avec la copie de flux, et il n'y a pas de filtres de flux binaire pour modifier la fréquence d'images.