Как указать дробную частоту кадров с помощью ffmpeg C/C++ при объединении изображений?

Я хочу указать дробную частоту кадров, например 23.797 или 59.94, при создании кодировщика. Вот как я это делаю сейчас:

AVStream* st;
...
st->time_base = (AVRational){1, STREAM_FRAME_RATE };

Но глядя на исходный код ffmpeg в rational.h, мы видим, что AVRational struct принимает целые числа вместо чисел с плавающей запятой. Итак, мой 23.797 превращается в 23, что означает неправильное кодирование. Как я могу указать fps с плавающими числами?

Пожалуйста, смотрите av_d2q.

G.M. 14.09.2022 14:49

Сделайте простое преобразование. то есть можете ли вы просто масштабировать все свои значения с плавающей запятой, умножив их на 1000, 10 000 или что-то еще, чтобы сохранить необходимую точность, представленную значением int? 23.797 станет 23797

ryyker 14.09.2022 15:01

@ryyker это будет то же самое, что дать 23797? Так что все, что мне нужно сделать, это сказать st->time_base = (AVRational){1, 23797}; вместо того, что я делал до сих пор, а именно: st->time_base = (AVRational){1, 23.797 };

Turgut 14.09.2022 15:05

@G.M. Я думаю, это решит это. Есть параметр под названием max, но что я должен передать? Мне не нужно максимальное значение, я не знаю, какой ввод будет передан пользователем. И не могли бы вы ответить на это поверх вашего комментария в качестве ответа, чтобы я мог его принять?

Turgut 14.09.2022 15:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно комментарию, вы можете использовать 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

Другие вопросы по теме