2012-01-26 16 views
6

Estoy usando ffmpeg para decodificar un archivo de video en C. Estoy luchando para obtener el recuento del fotograma actual que estoy decodificando o la fecha y hora del fotograma. He leído numerosas publicaciones que muestran cómo calcular un marco estimado no basado en los fps y la marca de tiempo del marco, sin embargo, no puedo obtener ninguno de esos.ffmpeg c/C++ get frame count or timestamp and fps

Lo que necesito: fps de archivo de vídeo, marca de tiempo de la trama actual o el marco no (no calculado)

Lo que tengo: Soy capaz de obtener el tiempo del video usando

pFormatCtx->duration/AV_TIME_BASE 

Estoy contando los marcos actualmente mientras los proceso, y obteniendo un conteo actual de cuadros, esto no va a funcionar a largo plazo. Puedo obtener el recuento total de marco para el archivo con

pFormatCtx->streams[currentStream->videoStream]->nb_frames 

He leído esto puede no funcionar para todos los flujos, aunque se ha trabajado para cada flujo de He tratado.

He intentado utilizar los valores time_base.num y time_base.den y packet.pts, pero no puedo entender los valores que obtengo de ellos, así que tal vez deba comprender mejor qué los valores son

¿Alguien sabe de los recursos que muestran ejemplos sobre cómo obtener estos valores?

Respuesta

4

Esta URL se explica por qué los valores pts pueden no tener sentido y cómo llegar a las prudentes: An ffmpeg and SDL Tutorial by Dranger

Aquí es un experto de ese enlace, que da orientación sobre exactamente lo que está buscando en términos de trama números y marcas de tiempo. Si esto parece útil para usted a continuación, es posible que desee leer más del documento para una comprensión más completa:

Así que vamos a decir que tuvimos una película, y los marcos se mostraban como: IBB P. Ahora, necesitamos para saber la información en P antes de que podamos mostrar cualquiera de los cuadros B. Debido a esto, los marcos pueden almacenarse así: I P B B. Es por eso que tenemos una marca de tiempo de decodificación y una marca de tiempo de presentación en cada cuadro. La marca de tiempo de decodificación nos dice cuando necesitamos para decodificar algo, y la marca de tiempo de la presentación nos dice cuando necesitamos mostrar algo. Por lo tanto, en este caso, nuestra corriente puede tener un aspecto como este :

PTS: 1 4 2 3 
DTS: 1 2 3 4 
Stream: I P B B 

En general, el PTS y el DTS sólo difieren cuando la corriente que son de juego tiene marcos B en ella.

Cuando obtenemos un paquete de av_read_frame(), contendrá los valores PTS y DTS para la información dentro de ese paquete . Pero lo que realmente queremos es el PTS de nuestro marco recién decodificado , por lo que sabemos cuándo mostrarlo.

Afortunadamente, FFMpeg nos provee de una marca de tiempo "mejor esfuerzo", que se puede obtener a través de, av_frame_get_best_effort_timestamp()

+0

Esta respuesta se ha marcado para la eliminación, ya que es una respuesta de vínculos solamente.¿Podría ampliar esta respuesta para que brinde una respuesta a la pregunta sin que el lector haga clic en la página web vinculada? – josliber

+0

Trataré de cumplir con este requisito para proporcionar más que un enlace, pero debo señalar dos cosas: Primero, la pregunta "Recursos que muestran ejemplos sobre cómo obtener estos valores", por lo que parece pedir Alink en lugar de algo más largo; (2) hace tres años, aparentemente la respuesta fue lo que necesitó el interrogador ya que fue la respuesta (fue la ÚNICA respuesta. Por lo tanto, presumiblemente ha estado ayudando al interrogador original y posiblemente a otro visitante durante tres años. – Beel

+0

@Beel o no, ha estado ayudando durante mucho tiempo, la [política de respuesta] de Stack Overflow (https://stackoverflow.com/help/how-to-answer) dice que las respuestas que brindan solo un enlace no son respuestas completas; el formato y dejó solo el texto, todavía deberían responder la pregunta. –