Я хочу указать дробную частоту кадров, например 23.797
или 59.94
, при создании кодировщика. Вот как я это делаю сейчас:
AVStream* st;
...
st->time_base = (AVRational){1, STREAM_FRAME_RATE };
Но глядя на исходный код ffmpeg в rational.h
, мы видим, что AVRational
struct принимает целые числа вместо чисел с плавающей запятой. Итак, мой 23.797
превращается в 23, что означает неправильное кодирование. Как я могу указать fps с плавающими числами?
Сделайте простое преобразование. то есть можете ли вы просто масштабировать все свои значения с плавающей запятой, умножив их на 1000, 10 000 или что-то еще, чтобы сохранить необходимую точность, представленную значением int
? 23.797
станет 23797
@ryyker это будет то же самое, что дать 23797? Так что все, что мне нужно сделать, это сказать st->time_base = (AVRational){1, 23797};
вместо того, что я делал до сих пор, а именно: st->time_base = (AVRational){1, 23.797 };
@G.M. Я думаю, это решит это. Есть параметр под названием max
, но что я должен передать? Мне не нужно максимальное значение, я не знаю, какой ввод будет передан пользователем. И не могли бы вы ответить на это поверх вашего комментария в качестве ответа, чтобы я мог его принять?
Согласно комментарию, вы можете использовать av_d2q из библиотеки libavutil
. В качестве основного примера...
#include <iostream>
#include <limits>
extern "C" {
#include <libavutil/avutil.h>
}
int main ()
{
auto fps = 23.797;
auto r = av_d2q(1 / fps, std::numeric_limits<int>::max());
std::cout << "time base is " << r.num << "/" << r.den << " seconds\n";
}
Вышеприведенное дает мне следующий вывод...
time base is 1000/23797 seconds
Пожалуйста, смотрите av_d2q.