しいしせねっとわーく
[技術資料室] [フォーマット辞典] [ネットワーク編] [ハード部屋] [Linuxメモ] [Javaメモ] [Dev news]
[JPEG] [MPEG] [Blu-ray Disc] [DV] [XML] [QRコード] [文字コード]

フォーマット辞典 映像編

Last update

今、開発環境が寂しくないですか?
各種データやデバイス・開発言語・プロトコルのフォーマットやI/Oポートの使い方、などなど、開発者のための資料になるものを扱う予定です。
ここに掲載する情報も募集しています。(リンクも張ります)
誰が何を知りたくて読んでいるのかもわからないので、更新頻度は低いかもしれません。
文字コードもこちらでメモメモかな。

知りたい規格ありますか?

一覧

映像/動画系

[JPEG JFIF]
[MPEG]
[色規格]
PDF
PNG
MNG
GIF
TIFF
BMP
QuickTime
DV-AVI
FlashPix
ICO (Windows ICON)

 

  • マルチメディア系?
    • Macromedia Flash (swf)
  • 構造化ファイル
  • ほかに見つけたリンク集(ファイルではないですが)

などなど

参考


ファイル フォーマット 解説

Last update 2001.03.14

昔はもっと沢山の画像や音声フォーマットがありましたが、ハードウェアが色数に依存しなくなってしまってからというもの、ビットデータ処理など、扱いにくくなってしまいました。
画像エフェクトをリアルタイム処理でこなそうとすると、どうしても画面モードに依存してしまいますからね。
Webの検索をしてみると、使う側から見た適当な解説しかしてないものがほとんどのようで、それでは悲しいので、せめて、元ネタや仕様の公開されているところへリンクだけでもしておこうと思います。

基礎?

動画、静止画の圧縮に、4:2:0フォーマットや4:2:2フォーマットというのをよく見かけます。どういうものなのでしょう。

動画などでは、色をRGBではなく、Y,Cr,Cbの3つに分割して圧縮しています。このYとCr,Cbの比率が4:2:2 などだったりします。

で、4:2:0 は何なのかというと、フレームごとに 4:2:0 と 4:0:2 で記録していて、実質は 4:1:1 のものを片方のフレームを取ってそんなふうに呼んでいるようです。

フレームとフィールド

おなじみテレビ(NTSC)は、インターレス表示で、60回の走査で30画面分を作ってます。

1回で作る画面をフィールド、2つあわせて1画面になったものをフレームといいます。

参考

Macromedia Flash 6 (swf)

公開されているらしいぞ。

参考
Macromedia

Portable Document Format(Adobe PDF)

翻訳するとき、余計な改行を消さないといけなかったり、データとしての保存価値はあまりなさそう。
紙の代わりにしかなってないかも。ディスプレイ上だと、やっぱり読みにくい。
ばーぢょん 1.5まで出ている。

ICO (Windows ICON format)

 ヘッダ tagICONDIR  // 6バイト 
 { 
   WORD  予約 // 0x0000
   WORD  リソースの種類 // 0x0001 icon
   WORD  リソースの数 n // 0x0002 2つ など
   ICONDIRENTRY  アイコン1つの情報[n];
 } 
tagICONDIRENTRY { // 16バイト
   BYTE width;  // 幅 普通16または32
   BYTE height; // 高さ 16 または 32 ?
   BYTE colorcount; // 色数 普通16か? 0になってる。 2 ?
   BYTE Reserve; // 予約
   WORD Planes; // プレーン数 0 ?
   WORD BitCount; // ビットのカウント 0 ?
   DWORD BytesInRes; // サイズ
   DWORD ImageOffset; // ファイル先頭からのオフセット
}
次がデータ?

JPEGフォーマット

http://siisise.net/jpeg.html へ移動しました。

MPEGフォーマット

http://siisise.net/mpeg.html へ移動しました。

PNGフォーマット

GIFフォーマットが問題になったことで作られた?ライセンスフリーの画像フォーマット。
GIFと比べ、フルカラー画像を扱うことができるが、アニメーションなどの処理は、まだ実現されていない。
どのOSでも利用できるような汎用性の高いライブラリが公開されているので、開発の際は、それを利用することになるかも。
Cマガジン(ソフトバンク パブリッシング)で、特集記事があった?
アニメーションGIFに対応するためにつくられたMNGという形式もある。

PNGファイルシグネチャ
137 80 78 71 13 10 26 10
0x89504E470D0A1A0A
'PNG'CR LF SUB LF

