2014-09-14 2 views
4

Я пытаюсь синхронизировать кадры, декодированные с видео MP4. Я использую библиотеки FFMPEG. Я расшифровал и сохранил каждый кадр и успешно отобразил видео по плоскости OPENGL.Синхронизация видеокадров FFMPEG с использованием PTS

Я начал таймер перед тем, как ездить на велосипеде по кадрам; чтобы синхронизировать видео правильно. Затем я сравниваю PTS каждого кадра с этим таймером. Я сохранил PTS, полученный из пакета во время декодирования.

То, что отображается в моем приложении, похоже, не соответствует ожидаемому курсу. Он воспроизводится быстрее, чем исходный видеофайл в медиаплеере.

Я неопытный с FFMPEG и программным видео в целом. Я рассматриваю это неправильно?

Вот пример того, что я пытаюсь сделать

  FrameObject frameObject = frameQueue.front(); 

      AVFrame frame = *frameObject.pFrame; 

      videoClock += dt; 

      if(videoClock >= globalPTS) 
      { 
       //Draw the Frame to a texture 
       DrawFrame(&frame, frameObject.m_pts); 

       frameQueue.pop_front(); 

       globalPTS = frameObject.m_pts; 
      } 

Пожалуйста, обратите внимание, я использую C++, Windows, OpenGL, FFmpeg и VS2010 IDE

ответ

7

Во-первых, используйте int64_t pts = av_frame_get_best_effort_timestamp(pFrame) для получить оч. Во-вторых, вы должны убедиться, что обе потоки, которые вы синхронизируете, используют одну и ту же базу времени. Самый простой способ сделать это - преобразовать все в AV_TIME_BASE_Q. pts = av_rescale_q (pts, formatCtx->streams[videoStream]->time_base, AV_TIME_BASE_Q); В этом формате pts находится в наносекундах.

+1

Должно быть 'AV_TIME_BASE_Q', какое значение является' (AVRational) {1, 100000} ' –

+0

Спасибо !. обновлено. – szatmary

+1

szatmary, AV_TIME_BASE_Q находится в микросекундах, а не в наносекундах. @ Кайдул Ислам, вам не хватает нуля, знаменатель для AV_TIME_BASE_Q составляет один миллион. – ajs410

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