Синхронизация видеокадров 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 находится в наносекундах.

Другие вопросы по тегам