ブロック構造
Length (4byte) データ(Chunk Data)の長さ
Chunk Type (4byte)
Chunk Data (可変)
CRC (4byte) Chunk Type と Chunk DataのCRC

参考

MNGフォーマット

いろいろあります。
基本的に外枠はPNG といっしょです。JNGというJPEG形式のも加わってます。
MNG (JNGを含む)
MNG-LC (Low Complexity)、MNG-VLC (Very Low Complexity)

シグネチャ
138 77 78 71 13 10 26 10
0x8A4D4E470D0A1A0A
\212 MNG CR LF SUB LF

参考

GIFフォーマット

インターネットでよく使われ拡張されている画像フォーマット 256色画像専用らしい。
アニメーションや透過処理、インターレス表示等ができる。
これは、特許のライセンスが問題になっていて、PNGという次のフォーマットが出来上がっている。
2004年6月頃に特許は期限が切れる。
特許が切れるまではJPEGまたはPNG、非圧縮データを利用しよう。

Graphics Interchange Format

GIF89aの場合

ヘッダ(13バイト)
DB "GIF89a " (6バイト)
DW Width, Height (4バイト)
DB PacketFields (8ビット)
( Global Color Table Flag (1bit) | Color Resolution (3bit) | Sort Flag (1bit) | Size of Global Color Table (3bit) )
Background Color Index(背景色 1バイト) Global Color Table Flagが0のときは 00、1のときのみ有効)
Pixel Aspect Ratio(縦横比)

フッタ
DB 0x3B (1バイト)

参考にしていないもの
C MAGAZINE 1999年10月号(ソフトバンク出版)

新しい画像フォーマットを作りますか?
モーションJPEGとか・・・。小さい動画もWebで扱いやすく。
帯域圧縮術あるかも・・・。

TIFF 6.0?

書きかけ・・・。
先頭が、IIまたはMMで、インテルかモトローラかという識別からはじまる画像フォーマット。
どのような情報が格納されているかというタグによってそれ以降のデータが決まるという非常に柔軟性の高いフォーマット。
TOWNSは、独自のフォーマットを採用してしまっている。

ヘッダ情報
Offset Size  
00-01 DB "II" or "MM" データの順序がインテル並びか、モトローラ並びかを示す。
02-03 DW ばーぢょん 002Ah
04-07 DD 00000008h IFDタグへのファイル先頭からのオフセット。普通、直後にあるので8

IFD(イメージファイルディレクトリ)タグ情報
00-01 DW 数
02- 12*n タグ

12バイトが1セット
00-01 タグ種類
02-03 タイプ
1: BYTE
2: ASCII
3: SHORT
4: LONG
5: RATIONAL
04-07 データ長
08-0B 値 または 値へのオフセット

最後のTAGは、4バイトの0

パレット
データ

参考
FM TOWNS High C Compiler のマニュアル
Oh!FM TOWNS(ソフトバンク)の記事

BMPフォーマット

使わなくてはならなくなったので、BMPも解説する。WindowsとOS/2の画像フォーマットである。
二種類の形式がある。
ヘッダは、二つにわかれている。
実際のファイルを見てみれば、だいたいの処理を書くことができそう。
画像は、縦方向が通常と逆に記録されている。
左下からはじまり、右向きに走査しながら、上に伸びていく。

BITMAP FILE HEADER
00-01 'BM'
02-05 FILE SIZE
06-07
08-09
Reserved
0A-0D Header Size (Image Offset)
BITMAP INFO HEADER
Offset  
00-03 INFO HEADER SIZE
04-07 Width
08-0B Height
0C-0D Planes (1)
0E-0F Color bit size
10-13 圧縮方式(0)
14-17 イメージのサイズ (0?圧縮時?)
18-1B 水平解像度
1C-1F 垂直解像度
20-23 パレット色数
24-27 重要色数
PALETTE
DD 00RRGGBB * n

参考にしていないもの
C MAGAZINE 1999年10月号

QuickTimeという名のフォーマット

AppleがQuickTimeで使っていたり、MPEG4のベースにもなっているらしいフォーマットとはどんなものなのでしょうか? MSのRIFF形式を知っていれば、似たようなものです。

基本構造は Atom と呼ばれるようです。

参考

AVIとOpenDML AVI File Format Extensions

AVIは、RIFFをベースにしています。

初期のものは、ファイルで2GBまたは4GB、システムでは1GBまでのファイルしか扱えませんでした。Video for Windows 時代のAVIです。

その壁を超えたのがAVI 2.0 などと呼ばれていますが、具体的にどう超えたのでしょうか? RIFFチャンク自体を複数持てるようにしています。

