Analyse du format FLV audio et vidéo

Présentation du format

Aperçu

FLV est un format d'encapsulation multimédia en continu, et nous pouvons considérer ses données comme un flux d'octets binaires.

D'une manière générale, FLV comprend deux parties: l'en-tête du fichier et le corps du fichier. Le corps du fichier est composé d'une série de paires de balises et de tailles de balises.Format de fichier FLV

  • Ouvrez le fichier FLV avec UltraEdit, comme indiqué ci-dessous
    fichier binaire

1. En-tête de fichier

En-tête FLV

46 4C 56 01 05 00 00 00 09
La partie d'en-tête se compose des parties suivantes
Signature (3 octets) + Version (1 octet) + Flags (1 Bypte) + DataOffset (4 octets)

  • signature: occupe 3 octets, fixe FLV trois caractères comme marque.
    En règle générale, lorsque les trois premiers caractères se révèlent être FLV, il est considéré comme un fichier flv.
    Dans la figure, 0x46 0x4C 0x56 représente FLV.
  • Version: occupe 1 octet pour indiquer le numéro de version de FLV. Ici, nous voyons que c'est 1.
  • Drapeaux: drapeaux de contenu 1 octet.
    Les 0ème et 2ème bits indiquent respectivement l'existence de la vidéo et de l'audio (1 signifie l'existence, 0 signifie absent).
    La capture d'écran montre 0x05, qui est 00000101, ce qui signifie qu'il y a à la fois de la vidéo et de l'audio.
  • DataOffset:
    4 octets représentent la longueur de l'en-tête FLV. Ici, vous pouvez voir que la valeur fixe est 9.

2. Corps du fichier

Format de fichier FLV
La partie du corps de FLV est composée d'une série de back-pointers + tag

  • Les pointeurs arrière sont
    fixés à 4 octets, représentant la taille de la balise précédente. Les premières données des back-pointeurs sont 0.

  • Balise
    les données audio et vidéo, où la balise est divisée en flv_tag_header + video_header / audio_header + data. Pour plus de détails, reportez-vous à la section de description détaillée de la balise ci-dessous.Corps du fichier

3. Détails du tag

Structure des données de balise

La
balise est divisée en: flv_tag_header + video_header / audio_header + data;
flv_tag_header occupe 11 octets, video_header 5 octets, audio_header 2 octets et le reste est constitué de données H264.

flv_tag_header est le suivant:

Longueur 11 octets, type + taille des données de balise + horodatage + horodatageExtended + id de flux + données de balise

  • tapez 1 octet.
    Il existe trois types de balises:
    scripts 0x1218
    audio 0x088
    vidéo 0x099

  • taille des données de balise 3 octets.
    Indique la longueur des données de balise. Compté à partir de l'identifiant streamd.

  • Timestreamp 3 octets.
    Horodatage

  • TimestampExtended 1 octet.
    Champ d'extension d'horodatage

  • L'ID de flux est de 3 octets.
    Toujours 0

video_header / audio_header

  • video_header, longueur 5 octets 4 bits
    Type de trame, type de trame 4 bits CodecID,
    type de codage vidéo
    8 bits AVCPacketType, est-ce un en-tête de séquence (0) ou NALU (1)
    24 bits vaut 0

  • audio_header, la longueur est de 2 octets et 4 bits
    représente le format audio
    . Les 5e et 6e bits représentent la fréquence d'échantillonnage
    . Le
    7e bit représente la longueur utilisée. Le
    8e bit représente le type audio. AVCPacketType 8 bits, est-ce un en-tête de séquence AAC ( 0) ou AAC brut (1)

partie de données

Données de trame après encodage H264

Balise de script, balise de script, 18, 0x12

Il n'y a généralement qu'une seule balise de script, qui est la première balise de flv, qui est utilisée pour stocker des informations flv, telles que la durée, l'audiodatarate, le créateur, la largeur, etc.

  • De manière générale, la structure de données d'étiquette contient deux paquets AMF.
    AMF (Action Message Format) est un format universel d'encapsulation de données conçu par Adobe. Il est utilisé dans de nombreux produits Adobe. En bref, AMF décrit différents types de données dans un format unifié.

    • Le premier package AMF encapsule des données de type chaîne
      . Le premier octet représente le type de package AMF, généralement 0x02, qui représente une chaîne. Pour les autres valeurs, reportez-vous à la documentation.
      Les 2-3 premiers octets sont des valeurs de type UI16, qui représentent la longueur de la chaîne, généralement 0x000A (la longueur de "onMetaData").
      Les octets suivants sont des données de type chaîne, généralement "onMetaData".

    • Le deuxième package AMF encapsule un type de tableau, qui contient les noms et les valeurs des éléments d'information audio et vidéo.
      Le premier octet indique le type de paquet AMF, généralement 0x08, qui indique un tableau.
      Les 2 à 5 premiers octets sont des valeurs de type UI32, indiquant le nombre d'éléments du tableau.
      Ce qui suit est l'encapsulation de chaque élément du tableau, qui est une paire de nom d'élément et de valeur. La méthode de représentation est la suivante: les
      1-2 premiers octets représentent la longueur du nom de l'élément, supposons que ce soit L.
      Il est suivi d'une chaîne de longueur L.
      L'octet L + 3 représente le type de valeur d'élément.
      Suivi de la valeur correspondante, le nombre d'octets occupés dépend du type de valeur.

  • Le type de données du script.
    Toutes les données apparaissent au format type de données + (longueur des données) + données.
    Le type de données occupe 1 octet et la longueur des données dépend de l'existence ou non du type de données et les données sont suivies.type de données

Balise vidéo, balise vidéo FLV, 9, 0x09

Balise vidéo FLV
Après avoir lu les données VideoData selon Tag Header, la partie videoData est divisée en informations vidéo Video_Header + AVC_Video_Header + data

  • Informations vidéo, 1 octet

    • Les 4 premiers bits indiquent le type de trame Type de trame
      Information vidéo

    • Les 4 derniers chiffres sont des ID codés (CodecID)
      CodecID

  • Si le format vidéo (CodecID) est AVC (H.264), VideoTagHeader aura 4 octets d'informations, AVCPacketType et CompositionTime, donc la longueur de VideoHeader est de 5 octets dans le cas d'un encodage H264.

    • AVCPacketType, 1 octet
      AVCPacketType

    • AVCDecoderConfigurationRecord
      contient les informations sps et pps les plus importantes liées au décodage H.264. Avant d'envoyer le flux de données au décodeur AVC, les informations sps et pps doivent être envoyées, sinon le décodeur ne peut pas décoder normalement.
      Et avant que le décodeur ne redémarre après l'arrêt, tel que la recherche, l'avance rapide et la commutation d'état de retour rapide, etc., il est nécessaire de renvoyer les informations sps et pps.
      AVCDecoderConfigurationRecord apparaît généralement une fois dans le fichier FLV, qui est la première balise vidéo.

    • CompositionTime, 3 octets
      CompositionTemps

  • La
    première vidéo de sps pps est généralement stockée dans sps et pps.
    Format de stockage: la 0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps
    taille sps et la taille pps occupent chacune deux octets, donc la longueur de la partie videoData est de 11 octets + sps.length + pps.length; plus 5 octets pour videoHeader.

Balise audio, étiquette audio FLV, 8, 0x08

Balise audio FLV
Après avoir lu les données AudioData selon l'en-tête de la balise, la partie AudioData est divisée en informations audio Audio_Header + AACPacketType + data

  • Informations audio, 1 octet

    • Les 4 premiers bits indiquent le format audio
      format audio
    • Les 5ème et 6ème bits représentent la fréquence d'échantillonnage
      Taux d'échantillonnage
    • Le 7ème bit indique la longueur adoptée
      Longueur d'échantillonnage
    • Le 8ème bit indique le type audio
      Type audio
  • Parmi eux, si le format audio est 10, c'est-à-dire qu'il est au format AAC, il y aura un octet supplémentaire AACPacketType dans AudioTagHeader, ce champ indique le type d'AACAUDIODATA: 0 = en-tête de séquence AAC, 1 = AAC brut.

    • L'en-tête de séquence AAC contient également AudioSpecificConfig. AudioSpecificConfig contient des informations audio plus détaillées. La définition d'AudioSpecificConfig se trouve dans 1.6.2.1 AudioSpecificConfig dans ISO14496-3, je ne la publierai donc pas en détail ici. Et il existe une fonction d'analyse AudioSpecificConfig dans ffmpeg, ff_mpeg4audio_get_config (), vous pouvez la comparer et la comprendre plus profondément.
    • AAC raw inclut le flux audio ES, qui est la charge utile audio.
      image.png

par exemple

Jetez un œil au fichier flv

En-tête FLV

  • 46 4C 56 01 05 00 00 00 09:
    Représente l'en-tête FLV, à la fois audio et vidéo

  • 0x 00 00 00 00
    Les premiers back-pointers (représentant la taille de la balise précédente). Il n'y a pas de balise devant lui, donc c'est 0.

Balise de script

12 00 00 B6 00 00 00 00 00 00 00
0x12Cela signifie qu'il s'agit d'une balise de scripts, 00 00 B6trois octets signifie que la longueur des données de la balise est de 182 octets, et Timestreamp, TimestampExtended et stream id sont tous à 0.
Les pointeurs arrière suivants indiquent la taille de la balise entière, c'est-à-dire 182 + 11 (la longueur devant les données de la balise) = 193 = 0xc1, c'est-à-dire qu'il 00 00 00 c1suffit de rechercher dans l'outil.

image.png

  • 02 00 0A 6F 6E 4D 65 65 74 61 44 61 74 61Représente le premier paquet AMF.
    02 signifie que le type est de type chaîne, et les deux octets suivants 00 00A signifie que la longueur est de 10 et la valeur est onMetaData.

  • 03 00 00 00 08
    03 signifie ObjectType, ici il devrait être 08 généralement, ce qui signifie type de tableau; cela signifie qu'il y a 8 paires clé-valeur.
    L'étape suivante consiste à analyser les paires clé-valeur.

  • La paire clé-valeur d'analyse
    0005 représente la longueur de la clé, 77 69 64 74 68représente la largeur, 00représente le type sous forme de nombre et les 8 octets suivants représentent la valeur.
    0006 indique la longueur de la clé, 68 65 69 67 68 74indique la hauteur, 00indique que le type est Nombre et les 8 octets suivants indiquent la valeur.
    Par analogie à la fin end marker 00 00 09, l'analyse est complète.

Le premier videoTag, contient généralement des sps et des pps

09 00 00 25 00 00 00 00 00 00 00
09 représente la balise vidéo;
00 00 25 représente la longueur de 0x25 = 37; plus la longueur d'en-tête de 11, elle est de 48, les pointeurs arrière suivants sont 00 00 00 30
Timestreamp, TimestampExtended et l'ID de flux sont tous à 0; le
suivant est la partie données données de balise. Comme indiqué ci-dessous:
image.png

  • 0x17, C'est-à-dire que les 0b00010111
    4 premiers bits indiquent le type de trame, 1 indique la trame clé; les 4 derniers bits indiquent l'ID de codage et 7 indique AVC.
    Si le format vidéo est de type AVC (H.264), le dernier octet représente AVCPacketType et les trois derniers octets représentent CompositionTime.

  • 00
    AVCPacketType vaut 0, ce qui signifie qu'il s'agit de AVCDecoderConfigurationRecord. Cela signifie qu'il contient sps et pps. Cette chose doit d'abord être envoyée au décodeur, sinon elle ne peut pas être décodée normalement.

  • 00 00 00
    CompositionTime est égal à 0. Viennent ensuite les informations de sps et pps.

  • 0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps, Regardez
    sps [1] = 42
    sps [2] = 80
    sps [3] = 20
    sps size = par rapport au binaire 00 11, ce qui signifie que la longueur sps est de 17 et que les données sps de 17 octets ont été lues; 01
    pps size = est lu 00 04, ce qui signifie que la longueur en pps est de 4,
    la balise se termine après la lecture. Les prochains back-pointers.

Le premier audioTag contient l'en-tête de séquence AAC

08 00 00 04 00 00 00 00 00 00 00
08 signifie audio;
00 00 04 signifie que la longueur est de 4; plus la longueur d'en-tête de 11, elle est de 15 et les pointeurs arrière suivants 00 00 00 0F
sont des données d'étiquette. Comme indiqué ci-dessous:
image.png

AF, Autrement dit, les 0b10101111
4 premiers octets sont 1010, 10 en décimal, indiquant que le format audio est AAC; 10 aura un octet supplémentaire AACPacketType, indiquant le type de AACAUDIODATA.
Les 5e et 6e chiffres sont 11 et la décimale est 3, ce qui signifie que la fréquence d'échantillonnage est de 44 kHz;
le 7e chiffre est 1, ce qui signifie que le 16 bits est adopté;
le 8e chiffre est 1, ce qui signifie stéréo;

00, Signifie AACPacketType et 0 signifie que la balise est un en-tête de séquence AAC.
Les deux octets suivants représentent AudioSpecificConfig, qui contient des informations audio plus détaillées.
La balise se termine après la lecture. Les prochains back-pointers.

的 的 videoTag 、 videoTag

  • Les
    données vidéo suivantes d' une longueur vidéo de 35525 ont un horodatage de 23.
    0x17Le dernier bit AVCPacketType 01représente les données NALU. Après les trois octets CompositionTime, ce sont les données NALU.
    image.png

  • Les
    données audio suivantes d' une longueur audio de 1538 ont un horodatage de 36; la
    0xAFdernière est AACPacketType 01, ce qui signifie ACC raw, qui est des données audio NALU.
    image.png

Pour résumer

Jusqu'à présent, nous avons trié le format FLV, et nous pouvons mieux comprendre une partie du code FLV.

Référence:
Format d'emballage vidéo FLV
Explication détaillée du format FLV + exemple d'analyse
Encapsulation d'un flux vidéo h.264 dans un fichier au format
FLV Notes d'étude FLV (AAC / AVC)

Je suppose que tu aimes

Origine blog.csdn.net/u014099894/article/details/108442904
conseillé
Classement