av_seek_frame rompe avcodec_decode_video2 cuando el códec usa p-frames
-
09-09-2020 - |
Pregunta
Estoy tratando de entender cómo buscar videos codificados con fotogramas p (p. ej.H.264): en este momento solo sé cómo buscar videos codificados con códecs en los que cada fotograma es un fotograma clave (p. ej.MJPEG).
Dada una marca de tiempo, en última instancia debería reproducir el fotograma de esa marca de tiempo. Pero por ahora, solo intento reproducir el fotograma clave cerca de la marca de tiempo. Entonces, primero--
ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0);
avcodec_flush_buffers(pCodecCtx);
Luego algún código intermedio, incluyendo av_read_frame
.Entonces--
ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet);
Observaciones:
Para algunos videos, esto funciona.Para otros,
avcodec_decode_video2
devuelve un error (número negativo).Ejemplo de vídeo de trabajo: aquí.Ejemplo de un vídeo que no funciona: aquí.Para vídeos MJPEG, esto funciona.
Si saco el
av_seek_frame
, de modo que simplemente reproduzca los fotogramas en secuencia, funciona.
Solución
Reemplace esto--
ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0);
avcodec_flush_buffers(pCodecCtx);
con este--
ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0);
(Advertencia:los documentos para avformat_seek_file
decir:"Esto es parte de la nueva API de búsqueda que aún está en construcción.Por lo tanto, no uses esto todavía.Puede cambiar en cualquier momento, ¡no espere compatibilidad con ABI todavía!")