AVI 2.0と呼ばれているものの実体はOpenDML AVI File Format Extensions といい、MatroxなどがAVIを拡張したものです。主にモーションJPEGのための拡張なのか?

Microsoftは、aviからasfやwmv(どちらも中身はほぼ同じ)といったファイルに移ってしまったようですが。

ストリーミング用として Advanced Streaming Format (ASF)、オーサリング用としてAdvanced Authoring Format (AAF) を作ったのか。失敗したのかね。

参考

DV規格とDV-AVIフォーマット

RIFF系を紹介したついで

DVフォーマット/DV規格/DV方式(民生用デジタルVCR SD規格)

DVテープの仕様は HDデジタルVCR協議会(HD Digital VCR Conference どこにあるの?)で1994年に作られた。水平解像度500本以上。720x480 30fps。圧縮率は1/5。音声は48/44.1/32kHz/16bit*2、44.1kHz/16bit*2または32kHz/12bit*4。44.1/32kHz/16bitはほとんど見られないのかな? 25Mbit/秒。

NTSC(525/60)の場合、YUV=4:1:1。625/60は4:2:0だとか。

フレームは独立するMotion-JPEGのような形式。

IEC 61834-2 らしい IEEE1394上を転送するのは IEC 61833 かな

種類 IEC  
民生用DVC General 61834-1(2001-06)Ed 1.1  
SD 61834-2(1998-)Ed 1.0 25Mbps
HD 61834-3(1999-11)Ed 1.0 50Mbps
Pack header-- 61834-4(1999-07)Ed 1.0  
character info-- 61834-5(1998-08)Ed 1.0  
SDL 61834-6(2000-08)Ed 1.0 12.5Mbps
EDTV2 61834-7(2001-03)Ed 1.0  
PALplus 61834-8(2001-06)Ed 1.0  
DVB 61834-9(2001-03)Ed 1.0  
DTV 61834-10(2001-02)Ed 1.0  

いろいろあるようですね。

テープ上に記録するための規格なので、固定サイズの中にいろいろ情報を詰め込んでいたりする。

最小のサイズが 1 DIF Blockという80バイト長の固まりです。その上に1 DIF Sequence(=150 DIF Block NTSCの場合)なんかがあります。1フレームは10 DIF Sequenceでできていたりするようです。

DIF Sequenceの構造

この順で、150 DIF Blockで1 DIF Sequenceになります。AudioとVideoは混ざって相互に出てくる? Audio 1、Video 15ぐらいの間隔。括弧内はBlock番号。

1秒間に 29.97×10×150=44955 DIF Block を使います。IEEE1394上では、8kHz周期でパケットを送信するので、6 DIF Block(480バイト)ごとにパケットとして送信されます。頭にはCIPヘッダを付けます。

DIF Blockの構造

3バイトID、1バイトヘッダ、76バイトデータのようです。

テープの場合は前に2バイトのsyncと後ろに8バイトのパリティなどが付いて90バイトになります。

DVCAM(Sony系)やDVCPRO(松下系)は業務用

DVCAMはテープ速度が1.5倍(60分テープで40分)、音が映像と同期したりする。

Video系

だったりで、多少劣化するのかな

音声

29.97fpsの映像が中途半端な周波数なので、音声もそれに合わせるためなんか可変らしい

1 DIF Sequence中に9 DIF Blockぐらいずつ用意されている。が、可変でもある?

1600,1602*5サンプル/フレーム (DVCAM?)

参考

HDV規格

キャノン、シャープ、ソニー、ビクターの4社により発表された形式。ビクター仕様を基にしたようだ。IEC 61834-3 にHDフォーマット用の規格があるが、これとは別の形式である。

DVテープとおなじテープにHD画質の映像をMPEG2で記録できるようにしたもの。1080p、720iに対応する。音声は48kHz/16bit、MPEG-1 Audio Layer 2 384kHzで圧縮される。DV規格のPart 7、Part 8と呼ばれる部分を利用したとか。

720pの場合はMPEG2-TSが使われるが、1080iの場合はPESと呼ばれるMPEG2-TSの一部だけが記録される。

  720p 1080i
解像度 1280×720 1440×1080
フレームレート 60,50,30,25 60,50
符号化方式 MPEG-2 Video (MP@H-14)
ビットレート 約19Mbps 約25Mbps
ストリームタイプ Transport Stream PES(packetized elementary stream)
ストリームインターフェース IEEE1394 (MPEG2-TS)

 

DV-AVI

