Данные, сгенерированные FFProbe, похоже, не соответствуют расчетным данным с использованием библиотек ffmpeg - PullRequest
0 голосов
/ 18 января 2020

Использование библиотеки 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...