Поиск ближайшего ключевого кадра в libav / ffmpeg - PullRequest
0 голосов
/ 03 марта 2020

Как искать ближайший ключевой кадр в файле .mp4 с libavcode c в C? Я хочу найти ближайший ключевой кадр и затем прочитать данные кадра с помощью av_read_frame(fmt_ctx, &pkt, но я не уверен, использовать ли av_seek_frame() или avformat_seek_file.

РЕДАКТИРОВАТЬ: я должен добавить свою текущую реализацию:

int flag = AVSEEK_FLAG_ANY;
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
    if (pkt.stream_index == video_stream_idx)
        ret = decode_packet(&pkt);
    int64_t bytepos = pkt.pts; 
    av_packet_unref(&pkt);
    if (ret < 0)
        break;
    avformat_seek_file(fmt_ctx, video_stream_idx, bytepos, bytepos, bytepos, flag);
}

Без вызова avformat_seek_file() он отлично читает каждый кадр. Однако добавление вызова функции делает его l oop навсегда с пустыми пакетными данными. Я подозреваю, что он возвращается в начало видеопотока каждый раз.

EDIT2: я изменил на следующее:

int flags = AVSEEK_FLAG_BACKWARD;
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
        if (pkt.stream_index == video_stream_idx)
            ret = decode_packet(&pkt);
        int64_t bytepos = pkt.dts + 1001*30; // increase by 30 frames
        av_packet_unref(&pkt);
        if (ret < 0)
            break;
        av_seek_frame(fmt_ctx, video_stream_idx, bytepos, flag);
    }

, но я все еще читаю бессмысленные данные в моем декодированном пакеты.

...