DV-AVI Type 1とType 2があり、直接取り込んだものはType 1だったり。48kHz音声はなぜかうまく使えないことも多いような気がする。

DV規格(SD仕様) と書かれていることなど多し。

OpenDML というのが標準的? AVI 2.0のこと?

1080p のハイビジョン映像は、HDVという規格があり、miniDVとテ同じテープにMPEG2で記録できる。

FlashPix フォーマット

画像を複数のサイズで保存しているフォーマット。
部分的な読み込み、表示などにも対応している。
仕様は、Digital Image Groupにあった。(英文)
LivePicture, HP, コダック, Microsoftなどが決めた規格
仕様書のAppendix Aを読んでみると、WindowsのOLEで使われているらしい『構造化ファイル(Structured Storage?)』と深く関連している。LivePicture社などは、Javaのアプレットなどを公開しているので、Javaで読み込みはできるのかも・・・。公開してもらえないかな・・・。
仕様書を80%程度機械訳などして日本語化したものは、私が作っている。要望があれば、公開するかも。

簡単に構造化ファイルのヘッダ。やっぱやめておく・・・。
内部は、64*64のJPEGが複数保存されていると思っていい。
画像は階層構造になっていて、64*64の大きさになるまで、もとの画像の半分の大きさの画像が順番に保存される。
これは、インターネット上でサムネイル画像や、拡大縮小画像を高速に分割送信するためのものらしく、専用のサーバとビューアもある。

階層構造

Root Entry

CompObj
Global Info
Data Object 000001
SummaryInformation
Data Object Store 000001
CompObj
Image Contents
Resolution xxxx
Subimage 0000 Header
Subimage 0000 Data
ICC Profile 0001(Option)
SummaryInformation
ヘッダストリーム 0x1Cから
ヘッダストリームのヘッダ長 4 (0x24)
イメージ幅(WIDTH) 4
イメージ高さ(HEIGHT) 4
タイル数 4
タイル幅 4 (0x40)
タイル高さ 4 (0x40)
チャンネル数 4
ヘッダテーブルへのオフセット 4 (0x24)
ヘッダエントリーの長さ 4 (16)

タイルヘッダ
  Size  
オフセット 4 前のオフセット+サイズ
サイズ 4  
圧縮タイプ 4 0x0 非圧縮
0x1 単色圧縮(4-byte)
0x2 JPEG(8-bit)
0xFFFFFFFF Invalid tile
圧縮サブタイプ 1 単色の場合 Section 3.1.5.2
JPEGの場合 TABLE 4.5
00のとき : 8x8サイズの
0x1 : 分割
副標本? 1 0x00 0x01 0x10 0x11 0x22
Internal color conversion 1 0x00 color conversion無し
0x01
JPEG tables selector 1 0x00 ハフマンテーブルはデータ中に含まれる
01~番号
Section 3.1.5.3(Image Contents)参照

OLEの『構造化ストレージ』(IStorage)

↑FlashPixの仕様書の付録Aの部分を日本語化してみた。
InsideOLE(ASCII出版)等の書籍を見ると、少しだけ載っているような気がしたが、VC++のMSDNライブラリで調べてみれば、IStorageなどのインターフェイスが検索できるのかもしれない。Javaで開発するのは、ちょっと大変かもしれない。

IBM alphaWorksから、OLE構造化ファイルを扱うパッケージがリリースされている。ちょっと扱えない項目とかがあるかも。
私も、仕事でFlashPix用のパッケージを開発していた。

外から見れば、IStream / IStorageからなるWindows上の二つのインターフェイス。

内部はDOS FATと似たような構造を持ち、Storageというディレクトリのようなものと、Streamというファイルのようなものに分かれる。
FAT、ディレクトリエントリ(1つで階層構造を表現できる)などもファイル内にある。

0x00000200を0とするセクタアドレス空間
FAT、ディレクトリ、ミニFAT、DIF、ストリームがある。
SIDでディレクトリを見分ける?

ヘッダ : 最初のDIFセクタを含む
DIFセクタ : FATセクタの位置を示す (7MB未満のファイルには現れない)

FATセクタ(ひとつ) : セクタ 0 (0x200) からはじまりやすい

ディレクトリー(ひとつ) : FATセクタの最初からはじまる。セクタ 1 (0x400)からはじまりやすい
階層上の全ストレージが1つの連続ディレクトリ上に書かれる

ルートディレクトリエントリ : ディレクトリの先頭に書かれる
役割
親として
サイズを示すものとして
ミニストリームセクタの開始点として
ミニFat : ルートディレクトリエントリの示す位置からはじまる

