Linux xxd-Befehl Analyse-Videodatei Box-Tutorial (Box-Analyse-Box, Video-Box, Analyse-Atom-Analyse) (xdd-Befehl)

Linux-Befehl xxd zum Analysieren von Videodateien Box-Tutorial

In diesem Artikel wird hauptsächlich erläutert, wie Sie mit dem Linux-Befehl xxd Boxen (auch als „Atome“ bezeichnet) in MP4-Videodateien analysieren und interpretieren.

Normalerweise verwenden wir den folgenden Befehl, um die Hexadezimaldaten einer Videodatei abzurufen:

xxd example.mp4 | less

Fügen Sie hier eine Bildbeschreibung ein

Die Datenpositionseinheit ist Byte, und in einer Zeile werden standardmäßig 16 Byte Daten angezeigt. (Beim Hexadezimalsystem entsprechen 2 Ziffern 1 Byte. Sie können sehen, dass in den tatsächlichen Daten oben 8 xxxx in einer Zeile vorhanden sind und ein xxxx 2 Bytes entspricht. 8 entspricht 16 Bytes.)

1. Verstehen Sie das MP4-Format

Bevor wir den Befehl xxd im Detail verstehen, müssen wir zunächst die Grundstruktur von MP4-Dateien verstehen. MP4-Dateien bestehen aus einer Reihe von „Boxen“, von denen jede ihren eigenen Typ und ihre eigene Länge hat. Boxen können andere Boxen verschachteln, um eine hierarchische Struktur zu bilden. Diese Felder enthalten Informationen wie Audio, Video und Metadaten.

(Beispiel: Die tatsächliche Boxanordnung und die Verschachtelungsmethoden verschiedener Dateien können unterschiedlich sein.)

MP4文件
|
|--- ftyp box (文件类型)
|
|--- moov box (元数据)
|    |
|    |--- mvhd box (电影头)
|    |
|    |--- trak box (轨道)
|         |
|         |--- tkhd box (轨道头)
|         |
|         |--- mdia box (媒体)
|              |
|              |--- mdhd box (媒体头)
|              |
|              |--- minf box (媒体信息)
|                   |
|                   |--- stbl box (样本表)
|
|--- mdat box (媒体数据)

Die ersten 8 Bytes jeder Box bilden den Header der Box, der ein 4-Byte-Längenfeld und ein 4-Byte-Typfeld enthält. Das Längenfeld stellt die Größe der gesamten Box dar (einschließlich Kopfzeile und Daten), während das Typfeld eine ASCII-Zeichenfolge ist, die zur Identifizierung des Boxtyps verwendet wird.

2. Einführung in den Befehl xxd

Der Befehl xxd ist ein Tool zum Konvertieren von Dateien oder Eingaben in eine hexadezimale, binäre oder ASCII-Darstellung unter Linux. Dieser Befehl ist sehr nützlich für die Analyse von Binärdateien, insbesondere wenn wir die interne Struktur der Datei sehen und verstehen müssen.

Hier sind einige grundlegende xxd-Befehle:

3. Verwenden Sie den Befehl xxd, um MP4-Dateien zu analysieren

Nehmen wir ein konkretes Beispiel, um zu demonstrieren, wie der Befehl xxd zum Analysieren von MP4-Dateien verwendet wird.

Angenommen, wir haben eine Videodatei mit dem Namen „example.mp4“, dann können wir ihre hexadezimale Darstellung mit dem folgenden Befehl anzeigen:

xxd example.mp4 | less

Möglicherweise sehen Sie die folgende Ausgabe:

00000000: 0000 001c 6674 7970 6973 6f6d 0000 0200  ....ftypisom....
00000010: 6973 6f6d 6973 6f32 6176 6331 6d70 3431  isomiso2avc1mp41
00000020: 0000 0080 6d6f 6f76 0000 006c 6d76 6864  ....moov....mvhd

Jede Zeile stellt hier ein Kästchen dar. Die erste Zeile stellt beispielsweise ein ftypFeld mit einer Größe von 28 Bytes („0000001c“ in Dezimalzahl umgewandelt) und dem Typ „ftyp“ („66747970“ in ASCII umgewandelt) dar. Die nächsten 12 Bytes sind die Daten der Box.

4. Schwierigkeiten beim Parsen von MP4-Dateien

Obwohl der Befehl xxd uns helfen kann, die interne Struktur von MP4-Dateien zu erkennen, ist das Verständnis dieser Daten nicht immer einfach. Hier sind einige mögliche Herausforderungen:

1. Verschachtelte Struktur von Box

Boxen wie „moov“ und „trak“ können andere Boxen enthalten. Das bedeutet, dass wir die aktuelle Verschachtelungsebene im Auge behalten und die aktuelle Position aktualisieren müssen, wenn eine neue Box gelesen wird.

2. Endianness von Längen- und Typfeldern

MP4-Dateien verwenden Big Endian, was bedeutet, dass wir die aus der Datei gelesenen Bytes umkehren müssen. Wenn wir beispielsweise vier Bytes „00 00 01 c“ lesen, müssen wir sie in „1c 00 00 00“ invertieren und dann in eine Dezimalzahl umwandeln.

3. Nicht-textartige Daten

Felder wie „mdat“ enthalten Audio- oder Videodaten, die normalerweise nicht vom Texttyp sind und daher nicht direkt in ASCII-Zeichen konvertiert werden können. Wir müssen andere Tools oder Techniken verwenden, um diese Daten zu analysieren.

5. Beispiel für eine verschachtelte Struktur der Python-Code-Parsing-Box

Das Folgende ist ein einfaches Python-basiertes Beispiel zum Parsen der verschachtelten Struktur von Boxen in MP4-Dateien. Dieses Skript öffnet eine MP4-Datei und liest die Größe und den Typ jeder Box.

import struct

def read_box(file):
    data = file.read(8)
    if data:
        size, type = struct.unpack('>I4s', data)
        return size, type.decode('utf-8')
    else:
        return None, None

def parse_boxes(file, level=0):
    while True:
        size, type = read_box(file)
        if not size or not type:
            break

        print(f"{
      
      '  ' * level} {
      
      type} {
      
      size}")
        if type in ['moov', 'trak', 'mdia']:
            # 这是一个可以包含其他box的容器,所以我们递归地解析它
            start = file.tell()
            parse_boxes(file, level + 1)
            file.seek(start + size)  # 跳到当前box之后的位置
        else:
            # 这不是一个容器,所以我们直接跳过它的内容
            file.seek(size - 8, 1)

with open('example.mp4', 'rb') as f:
    parse_boxes(f)

In diesem Skript verwenden wir structModule, um Binärdaten zu lesen und in konkrete Werte zu analysieren. '>I4s'Die Parameter geben an, dass wir eine Big-Endian-Ganzzahl ohne Vorzeichen (d. h. die Größe der Box) und eine 4 Byte lange Zeichenfolge (d. h. den Typ der Box) lesen möchten.

Beachten Sie, dass wir aufgrund der verschachtelten Struktur von MP4-Dateien eine Rekursion verwenden müssen, um jede Containerbox zu analysieren. Wenn wir auf eine Containerbox stoßen (z. B. „moov“, „trak“ oder „mdia“), speichern wir die aktuelle Position, analysieren dann den Container rekursiv und kehren schließlich zur ursprünglichen Position zurück.

Da die Größe der Box außerdem einen eigenen Header beinhaltet, müssen wir beim Überspringen des Boxinhalts 8 Byte (die Größe des Headers) abziehen.

Supongo que te gusta

Origin blog.csdn.net/Dontla/article/details/135310863
Recomendado
Clasificación