av_seek_frame прерывает avcodec_decode_video2, когда кодек использует p-кадры - PullRequest
2 голосов
/ 22 мая 2011

Я пытаюсь понять, как искать в видео, закодированных с помощью 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 это работает.

  • Если я достану av_seek_frame, чтобы он просто последовательно воспроизводил кадры, он работает.

1 Ответ

1 голос
/ 22 мая 2011

Заменить это--

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 поиска, который все еще находится в стадии разработки. Таким образом, пока не используйте его. Он может измениться в любое время, пока не ожидайте совместимости с ABI!» «)

...