ヘッダ

名前 Offset 長さ 概要(FlashPixの例)
BYTE _abSig[8] 000H 08 {D0 CF 11 E0 A1 B1 1A E1}
{0E 11 FC 0D D0 CF 11 E0}古いバージョン
CLSID _clid 008H 16 00 ?
USHORT _uMinerVersion 018H 02 003E ? 0033(リファレンス実装)
USHORT _uDllVersion 01AH 02 0003 ? 0003(リファレンス実装)
USHORT _uByteOrder 01CH 02 FFFE をIntelバイトオーダーで
USHORT _uSectorShift 01EH 02 0009(512を示す) セクタのサイズ
USHORT _uMiniSectorShift 020H 02 0006(64を示す) ミニセクタのサイズ
USHORT _usReserved 022H 02 0000
ULONG _ulReserved1 024H 04 00000000
ULONG _ulReserved2 028H 04 00000000
FSINDEX _csectFat 02CH 04 0000001A FATチェーンSECTの数
SECT _sectDirStart 030H 04 00000001 ディレクトリ・チェーンの先頭セクタ
DFSIGNATURE _signature 034H 04 00000000 署名 0
ULONG _ulMiniSectorCutoff 038H 04 00001000 ミニストリームの最大サイズ 4096
これより小さいもの(で、512に64以上足りないもの?)はミニに書く
SECT _sectMiniFatStart 03CH 04 00000002 ミニFATチェーンの開始位置
FSINDEX _csectMiniFat 040H 04 00000002 ミニFATチェーンSECTの数
SECT _sectDifStart 044H 04 FFFFFFFE なし
FSINDEX _csectDif 048H 04 00000000
SECT _sectFat[109] 04CH 436 最初の109 FATセクタの位置を示す(DIFセクタ)

DIF(Double-Indirect Fat)セクタ

FATがファイル中のどのセクタにあるかを示す。
ヘッダのFAT位置記述の続き。
最後は、次のDIFセクタの位置を示す。
7MB未満のファイルでは現れない。

FATを特定の間隔で配置すれば、これは要らないような気がする。

ディレクトリ・セクタ

ルートは、FATの最初に現れる(ヘッダの_sectDirStart)
名前 Offset Size 概要
BYTE _ab[32*sizeof(WCHAR)] 000H 64 Unicodeのエレメント名
WORD _cb 040H 02 エレメント名文字のバイト長
BYTE _mse 042H 01 オブジェクトタイプ {
0:STGTY_INVALID
1:STGTY_STORAGE
2:STGTY_STREAM
3:STGTY_LOCKBYTES
4:STGTY_PROPERTY
5:STGTY_ROOT
}
BYTE _bflags 043H 01 色 {
0:DB_RED
1:DB_BLACK(こっちだけでOK)
}
SID _sidLeftSib 044H 04 ディレクトリツリーの左
SID _sidRightSib 048H 04 ディレクトリツリーの右
SID _sidChild 04CH 04 STORAGEの場合の子
GUID _clsId 050H 16 STORAGEのCLSID
DWORD _dwUserFlags 060H 04 STORAGEのユーザ定義フラグ
TIME _T_time[2] 064H 16 STORAGEの作成/更新時間
SECT _sectStart 074H 04 STREAMのSECT開始位置
ULONG _ulSize 078H 04 ストリームのサイズ
DFPROPTYPE _dptPropType 07CH 02 予約0

MiniFatセクタ

指定バイト未満のファイルを格納するためのFAT。
ヘッダの_startMIniFatから開始する。構造はFatセクタと同じ。
指す位置は、Root Directory Entry中のMiniFatサイズの位置。

A.2 バイナリフォーマット

Streamの名前が\005などではじまるもの
プロパティセット・ヘッダ
名前 Offset Size 概要
WORD Byte Order Indicator 000H 02 FFFE
WORD Format Version 002H 02
DWORD OS Version 004H 04
CLSID クラス Identifer 008H 16
DWORD 予約 018H 04
FMTID/Offset ペア
サイズ 名前
16 byte FMTID
DWORD Offset

セクション
セクション・ヘッダ
   
DWORD セクションサイズ
DWORD パラメータのカウント m
プロパティID
プロパティID1 (DWORD) Offset** (DWORD)
   
プロパティID m Offset** (DWORD)
プロパティ
型情報(DWORD) プロパティ値(可変長)
繰り返し  

A.3 CompObj

概要
フォーマット

キャンペーン【300x75】


[しいしせねっと]