h.264 - h264 - h265
¿Qué significa este encabezado NAL H264? (4)
0x000001 es el código de prefijo de inicio NAL (también puede ser 0x00000001, depende de la implementación del codificador). 0x09 es 0b00001001, que significa F = 0, NRI = 0, y el tipo es 0b01001. Ese tipo particular es un delimitador de la unidad de acceso. Observe que es seguida inmediatamente por otra unidad NAL definida por 0x67, que es un tipo NAL de 7, que es el conjunto de parámetros de secuencia.
También está el conjunto de parámetros de imagen:
00 0001 68 ...
... y el inicio de un fotograma clave:
0000 0001 65 ...
0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a
Que yo sepa, 0000 01 es el código de prefijo de inicio para identificar una unidad NAL. ¿Qué significa "09 ...."? ¿Es el byte tipo de encabezado?
Eso define el tipo de paquete. El formato es:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
¿Estás seguro de que este es un encabezado NAL h.264? De lo que proporcionó, este no parece ser el encabezado con el contexto que proporcionó.
La referencia clave para averiguar qué tipo de NAL está viendo es http://www.itu.int/rec/T-REC-H.264-201304-S . Específicamente, la tabla en la página 63 (a partir de enero de 2014) enumera todos los tipos de NAL válidos.
Para averiguar lo que está mirando, mire los primeros 4 bytes. Si el NAL está en el encuadre "Anexo B", serán 00 00 01 o 00 00 00 01 . Esta secuencia está prohibida / suprimida dentro del flujo de bits H.264, por lo que si lo ve, está seguro de que está viendo el inicio de un NAL. El tipo NAL son los 5 bits de orden inferior después del 1. En el código:
int nalType = p[2] == 1 ? (p[3] & 0x1f) : (p[4] & 0x1f);
También en la jerga H.264, IDR significa fotograma I y no IDR significa fotogramas P o B.
Con la información anterior podemos ver el flujo anterior y ver un delimitador de la unidad de acceso, seguido de un SPS, PPS y el primer I-Frame.
0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a
-> 000001| 09 (AUD)| 10 | 000001 | 67(SPS) | xxxx (SPS data)
xx | 000001 | 68 (PPS)| xxxx (PPS data)
AUD, SPS, PPS es un tipo de NALU (Unidades de Capa de Abstracción de Red). NALU tiene alrededor de 31 tipos.
09 AUD significa delimitador de la unidad de acceso.
Acceso al Delimitador de la Unidad (AUD). Un AUD es un NALU opcional que se puede usar para delimitar fotogramas en un flujo elemental. No es obligatorio (a menos que el contenedor / protocolo indique lo contrario, como TS), ya menudo no se incluye para ahorrar espacio, pero puede ser útil para encontrar el inicio de un cuadro sin tener que analizar completamente cada NALU.
Compruebe esta answer para más información.
También tengo una question sobre cómo descodificar el flujo h264 (en iOS).