Межкадровый кадр - это кадр, который требует, чтобы декодер считал предыдущий ключевой кадр (внутрикадровый), чтобы иметь возможность построить изображение. Это потому, что межкадровый код, грубо говоря, содержит только разницу между предыдущим ключевым кадром и самим собой.
При быстрой перемотке видео до определенной точки вы можете не попасть в ключевой кадр. На самом деле, вероятность того, что вы попали в кадр, выше, поскольку ключевые кадры вставляются только через каждые N кадров (например, 16). Итак, что игрок делает, когда вы нажимаете на интеркадр, так это то, что он должен сбросить этот кадр - и все последующие - до тех пор, пока он не найдет следующий ключевой кадр. Оттуда он может начать декодирование и покажет вам картинку.
Реализация VP8 в libavcodec (библиотека, которую VLC использует для декодирования видео WebM/VP8), также упоминает это:
// Given that arithmetic probabilities are updated every frame, it's quite
// likely that the values we have on a random interframe are complete junk
// if we didn't start decode on a keyframe. So just don't display anything
// rather than junk.
if (!s->keyframe && (!s->framep[VP56_FRAME_PREVIOUS] ||
!s->framep[VP56_FRAME_GOLDEN] ||
!s->framep[VP56_FRAME_GOLDEN2])) {
av_log(avctx, AV_LOG_WARNING, "Discarding interframe without a prior keyframe!\n");
return AVERROR_INVALIDDATA;
Необходимость ожидания ключевых кадров является основной причиной быстрой перемотки вперед, а затем возобновление воспроизведения может занять некоторое время, если игрок не поддерживает буфер для области за головкой воспроизведения.
Подводя итог: вы не сделали ничего плохого. Вы не можете кодировать видео без ключевых кадров или принудительно удалять ключевые кадры. А поскольку VLC полагается на libavcodec, где вышеприведенное задано жестко, вы не можете изменить это сообщение об ошибке (на самом деле, это просто предупреждение).
Если VLC подвешен для вас из - за того, что может быть ошибка , связанная с этой части кода, но от того, что я прочитал , что должно было исправлено.