cómo medir la tasa de bits de video a lo largo del tiempo

Dado un archivo de video codificado con una tasa de bits no constante, ¿cómo se analizaría la tasa de bits a lo largo del tiempo? Hasta ahora encontré un programa antiguo que produce un gráfico de tasa de bits, pero ninguno que pueda proporcionar los datos sin procesar de los cuadros codificados.

Creo que los datos de tasa de bits deben generarse promediando el tamaño de un conjunto de cuadros que abarcan 1 segundo, es decir, cuadros con un DTS que pertenece a ese intervalo. Entonces, un video de 10 segundos tendría 10 puntos de datos que describen la tasa de bits de entrada del codificador. Aunque tengo curiosidad por escuchar formas alternativas de calcular la tasa de bits.

¿Hay alguna manera de obtener el tamaño de cada cuadro (codificado)? preferiblemente con software de windows. Sé que es trivialmente fácil para una fuente sin comprimir (resolución * profundidad de bits * tiempo).

El tamaño de un cuadro codificado no tendrá sentido para los cuadros predichos. Proporcionaré una respuesta más tarde en el día, pero la forma básica es segmentar el video y luego ejecutar ffprobe en cada uno de los segmentos y enviar esos datos a un archivo.
Oh, buena idea, debería haberlo pensado. Necesito más café.
Ah, @Mulvya, pero cuando segmenta el video en segmentos por fotograma clave: 1) no debe volver a codificar 2) necesita una fuente con fotogramas clave espaciados (razonablemente) de manera homogénea
El n. ° 1 es obviamente cierto si desea medir la tasa de bits de la fuente. Ver respuesta para #2.

Respuestas (1)

No tiene sentido hablar del tamaño de un cuadro codificado en un flujo de video intercodificado, que es típico de los Xvideos MPEG. Los fotogramas I son autónomos, pero los fotogramas P y B son fotogramas predichos y el resultado final decodificado utiliza datos de varias entradas. Por otro lado, el tamaño de un solo Grupo de Imágenes (GOP) puede ser una medida significativa.

El segmentador FFmpeg en combinación con un demuxer compatible puede dividir el flujo de video en los límites del GOP. Al especificar un tiempo ultrabajo para el tamaño del segmento, puede asegurarse de que cada segmento contenga 1 GOP. Ejecutar un ffprobe en cada segmento proporcionará la tasa de bits para ese GOP.

Probé el siguiente comando en MP4 que tenían 1) un GOP de tamaño variable, 2) un esquema intracodificado y 3) un GOP fijo de longitud inusual (11 cuadros), y cada salida tuvo el resultado esperado.

ffmpeg -i input.mp4 -an -c:v copy -segment_time 0.00001 -f segment i%0d.mp4

Cada segmento contenía exactamente 1 cuadro I (cada segmento de la entrada intra contenía exactamente 1 cuadro en total).

Ejecutar ffprobe en cada segmento da una lectura de tasa de bits:

Duration: 00:00:00.37, start: 4.466016, bitrate: 1539 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1280x720 [SAR 1:1 DAR 16:9], 1520 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)

El anterior es del GOP de 11 fotogramas y tiene una tasa de bits de 1520 kbps.

por lo tanto, si tiene 1 fuente con GOP de 1 a 2 segundos y otros GOP de alrededor de 250 milisegundos, su gráfico resultante tendría puntos de datos erráticos en la línea de tiempo. ¿Cuál sería una buena solución para ese caso? Supongo que agruparía los GOP en contenedores más grandes, es decir, promediaría entre 3 y 5 GOP.
Simplemente trace la tasa de datos (Y) frente a la hora de inicio (X) en lugar de la duración. La Y permanece sin cambios desde su inicio hasta la hora de inicio del siguiente segmento. Si desea deshacerse de la apariencia de la función de paso, habrá alguna función de suavizado/interpolación en su trazado s/w.