reproductor reproducir portable online h264 convertir c ffmpeg h.264 duration video-codecs

reproducir - reproductor h264 vlc



¿Cómo puedo saber la duración de cualquier archivo h264? (3)

Tengo un archivo en el que solo hay marcos h264 en forma de unidad NAL. Entonces, ¿hay algún método para que pueda contar la duración de ese archivo?

No sé cuántos marcos hay en el archivo. Solo tengo el tamaño de archivo.

PD: Todo lo que quiero hacer es en lenguaje C y en la plataforma Linux.


La forma sucia de obtener la duración, que muchos, muchos desarrolladores utilizan, es ejecutar ffmpeg para obtener la información del archivo y analizar qué imprime ffmpeg en stdout. Sé que no es ideal, pero funciona.

Si ejecuta ffmpeg -i Sintel.2010.1080p.mkv (puede descargar Sintel desde aquí ), una de las líneas de salida es Duration: 00:14:48.03, start: 0.000000, bitrate: 640 kb/s . Puede analizar la línea y extraer la duración.

Es posible que pueda obtener la misma información llamando directamente a alguna función C desde ffmpeg, pero eso está fuera de mi conocimiento.


Tu pregunta no tiene sentido, por eso alguien te votará.

Archivo contenedor

Primero, no existe el H264 file . Puede haber un archivo contenedor (MP4, AVI, MKV) que contenga el video codificado H264. Ese formato de contenedor generalmente también contiene los datos que le dicen la duración del video contenido. Por lo tanto, debe analizar ese archivo, consultar la documentación de formato para ver dónde se guarda la duración y luego extraerlo.

La manera más fácil es usar FFMPEG como sugirió Augusto.

NAL Byte Stream

Si su archivo es solo unidades NAL guardadas una tras otra, como en una secuencia de bytes NAL, ¡ NO HAY FORMA de que pueda obtener la duración del video! Como la imagen codificada H264 no contiene información de temporización.

Si ese es el caso, aún puede hacer una aproximación si conoce el video FPS ... Necesita contar todos los marcos en el archivo, excluyendo:

  • Conjuntos de parámetros de secuencia
  • Conjuntos de parámetros de imagen
  • El final del flujo
  • Fin de la secuencia
  • Filtrar datos
  • Delimitador de la unidad de acceso

Y luego haga los cálculos: NUMBER_OF_FRAMES / FPS = DURATION_IN_SECONDS

RTP Stream

Si está equivocado y hay un encabezado RTP encima de cada unidad NAL, puede obtener fácilmente la duración del video al verificar el tiempo RTP de cada encabezado RTP. Lo que significan los bytes en el encabezado RTP, puede encontrarlo aquí: http://www.networksorcery.com/enp/protocol/rtp.htm . Desea obtener la parte TIMESTAMP (entero de 4 bytes) de cada uno. El código debería hacer esto:

int last_timestamp = GetNextTimestamp(); double duration_in_ms = 0; while(true) { int next = GetNextTimestamp(); duration_in_ms += (next - last_timestamp)/90000.0; last_timestamp = next; }


h.264 contiene información de temporización.

Los datos anexos h.264 sin procesar de alguna forma (memoria o archivo) contendrán algunos "Conjuntos de parámetros de secuencia" o marcos SPS. Normalmente, estos contendrán información de tiempo, específicamente "time_scale" y "num_units_in_tick". En la mayoría de los escenarios, la velocidad de fotogramas es fija, especificada por "fixed_frame_rate_flag" en el SPS. La duración de cada cuadro será de 2 * num_units_in_tick / time_scale (2 == 1 + nuit_field_based_flag). Los marcos suelen estar separados por un "delimitador de la unidad de acceso".

El número de cuadros por la duración del cuadro te dará la duración total.