2014-09-14 6 views
4

MP4 비디오에서 디코딩 된 프레임을 동기화하려고합니다. FFMPEG 라이브러리를 사용하고 있습니다. 나는 각 프레임을 해독하고 저장했으며 OPENGL 평면에 비디오를 성공적으로 표시했습니다.PTS를 사용하여 FFMPEG 비디오 프레임 동기화

프레임을 순환하기 전에 타이머를 시작했습니다. 비디오를 올바르게 동기화하는 것이 목표입니다. 그런 다음 각 프레임의 PTS를이 타이머와 비교합니다. 디코딩 중에 패킷으로부터 수신 된 PTS를 저장했습니다.

내 애플리케이션에 표시되는 내용이 예상대로 재생되지 않는 것 같습니다. 미디어 플레이어 내에서 원래의 비디오 파일보다 더 빠르게 재생됩니다.

저는 FFMPEG 및 프로그래밍 비디오 전반에 익숙하지 않습니다. 이 잘못된 태클을 다루고 있습니까? 여기

내가, 윈도우, OpenGL을, FFMPEG와 VS2010 IDE

답변

7

첫째로 int64_t pts = av_frame_get_best_effort_timestamp(pFrame) 사용을

  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를 사용하고 있습니다 할 시도하고있는 무슨의 예입니다 pts를 얻으십시오. 둘째로 동기화하려는 두 스트림이 동일한 시간축을 사용해야합니다. 가장 쉬운 방법은 모든 것을 AV_TIME_BASE_Q로 변환하는 것입니다. pts = av_rescale_q (pts, formatCtx->streams[videoStream]->time_base, AV_TIME_BASE_Q);이 형식에서 pts는 나노초 단위입니다.

+1

값은'(AVRational) {1, 100000}''AV_TIME_BASE_Q'이어야합니다. –

+0

고맙습니다!. 업데이트되었습니다. – szatmary

+1

szatmary, AV_TIME_BASE_Q는 마이크로 초 (나노 초가 아님)입니다. @ Kaidul Islam, 당신은 0을 놓치고 있습니다, AV_TIME_BASE_Q의 분모는 백만입니다. – ajs410