Как искать ближайший ключевой кадр в файле .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);
}
, но я все еще читаю бессмысленные данные в моем декодированном пакеты.