как мы можем установить ре флаг в коде c ++, который использует библиотеки libavformat и libavcodec.
Мне нужно реализовать что-то вроде следующей команды в моем приложении C ++
ffmpeg -re -f m4v -i video.264 -vcodec copy out.mp4
я реализовал и протестировал вышеупомянутую команду, но без ре флаг. Мне нужно, чтобы мое приложение считывало кадры с той же скоростью, с которой они кодируются.
Флаг ‘re’ устанавливает флаг InputFile-> rate_emu. Его появление можно увидеть в ffmpeg_opt.c.
InputFile является локальной структурой для ffmpeg.h, которая указывает, что флаг re не используется ни в libavcodec, ни в libavformat.
Согласно тому, как использовать эту функциональность, если вы посмотрите в ffmpeg_opt.c
{ "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
OPT_INPUT, { .off = OFFSET(rate_emu) },
"read input at native frame rate", "" },
а затем посмотреть в
ffmpeg.c
static int get_input_packet(InputFile *f, AVPacket *pkt)
{
if (f->rate_emu) {
int i;
for (i = 0; i < f->nb_streams; i++) {
InputStream *ist = input_streams[f->ist_index + i];
int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
int64_t now = av_gettime_relative() - ist->start;
if (pts > now)
return AVERROR(EAGAIN);
}
}
#if HAVE_PTHREADS
if (nb_input_files > 1)
return get_input_packet_mt(f, pkt);
#endif
return av_read_frame(f->ctx, pkt);
}
Если установлен флаг «rate_emu», get_input_packet изменяет размер точек и проверяет, пора ли прочитать кадр. Если время подходящее, он читает кадр, он возвращает с пустыми руками. таким образом, мы чувствуем, что мы получаем его с исходной частотой кадров. если значение rate_emu не установлено, код сразу переходит к «av_read_frame»