2010-06-13 11 views
12

Estoy intentando que la función av_seek_frame() vaya a una posición de byte que especifico. Estoy implementando un mecanismo de búsqueda precisa de marcos para mi aplicación, y en la forma en que lo veo, escanearé todo el archivo de video y almacenaré las posiciones de bytes para cada fotograma clave en una estructura. Descubrí dónde obtener la posición de byte actual: AVPacket.pos. Ahora probar esta posición con av_seek_frame así:problema: FFMPEG buscando con av_seek_frame utilizando posiciones de bytes

av_seek_frame(pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE); 

Sin embargo, esto no parece hacer lo correcto, cuando llamo av_read_frame, que apenas comience con el marco 23. Si no busco, que empieza a las marco 1.

+0

¿Es el problema porque está intentando buscar un marco que no es un marco clave? – dmazzoni

+0

Hola Dmazzoni, no, me aseguré de que la posición fuera un Marco clave. Podría agregar que es un video h264. –

Respuesta

9

Para aquellos que estén interesados, encontré la solución. Después de horas de búsqueda en Google y una forma simplista de ingeniería inversa, encontré cómo obtener y establecer la ubicación de bytes del video abierto.

para obtener la posición del archivo: AVFormatContext.pb.pos

por ejemplo:

int64_t byteposition = pFormatCtx->pb->pos; 

para fijar la posición del archivo: url_seek (AVFormatContext.pb, Posición, SEEK_SET);

por ejemplo:

url_seek(pFormatCtx->pb, 27909056, SEEK_SET); 

No se olvide de vaciar los buffers si cambia la ubicación durante la reproducción. Si haces esto antes de hacer av_read_frame por primera vez, no es necesario enjuagarlo.

Saludos cordiales, Nick Verlinden

3

en las versiones recientes de libav, url_seek se ha hecho una función interna. Ahora debería usar la siguiente función:

/** 
* fseek() equivalent for AVIOContext. 
* @return new position or AVERROR. 
*/ 
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); 
Cuestiones relacionadas