Синхронизация декодированного видео с использованием Ffmpeg - PullRequest
2 голосов
/ 18 июля 2011

Я использую Ffmpeg для декодирования и воспроизведения видеофайлов. В настоящее время у меня воспроизводится видео и звук воспроизводится с такой скоростью, с какой процессор может их декодировать и отображать. Проблема в том, что я хочу воспроизводить видео и аудио синхронно, используя системные часы.

Я искал какую-то помощь, но не могу найти ничего существенного, кроме учебника Дрангера 05 , но я не совсем понимаю, что он делает, потому что моя программа не написана в том же духе. кстати как его.

Я использую файлы mjpeg и, таким образом, очки, кажется, извлекаются каждый раз, когда кадр декодируется, я умножил очки на time_base, как дранджер делает, чтобы получить значение в секундах, но разрешение, кажется, составляет только секунды и поэтому я получаю значение «6» 25 раз, а затем «7» 25 раз, так как видео работает с частотой 25 кадров в секунду.

Разве нет более точного значения? Или способ получить более точное значение, и если да, то как мне выполнить синхронизацию с этим значением? Я использую SDL для отображения значения, поэтому я могу просто использовать SDL_Delay () полученного значения?

Спасибо за ваше время,

Infinitifizz

1 Ответ

2 голосов
/ 17 марта 2012

Чтобы преобразовать pts или dts в секунды с плавающей запятой, используйте av_q2d () для правильной временной базы:

// You got the context from open_input:
AVFormatContext *pFormatCtx;
avformat_open_input(&pFormatCtx, inputfilename, NULL, &format_opts);

// Get a stream from the context
AVStream pStream= pFormatCtx->streams[i];

// Convert packet time (here, dts) to seconds with:  
double seconds= (dts - pStream->start_time) * av_q2d(pStream->time_base);

// Or convert frame number to seconds with the codec context
AVCodecContext *pCodecCtx= pStream->pVideoStream->codec;
double seconds= framenumber * av_q2d(pCodecCtx->time_base);

Возвращает время начала видео в секундах.

...