Pour ce faire, il modifie l'échelle des valeurs d'horodatage de la base de temps d'entrée (c'est-à-dire les FPS sous forme de fraction, par exemple 24fps deviendraient 1/24) à la base de temps de sortie.
D'abord le la base de temps est définie en fonction du nombre d'images par seconde demandé :
link->time_base = av_inv_q(s->framerate);
Lors du filtrage, le nombre d'images de sortie est calculé sur la base du nombre d'images d'entrée dans la mémoire tampon, en mettant à l'échelle ce nombre entre les deux bases de temps, donc en gros cadres × entrée / sortie . Notez que buf->pts - s->first_pts
Il s'agit apparemment d'un nombre d'images, et non d'une différence réelle dans le temps PTS.
/* number of output frames */
delta = av_rescale_q_rnd(buf->pts - s->first_pts, inlink->time_base,
outlink->time_base, s->rounding) - s->frames_out ;
Ainsi, par exemple, si la base de temps d'entrée est de 0.042 (24 fps), la sortie de 0.33 (3 fps), et que vous avez 12 images d'entrée dans le tampon, vous obtiendrez 12 × 0.042 / 0.33 trames, qui est arrondi à l'entier le plus proche 2 - donc deux trames doivent être générées. Si vous avez 24 images, vous obtenez, bien sûr, trois images. Pour 35 trames dans le tampon d'entrée, vous obtenez quatre trames en sortie.
Si ce delta est inférieur à 1, les trames de la mémoire tampon peuvent être abandonnées car aucune trame n'est nécessaire dans cette plage de temps. Si, au contraire, le delta est supérieur à 1, il s'agit du nombre de trames qui doivent être sorties pour le tampon d'entrée.
Pour les nouvelles trames, la valeur PTS est mise à l'échelle en fonction des bases de temps d'entrée et de sortie :
buf_out->pts = av_rescale_q(s->first_pts, inlink->time_base,
outlink->time_base) + s->frames_out;
En pratique, cela signifie que vous devrez regarder le PTS de votre vidéo d'entrée, calculer le nombre d'images par seconde que votre sortie peut avoir, puis les répartir équitablement en supprimant des images si nécessaire. Si vous voulez être très précis, je vous recommande de déboguer le code source avec quelques vidéos de test que vous avez.
J'ai bien peur de ne pas pouvoir trouver de solution plus pratique que la réponse que j'ai posté ici récemment dans lequel j'explique comment montrer le PTS de chaque image dans une vidéo dont le framerate a été modifié :
ffmpeg -i input.mp4 -t 10 -filter:v "fps=fps=25, showinfo" -f null - 2>&1 grep pts_time | awk '{print $6}' | cut -d: -f2
Ces horodatages appartiennent à chaque trame de sortie, et à son heure d'entrée PTS correspondante.