Excel VBAでファイル解析(MPEGファイル編)
■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ステップのみです。
- Dim sht, bf As Object
- Dim wID, wStr As String
- Dim wLoc, wLen, lcnt As Long
- Private Sub Sample1()
- Set sht = ActiveSheet
- sht.Cells.NumberFormatLocal = “@"
- Set bf = New BinaryFile
- bf.InputFile (“C:\work\xxx.mpg")
- lcnt = 0
- Do While bf.CurrentPosition < bf.FileSize – 3
- wLoc = bf.CurrentPosition
- wID = bf.GetDataHex(4)
- lcnt = lcnt + 1
- sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
- sht.Cells(lcnt, 2) = wID
- Select Case wID
- Case “000001B9"
- sht.Cells(lcnt, 3) = “0000"
- sht.Cells(lcnt, 4) = “Program End"
- Case “000001BA"
- sht.Cells(lcnt, 3) = “0008"
- sht.Cells(lcnt, 4) = “Pack"
- bf.SkipData (8)
- Case Else
- wLen = bf.GetData(2)
- sht.Cells(lcnt, 3) = Right(“000" & Hex(wLen), 4)
- Select Case wID
- Case “00000100"
- sht.Cells(lcnt, 4) = “Picture"
- Case “00000101" To “000001AF"
- sht.Cells(lcnt, 4) = “Slice"
- Case “000001B0" To “000001B1"
- sht.Cells(lcnt, 4) = “reserved"
- Case “000001B2"
- sht.Cells(lcnt, 4) = “User data"
- Case “000001B3"
- sht.Cells(lcnt, 4) = “Sequence"
- Case “000001B4"
- sht.Cells(lcnt, 4) = “Sequence Error"
- Case “000001B5"
- sht.Cells(lcnt, 4) = “Extension"
- Case “000001B6"
- sht.Cells(lcnt, 4) = “reserved"
- Case “000001B7"
- sht.Cells(lcnt, 4) = “Sequence End"
- Case “000001B8"
- sht.Cells(lcnt, 4) = “Group of Pictures(GOP)"
- Case “000001BB"
- sht.Cells(lcnt, 4) = “System"
- Case “000001BC"
- sht.Cells(lcnt, 4) = “Program Stream Map"
- Case “000001BD"
- sht.Cells(lcnt, 4) = “Private Stream1"
- Case “000001BE"
- sht.Cells(lcnt, 4) = “Padding Stream"
- Case “000001BF"
- sht.Cells(lcnt, 4) = “Private Stream2"
- Case “000001C0" To “000001DF"
- sht.Cells(lcnt, 4) = “MPEG1/MPEG2 Audio Stream"
- Case “000001E0" To “000001EF"
- sht.Cells(lcnt, 4) = “MPEG1/MPEG2 Video Stream"
- Case “000001F0"
- sht.Cells(lcnt, 4) = “ECM Stream"
- Case “000001F1"
- sht.Cells(lcnt, 4) = “EMM Stream"
- Case “000001F2"
- sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A or ISO/IEC 13818-6_DSMCC_stream"
- Case “000001F3"
- sht.Cells(lcnt, 4) = “ISO/IEC_13522_stream"
- Case “000001F4"
- sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type A"
- Case “000001F5"
- sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type B"
- Case “000001F6"
- sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type C"
- Case “000001F7"
- sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type D"
- Case “000001F8"
- sht.Cells(lcnt, 4) = “ITU-T Rec. H.222.1 type E"
- Case “000001F9"
- sht.Cells(lcnt, 4) = “Ancillary stream"
- Case “000001FA" To “000001FE"
- sht.Cells(lcnt, 4) = “reserved"
- Case “000001FF"
- sht.Cells(lcnt, 4) = “Program Stream Directory"
- End Select
- bf.SkipData (wLen)
- End Select
- Loop
- Set bf = Nothing
- 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ページ
ディスカッション
コメント一覧
まだ、コメントがありません