Modifier la fréquence d'images dans ffmpeg sans réencodage


14

J'ai une vidéo mkv (h264) à 23,976 ips (24000/1001) mais je veux la convertir en 25 ips sans réencodage ni perte de qualité. Je sais que mkvmerge peut le faire (avec l'option --default-duration '0: 25fps') mais je voudrais le faire directement depuis ffmpeg si possible Selon les documents, cela devrait fonctionner:

ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv

mais quand je l'exécute, je n'obtiens que les mêmes images vidéo. Quelle est la bonne méthode pour le faire (si elle existe) dans ffmpeg?


1
Je pense que ce n'est pas possible avec FFmpeg pour le moment. -rn'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.
Ely

1
dommage. Je devrai utiliser mkvmerge à chaque fois. merci
phate89

1
Il existe un moyen compliqué de le faire avec ffmpeg normal et un moyen direct de le faire avec une ancienne version modifiée de ffmpeg. Si vous êtes intéressé, je vais l'écrire comme réponse.
Gyan

1
Oui merci .. Je voudrais le faire sans outils supplémentaires (j'ai déjà besoin de ffmpeg)
phate89

1
@Mulvya vous parlez de ce droit? J'ai hésité à le lier, mais il est vieux maintenant .. Intéressé par la manière compliquée de le faire avec FFmpeg régulier cependant.
Ely

Réponses:


15

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 0a PTS 0et la trame 30a PTS 15360. Cela deviendrait un flux de 45 fps si nous pouvions changer l'échelle de temps 23040sans 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 xfréquence d' images cible , le PTS de la trame # xdans 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 tbndevrait ê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é!


1
très intelligent, bonne réponse.
Rowe Morehouse
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.