Использование библиотеки ffmpeg avformat Я пытаюсь проверить, соответствуют ли данные, сгенерированные ffprobe, данным, сгенерированным библиотекой. Цель кода - попытаться найти ближайший ключевой кадр. При попытке поиска с частотой 100 кадров или менее коды всегда возвращают 0. При попытке поиска на 200 кадрах коды возвращают 4 все время. Но результат ie 4-й кадр не кажется правильным. Где я не прав? Является ли мое преобразование time_base в фактический кадр ошибочным?
Результат теста с использованием ffprobe
Filename = test.mp4
Duration = 00:00:10.56
Fps = 25
Total frames = 256
The key frames pkt_pts_time are at 2.120000 and 0.000000 (using -skip_frame nokey )
Corresponding pkt_duration_time: 0.040000 and 0.040000 ( same, why?)
Резюме кода:
// Objective: seek to the nearest key frame
frameIndex = 200;
int64_t timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE) / int64_t(pCodecCtx->time_base.den);
int64_t seekTarget = int64_t(frameIndex) * timeBase;
if (av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD) < 0) return -1;
//convert the time_base to actual frame
auto time2frame = [&](int64_t tb) {
return tb * int64_t(pCodecCtx->time_base.den) / (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE);
};
AVPacket avPacket;
int result = av_read_frame(pFormatCtx, &avPacket);
if (result == 0) {
auto dts = avPacket.dts;
auto pts = avPacket.pts;
auto idx = avPacket.stream_index;
auto f = time2frame(pts); // expecting the actual frame here
std::cout << dts << pts << idx << f;
}