av_seek_frame перерывает avcodec_decode_video2, когда кодек использует p-кадры
-
09-09-2020 - |
Вопрос
Я пытаюсь понять, как искать в видео, закодированные с P-кадрами (например, H.264) - прямо сейчас я только знаю, как искать в видео, кодируемые кодеками, в которых каждый кадр является ключевым кадром (например, MJPEG ).
Учитывая метку времени, в конечном итоге он должен воспроизводить рамку для этого времени времени. Но на данный момент я просто пытаюсь сыграть ключевой кадр возле временной метки. Итак, сначала -
ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0);
avcodec_flush_buffers(pCodecCtx);
.
Тогда какой-то промежуточный код, включая av_read_frame
. Тогда--
ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet);
.
Наблюдения:
- .
-
для некоторых видео, это работает. Для других
avcodec_decode_video2
возвращает ошибку (отрицательное число). Пример рабочего видео: Здесь . Пример нерабочего видео: Здесь . -
для видео MJPEG, это работает.
-
Если я вынуму генеракодицетагкод, чтобы он просто играл через кадры в последовательности, он работает.
Решение
Заменить это---
ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0);
avcodec_flush_buffers(pCodecCtx);
.
с этим---
ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0);
.
(предостережение: документы для avformat_seek_file
говорят: «Это часть нового API ищет API, который все еще находится в стадии разработки. Таким образом, это еще не используйте это. Это может измениться в любое время, не ожидайте совместимости ABI!»)