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.

¿Fue útil?

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!")

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top