2

У меня есть видео webm, которые выдают ошибку:

Discarding interframe without a prior keyframe!

Когда играл в VLC. Как я могу перекодировать / исправить файлы в Linux, чтобы решить эту ошибку.

Есть ли способ проверить эту проблему в видео, не проигрывая его?

1 ответ1

3

Межкадровый кадр - это кадр, который требует, чтобы декодер считал предыдущий ключевой кадр (внутрикадровый), чтобы иметь возможность построить изображение. Это потому, что межкадровый код, грубо говоря, содержит только разницу между предыдущим ключевым кадром и самим собой.

При быстрой перемотке видео до определенной точки вы можете не попасть в ключевой кадр. На самом деле, вероятность того, что вы попали в кадр, выше, поскольку ключевые кадры вставляются только через каждые 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 подвешен для вас из - за того, что может быть ошибка , связанная с этой части кода, но от того, что я прочитал , что должно было исправлено.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .