Excel VBAでファイル解析(MPEGファイル編)

2024-01-05

■MPEGファイルの概要

MPEG(Moving Picture Expert Group)は映像データの圧縮に関する規格の1つで、標準的なファイルの拡張子は「.mpg」または「.mpeg」です。

MPEGについては色々な規格がありますが、本稿ではMPEG1/MPEG2のビデオ・ストリームを中心に説明します。
⇒詳細は以下の規格書を参照して下さい。
(項番1、項番3は有償ですが、項番2、項番4はITU-Tのサイトで開示されています)

    • (システム)
    • 1.ISO/IEC 11172-1:1993
    • 2.ITU-T勧告 H.222
    • (ビデオ)
    • 3.ISO/IEC 11172-2:1993
    • 4.ITU-T勧告 H.262

MPEGファイルの階層構造

MPEGのシステム・ストリームおよびビデオ・ストリームは、以下の階層構造になっており、それぞれのレイヤ(層)別に詳細な仕様が定義されています。

レイヤ(層) 構成要素
システム・ストリーム
プログラム層 パック
パック層 パケット
パケット層 シーケンス
ビデオ・ストリーム
シーケンス層 GOP(Group of Pictures)
GOP層 ピクチャ
ピクチャ層 スライス
スライス層 マクロブロック
マクロブロック層 ブロック
ブロック層 DCT(離散コサイン変換)係数データ

MPEGファイルの構成

MPEGファイル(プログラム層)は、下図のようにパックの集合体として構成され、最後に終了コード(「Program End(X’000001B9′)」)が配置されています。

(MPEGファイルの基本構造)

最初のパック パック ・・・ パック 終了コード

パックの構成

最初のパックは「Pack Header」+「System Header」+パケット、2つ目以降のパックは「Pack Header」+パケットで構成されています。

(最初のパック)

Pack Header System Header パケット ・・・ パケット

(2つ目以降のパック)

Pack Header パケット ・・・ パケット

Pack Header、System Header、パケットのフォーマット

Pack Header、System Header、パケットのフォーマットは、下表の通りです。

(Pack Headerのフォーマット)

オフセット 長さ 説明
0 4 スタート・コード(X’000001BA’)
4 5 Version識別+SCR(System Clock Reference)
9 3 多重化レート

(System Headerのフォーマット)

オフセット 長さ 説明
0 4 スタート・コード(X’000001BB’)
4 2 ヘッダ長
6 3 ビット・レート
9 2 チャネル数+フラグ
11 1 予約バイト
12 可変長 N-ループ 基本ストリーム情報

(パケットのフォーマット)

オフセット 長さ 説明
0 4 スタート・コード(※)
4 2 パケット長
6 可変長 パケット・データ

(※)「スタート・コード」の内訳は、パケット開始符号(3バイト)+ストリームID(1バイト)です。

スタート・コードの種類

「スタート・コード」の値はX’00000100’~X’000001FF’の範囲で下表の通り定められています。

Start Code Description
X’00000100′ Picture
X’00000101′ through '000001AF’ Slice
X’000001B0′ through '000001B1’ reserved
X’000001B2′ User data
X’000001B3′ Sequence
X’000001B4′ Sequence Error
X’000001B5′ Extension
X’000001B6′ reserved
X’000001B7′ Sequence End
X’000001B8′ Group of Pictures(GOP)
X’000001B9′ Program End
X’000001BA’ Pack
X’000001BB’ System
X’000001BC’ Program Stream Map
X’000001BD’ Private Stream1
X’000001BE’ Padding Stream
X’000001BF’ Private Stream2
X’000001C0′ through '000001DF’ MPEG1/MPEG2 Audio Stream
X’000001E0′ through '000001EF’ MPEG1/MPEG2 Video Stream
X’000001F0′ ECM Stream
X’000001F1′ EMM Stream
X’000001F2′ ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A or ISO/IEC 13818-6_DSMCC_stream
X’000001F3′ ISO/IEC_13522_stream
X’000001F4′ ITU-T Rec. H.222.1 type A
X’000001F5′ ITU-T Rec. H.222.1 type B
X’000001F6′ ITU-T Rec. H.222.1 type C
X’000001F7′ ITU-T Rec. H.222.1 type D
X’000001F8′ ITU-T Rec. H.222.1 type E
X’000001F9′ Ancillary stream
X’000001FA’ through '000001FE’ reserved
X’000001FF’ Program Stream Directory

■MPEGファイルのヘダーとパケットをExcelシートに表示する処理

MPEGファイルのヘダーとパケットを読み込み、Excelシートに「オフセット」「スタート・コード」「データ長」「ヘダーの種類」を表示するプログラムです。
⇒サンプル・プログラムで使用している、Binary Fileクラスの詳細については、Excel VBAでファイル解析(事前準備編)を参照して下さい。

処理の概要

処理の流れは以下の通りです。
①Binary Fileオブジェクトをインスタンス化し、MPEGファイルを読み込み
②MPEGファイルのヘダーとパケットを解析し、必要な情報を取得してExcelシートにセット
③使用済のオブジェクトを破棄

サンプル・プログラム

行番号8でBinary Fileオブジェクトをインスタンス化し、行番号9でMPEGファイルを読み込んでいます。
行番号12~91の繰返し処理のうち、行番号20~21はProgram End、行番号23~25はPack Header、行番号27~89はSystem Headerおよびパケットに関する処理です。
行番号27~89はStart Codeに対応する名称をセットしているため、ステップ数が多くなっていますが、読み飛ばし処理に必要なのは行番号27と89の2ステップのみです。

  1. Dim sht, bf As Object
  2. Dim wID, wStr As String
  3. Dim wLoc, wLen, lcnt As Long
  4. Private Sub Sample1()
  5.     Set sht = ActiveSheet
  6.     sht.Cells.NumberFormatLocal = “@"
  7.     Set bf = New BinaryFile
  8.     bf.InputFile (“C:\work\xxx.mpg")
  9.     lcnt = 0
  10.     Do While bf.CurrentPosition < bf.FileSize – 3
  11.         wLoc = bf.CurrentPosition
  12.         wID = bf.GetDataHex(4)
  13.         lcnt = lcnt + 1
  14.         sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
  15.         sht.Cells(lcnt, 2) = wID
  16.         Select Case wID
  17.         Case “000001B9"
  18.             sht.Cells(lcnt, 3) = “0000"
  19.             sht.Cells(lcnt, 4) = “Program End"
  20.         Case “000001BA"
  21.             sht.Cells(lcnt, 3) = “0008"
  22.             sht.Cells(lcnt, 4) = “Pack"
  23.             bf.SkipData (8)
  24.         Case Else
  25.             wLen = bf.GetData(2)
  26.             sht.Cells(lcnt, 3) = Right(“000" & Hex(wLen), 4)
  27.             Select Case wID
  28.             Case “00000100"
  29.                 sht.Cells(lcnt, 4) = “Picture"
  30.             Case “00000101" To “000001AF"
  31.                 sht.Cells(lcnt, 4) = “Slice"
  32.             Case “000001B0" To “000001B1"
  33.                 sht.Cells(lcnt, 4) = “reserved"
  34.             Case “000001B2"
  35.                 sht.Cells(lcnt, 4) = “User data"
  36.             Case “000001B3"
  37.                 sht.Cells(lcnt, 4) = “Sequence"
  38.             Case “000001B4"
  39.                 sht.Cells(lcnt, 4) = “Sequence Error"
  40.             Case “000001B5"
  41.                 sht.Cells(lcnt, 4) = “Extension"
  42.             Case “000001B6"
  43.                 sht.Cells(lcnt, 4) = “reserved"
  44.             Case “000001B7"
  45.                 sht.Cells(lcnt, 4) = “Sequence End"
  46.             Case “000001B8"
  47.                 sht.Cells(lcnt, 4) = “Group of Pictures(GOP)"
  48.             Case “000001BB"
  49.                 sht.Cells(lcnt, 4) = “System"
  50.             Case “000001BC"
  51.                 sht.Cells(lcnt, 4) = “Program Stream Map"
  52.             Case “000001BD"
  53.                 sht.Cells(lcnt, 4) = “Private Stream1"
  54.             Case “000001BE"
  55.                 sht.Cells(lcnt, 4) = “Padding Stream"
  56.             Case “000001BF"
  57.                 sht.Cells(lcnt, 4) = “Private Stream2"
  58.             Case “000001C0" To “000001DF"
  59.                 sht.Cells(lcnt, 4) = “MPEG1/MPEG2 Audio Stream"
  60.             Case “000001E0" To “000001EF"
  61.                 sht.Cells(lcnt, 4) = “MPEG1/MPEG2 Video Stream"
  62.             Case “000001F0"
  63.                 sht.Cells(lcnt, 4) = “ECM Stream"
  64.             Case “000001F1"
  65.                 sht.Cells(lcnt, 4) = “EMM Stream"
  66.             Case “000001F2"
  67.                 sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A or ISO/IEC 13818-6_DSMCC_stream"
  68.             Case “000001F3"
  69.                 sht.Cells(lcnt, 4) = “ISO/IEC_13522_stream"
  70.             Case “000001F4"
  71.                 sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type A"
  72.             Case “000001F5"
  73.                 sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type B"
  74.             Case “000001F6"
  75.                 sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type C"
  76.             Case “000001F7"
  77.                 sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type D"
  78.             Case “000001F8"
  79.                 sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type E"
  80.             Case “000001F9"
  81.                 sht.Cells(lcnt, 4) = “Ancillary stream"
  82.             Case “000001FA" To “000001FE"
  83.                 sht.Cells(lcnt, 4) = “reserved"
  84.             Case “000001FF"
  85.                 sht.Cells(lcnt, 4) = “Program Stream Directory"
  86.             End Select
  87.             bf.SkipData (wLen)
  88.         End Select
  89.     Loop
  90.     Set bf = Nothing
  91. End Sub

実行結果(イメージ)

前項のExcelツールを実行すると、下図のように「Pack Header+SystemHeader」、「Pack Header+MPEG1/MPEG2 Video Stream」、「Pack Header+MPEG1/MPEG2 Audio Stream」、・・・「Program End」という構成であることがわかります(※)。

MPEG1/MPEG2 Video Streamの中のデータ部分を取り出して繋げればビデオ・ストリーム、MPEG1/MPEG2 Audio Streamの中のデータ部分を取り出して繋げればオーディオ・ストリームになります。

(※)本稿の動作確認には、構造の単純なMPEG1形式のファイルを使用しました。

  • 00000000 000001BA 0008 Pack
  • 0000000C 000001BB 000C System
  • 0000001E 000001BA 0008 Pack
  • 0000002A 000001E0 07BE MPEG1/MPEG2 Video Stream
  • 000007EE 000001BA 0008 Pack
  • 000007FA 000001C0 07EE MPEG1/MPEG2 Audio Stream
  • 00000FEE 000001BA 0008 Pack
  • 00000FFA 000001E0 07EE MPEG1/MPEG2 Video Stream
  • 000387EE 000001BA 0008 Pack
  • 000387FA 000001E0 0058 MPEG1/MPEG2 Video Stream
  • 00038858 000001B9 0000 Program End

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ

ファイル解析

Posted by hides