Синхронизация видеокадров FFMPEG с использованием PTS
Я пытаюсь синхронизировать кадры, декодированные из видео MP4. Я использую библиотеки FFMPEG. Я декодировал и сохранял каждый кадр и успешно отображал видео в плоскости OPENGL.
Я запустил таймер как раз перед циклом просмотра кадров; цель состоит в том, чтобы правильно синхронизировать видео. Затем я сравниваю 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 и IDE VS2010
1 ответ
Во-первых, используйте 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 находится в наносекундах.