Linux xxdコマンド解析ビデオファイル Boxチュートリアル(ボックス解析ボックス、ビデオボックス、解析アトム解析)(xddコマンド)

ビデオ ファイルを分析するための Linux xxd コマンド Box チュートリアル

この記事では主に、Linux の xxd コマンドを使用して MP4 ビデオ ファイル内のボックス (「アトム」とも呼ばれる) を分析および解釈する方法について説明します。

通常、ビデオ ファイルの 16 進数データを取得するには、次のコマンドを使用します。

xxd example.mp4 | less

ここに画像の説明を挿入します

データ位置の単位はバイトであり、デフォルトでは 1 行に 16 バイトのデータが表示されます。(16進数の場合、2桁で1バイトになります。上記実際のデータでは、1行にxxxxが8個あり、xxxx1個が2バイトであることがわかります。8は16バイトです)

1. MP4形式を理解する

xxd コマンドを詳しく理解する前に、まず MP4 ファイルの基本構造を理解する必要があります。MP4 ファイルは一連の「ボックス」で構成されており、それぞれが独自のタイプと長さを持っています。ボックスは他のボックスをネストして階層構造を形成できます。これらのボックスには、オーディオ、ビデオ、メタデータなどの情報が含まれています。

(例:ファイルごとに実際のボックス配置やネスト方法が異なる場合があります)

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

各ボックスの最初の 8 バイトはボックスのヘッダーを構成し、4 バイトの長さフィールドと 4 バイトのタイプ フィールドが含まれます。長さフィールドはボックス全体 (ヘッダーとデータを含む) のサイズを表し、タイプ フィールドはボックスのタイプを識別するために使用される ASCII 文字列です。

2. xxdコマンドの概要

xxd コマンドは、Linux 上でファイルまたは入力を 16 進数、バイナリ、または ASCII 表現に変換するツールです。このコマンドは、バイナリ ファイルを分析する場合、特にファイルの内部構造を確認して理解する必要がある場合に非常に役立ちます。

基本的な xxd コマンドをいくつか示します。

3. xxd コマンドを使用して MP4 ファイルを分析します

具体的な例を使用して、xxd コマンドを使用して MP4 ファイルを分析する方法を説明します。

「example.mp4」という名前のビデオ ファイルがあるとします。次のコマンドを使用して、その 16 進表現を表示できます。

xxd example.mp4 | less

次の出力が表示される場合があります。

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

ここの各行はボックスを表します。たとえば、最初の行は、ftypサイズが 28 バイト (10 進数に変換された「0000001c」) およびタイプ 'ftyp' (ASCII に変換された「66747970」) のボックスを表します。次の 12 バイトはボックスのデータです。

4. MP4 ファイルの解析が難しい

xxd コマンドは MP4 ファイルの内部構造を確認するのに役立ちますが、このデータを理解することは必ずしも簡単ではありません。考えられる課題をいくつか挙げます。

1. Boxの入れ子構造

「moov」や「trak」などのボックスには、他のボックスを含めることができます。これは、現在のネスト レベルを追跡し、新しいボックスが読み取られたときに現在の位置を更新する必要があることを意味します。

2. 長さと型フィールドのエンディアン性

MP4 ファイルはビッグ エンディアンを使用するため、ファイルから読み取るバイトを逆にする必要があります。たとえば、4 バイト「00 00 01 c」を読み取る場合、それを「1c 00 00 00」に反転してから 10 進数に変換する必要があります。

3. 非テキスト型データ

「mdat」のようなボックスにはオーディオまたはビデオ データが含まれていますが、通常はテキスト タイプではないため、ASCII 文字に直接変換できません。このデータを解析するには、他のツールまたは手法を使用する必要があります。

5. Python コード解析ボックスの入れ子構造の例

以下は、MP4 ファイル内のボックスの入れ子構造を解析するための Python ベースの簡単な例です。このスクリプトは MP4 ファイルを開き、各ボックスのサイズとタイプを読み取ります。

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)

このスクリプトでは、structモジュールを使用してバイナリ データを読み取り、それを具体的な値に解析します。'>I4s'パラメーターは、ビッグ エンディアンの符号なし整数 (つまり、ボックスのサイズ) と 4 バイト長の文字列 (つまり、ボックスのタイプ) を読み取る必要があることを示します。

MP4 ファイルの入れ子構造のため、各コンテナ ボックスを解析するには再帰を使用する必要があることに注意してください。コンテナ ボックス (「moov」、「trak」、「mdia」など) に遭遇すると、現在の位置を保存し、コンテナを再帰的に解析し、最後に元の位置に戻ります。

さらに、ボックスのサイズには独自のヘッダーが含まれるため、ボックスの内容をスキップする場合は 8 バイト (ヘッダーのサイズ) を減算する必要があります。

おすすめ

転載: blog.csdn.net/Dontla/article/details/135310863