Diccionario

Qué son los b frames en video

Un fotograma B es un fotograma de video que puede usar tanto un fotograma anterior como uno posterior. Aprende cómo funcionan los B-frames y qué significa el valor Has B Frames en tu archivo.

b-frames

Un B-frame es un fotograma de video que puede usar tanto un fotograma anterior como uno posterior para construir su imagen. La B significa bidireccional. Los B-frames ofrecen más compresión que los otros tipos de fotogramas, lo que ayuda a mantener el video pequeño.

En los metadatos de un archivo de video, puedes ver un campo llamado Has B Frames, también escrito has_b_frames. El nombre sugiere una respuesta de sí o no, pero el valor es un número. El número indica cuántos fotogramas debe poder mantener un decodificador en memoria para mostrar el video en el orden correcto.

Cómo se diferencian los B-frames de los I-frames y P-frames

La compresión de video generalmente funciona comparando fotogramas y registrando las diferencias entre ellos. El video MPEG-2 define estos 3 tipos de fotograma:

  • I-frame: codificado sin referencia a otros fotogramas, así que la decodificación puede comenzar aquí
  • P-frame: puede usar el I-frame o P-frame anterior
  • B-frame: puede usar el I-frame o P-frame anterior y el siguiente

Un B-frame puede depender de un fotograma que aparece más tarde en el tiempo, por lo que ese fotograma posterior debe almacenarse primero. El orden de almacenamiento, por tanto, difiere del orden que ves en la pantalla. Una secuencia típica MPEG-2 se ve así:

  • Orden de visualización: B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12
  • Orden de almacenamiento: I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11

Cómo son los valores

Has B Frames es un número entero. FFmpeg describe el valor como el tamaño del búfer de reordenación de fotogramas en el decodificador. Para video MPEG-2, FFmpeg indica 2 valores:

  • 0: video de baja latencia solo con I-frames y P-frames
  • 1: video con I-frames, P-frames y B-frames

Los codificadores H.264 y HEVC también pueden mantener algunos B-frames como referencia para otros fotogramas. Los archivos de prueba de FFmpeg para H.264 muestran cómo esto cambia el valor. Los nombres de archivo indican la configuración del codificador:

  • Como máximo 3 B-frames seguidos, ninguno usado como referencia: 1
  • Como máximo 3 B-frames seguidos, algunos usados como referencia: 2
  • Como máximo 4 B-frames seguidos, algunos usados como referencia: 2

Así que el valor no es un recuento de B-frames. El programa ffprobe muestra el tipo de cada fotograma como un valor pict_type: I, P o B. El campo NB Frames indica el número de fotogramas, pero no sus tipos.

De dónde proviene el valor

El nombre del campo viene de FFmpeg, cuyo programa ffprobe imprime has_b_frames para flujos de video. Un flujo H.264 puede indicar el número en su propio encabezado. Si el encabezado no indica el número, FFmpeg lo calcula a partir de los fotogramas y sus tiempos.

La configuración del codificador decide si un video usa B-frames. En FFmpeg y en el codificador Microsoft H.264, un ajuste de 0 desactiva los B-frames.

Qué archivos lo llevan

El campo existe solo para flujos de video. Puedes ver el campo para video en archivos MP4, MOV, MKV, WebM y AVI. Un archivo MOV con fotogramas reordenados también almacena una tabla con el tiempo entre la decodificación y la visualización de cada fotograma.

El códec decide si los B-frames son posibles. El video MPEG-2 y el perfil Main de H.264 pueden usarlos, pero el perfil Baseline de H.264 no. VP8, un códec usado en archivos WebM, no tiene B-frames, porque sus fotogramas nunca se predicen a partir de fotogramas posteriores.

Por qué es importante

Los B-frames ayudan a mantener un video pequeño, pero añaden latencia. El codificador debe reordenar los fotogramas antes de almacenarlos, y esta latencia depende del número de B-frames seguidos.

El video reordenado también tiene 2 tiempos distintos para cada fotograma: cuándo decodificar el fotograma y cuándo mostrarlo. FFmpeg ofrece ambos como marcas de tiempo en la base de tiempo del flujo.