av_seek_frame перерывает avcodec_decode_video2, когда кодек использует p-кадры

StackOverflow https://stackoverflow.com/questions/6084921

  •  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!»)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top