2015-01-14 2 views
1

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

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

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

ответ

2

Флаг "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 выполняет масштабирование pts и проверяет, имеет ли его время считывание фрейма. Если время правильное, оно считывает кадр else, оно возвращает пустую передачу. поэтому он чувствует, что мы получаем его на родной частоте кадров. если rate_emu не установлен, код переходит непосредственно к «av_read_frame

Смежные вопросы