Как эффективно найти и декодировать N-й кадр с помощью libavcodec?

Пожалуйста, это не дубликат похожих постов!

Я хочу найти и декодировать N-й кадр, например, 7-й кадр.

Как я понял, используя time_base Я могу посчитать, сколько тиков в каждом кадре, умножив его на 7, мы получим позицию 7-го кадра. Для подсчета тиков я делаю

AVStream inStream = getStreamFromAVFormatContext();

int fps = inStream->r_frame_rate.num;
AVRational timeBase = inStream->time_base;

int ticks_per_frame = (1/fps) / timeBase;
int _7thFramePos = ticks_per_frame * 7;
  1. Правильно ли я рассчитал положение 7-го кадра? Если я это сделал, то чтобы перейти к этому кадру, я просто делаю av_seek_frame(pFormatCtx, -1, _7thFramePos, AVSEEK_FLAG_ANY), право?
    Что произойдет, если 7-й кадр был P-Frame или B-Frame, как мне его декодировать?
  2. Я заметил, что расчетное значение отличается от inStream->codec->ticks_per_frame, Зачем? Разве они не должны быть одинаковыми? В чем разница?

1

Решение

Этот пост хорошо объясняет проблему.
http://www.hackerfactor.com/blog/index.php?/archives/307-Picture-Go-Back.html

[1] Комментарий для структуры AVStream ясно упоминает, что «r_frame_rate» является предположением и может быть неточным, потому что даже если у меня есть частота кадров (скажем) 25 кадров в секунду, в терминах base_time у меня может быть 24 или 26 кадров в секунду ,

[2] Чтобы найти точный номер кадра, вам нужно декодировать кадр с самого начала и вести счетчик, но это очень неэффективно, его можно оптимизировать для некоторых форматов файлов, таких как MP4, где информация о каждом кадре присутствует в файле. -header.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]