Установите флаг re в libavformat

как мы можем установить флаг re в коде С++, который использует библиотеки libavformat и libavcodec. Мне нужно реализовать что-то вроде следующей команды в моем приложении С++

ffmpeg -re -f m4v -i video.264 -vcodec copy out.mp4

Я реализовал и протестировал приведенную выше команду, но без флага re. Мне нужно, чтобы мое приложение считывало кадры с той же скоростью, с которой они кодируются.


person Ahmed_Faraz    schedule 14.01.2015    source источник


Ответы (1)


Флаг "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

person Muhammad Ali    schedule 08.05.2015