web-dev-qa-db-fra.com

Que signifie cet en-tête NAL H264?

0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a

Pour autant que je sache, 00 01 est le code de préfixe de démarrage pour identifier une unité NAL. Que signifie "09 ...."? Est-ce l'octet du type d'en-tête?

24
ablmf

0x000001 est le code de préfixe de démarrage NAL (il peut également être 0x00000001, dépend de la mise en œuvre de l'encodeur). 0x09 est 0b00001001, ce qui signifie F = 0, NRI = 0 et le type est 0b01001. Ce type particulier est un délimiteur d'unité d'accès. Notez qu'il est immédiatement suivi par une autre unité NAL définie par 0x67, qui est un type NAL de 7, qui est l'ensemble de paramètres de séquence.

Il y a aussi le jeu de paramètres d'image:

00 0001 68 ...

... et le début d'une image clé:

0000 0001 65 ...

36
kidjan

La référence clé pour déterminer le type de NAL que vous consultez est http://www.itu.int/rec/T-REC-H.264-201304-S . Plus précisément, le tableau de la page 63 (en date de janvier 2014) répertorie tous les types NAL valides.

Pour comprendre ce que vous recherchez, regardez les 4 premiers octets. Si le NAL est dans le cadrage "Annexe B", il sera soit 00 00 01 ou 00 00 00 01 . Cette séquence est interdite/supprimée dans le flux binaire H.264, donc si vous la voyez, vous savez avec certitude que vous regardez le début d'un NAL. Le type NAL correspond aux 5 bits de poids faible après le 1. Dans le code:

int nalType = p[2] == 1 ? (p[3] & 0x1f) : (p[4] & 0x1f);

Également dans le jargon H.264, IDR signifie trame I et non-IDR signifie trames P ou B.

Avec les informations ci-dessus, nous pouvons regarder le flux ci-dessus et voir un délimiteur d'unité d'accès, suivi d'un SPS, PPS et de la première trame I.

12
Yaur
    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 est le type de NALU (Network Abstraction Layer Units)) Les NALU ont environ 31 types.

09 AUD signifie Délimiteur d'unité d'accès.

Délimiteur d'unité d'accès (AUD). Un AUD est une NALU facultative qui peut être utilisée pour délimiter des trames dans un flux élémentaire. Il n'est pas requis (sauf indication contraire par le conteneur/protocole, comme TS), et n'est souvent pas inclus afin d'économiser de l'espace, mais il peut être utile de trouver le début d'une trame sans avoir à analyser entièrement chaque NALU.

Cochez cette réponse pour plus d'informations.

J'ai également une question sur la façon de décoder le flux h264 (dans iOS).

7
Nhat Dinh

Cela définit le type de paquet. Le format est:

+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI|  Type   |
+---------------+

Êtes-vous sûr qu'il s'agit d'un en-tête NAL h.264? D'après ce que vous avez fourni, cela ne semble pas être l'en-tête avec le contexte que vous avez fourni.

2
Matt