2015-01-14 2 views
1

libavformat 및 libavcodec 라이브러리를 사용하는 C++ 코드에서 을 다시 플래그로 설정하는 방법은 무엇입니까? 나는 내 C++ 응용 프로그램libavformat에 "re"플래그를 설정하십시오

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

내가 구현 위의 명령을 테스트했지만없는에서 다음 명령 같은 것을 구현하는 플래그 재해야합니다. 인코딩 된 프레임에서 동일한 속도로 프레임을 읽는 응용 프로그램이 필요합니다.

답변

2

"re"플래그는 InputFile-> rate_emu 플래그를 설정합니다. 그 발생은 ffmpeg_opt.c에서 볼 수 있습니다.

InputFile은 "re"플래그가 libavcodec 또는 libavformat에서 사용되지 않음을 나타내는 ffmpeg.h에 대한 로컬 구조체입니다. 당신이 ffmpeg_opt.c

{ "re",    OPT_BOOL | OPT_EXPERT | OPT_OFFSET | 
        OPT_INPUT,         { .off = OFFSET(rate_emu) }, 
    "read input at native frame rate", "" }, 

을 조사하고 "rate_emu"플래그 경우

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); 
} 

으로 보면, 해당 기능을 사용하는 방법으로 당

가 설정되면, get_input_packet은 pts를 재조정하고 프레임을 읽을 시간을 검사합니다. 시간이 맞으면 프레임을 읽은 다음 빈 손으로 반환합니다. 그래서 우리는 본래의 프레임 속도로 그것을 얻고있는 것처럼 느낍니다. rate_emu가 설정되어 있지 않으면 코드는 "av_read_frame