teematsu @ ウィキ
解析
最終更新:
teematsu
動画ファイル(主に、mp4)の情報を調べる方法
ffmpeg
ffmpeg -i file.ext
表示例
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'niwa.3gp':
Duration: 00:00:17.02, start: 0.000000, bitrate: 6209 kb/s
Stream #0.0(eng): Video: mpeg4, yuv420p, 848x480 [PAR 1:1 DAR 53:30], 60 tbr
, 1k tbn, 60 tbc
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
備考
- マニュアル日本語訳
- Windows版は、例えば、WinFFに添付のものを利用できる。
mp4box
概要情報
mp4box -info file.ext
表示例
[iso file] Box "gnre" has 6 extra bytes
* Movie Info *
Timescale 1000 - Duration 00:00:17.028
Fragmented File no - 2 track(s)
File Brand 3gp4 - version 768
Created: GMT Mon Feb 21 02:35:57 2011
File has no MPEG4 IOD/OD
Copyrights:
(und) 〓
Track # 1 Info - TrackID 1 - TimeScale 1000 - Duration 00:00:17.028
Media Info: Language "Undetermined" - Type "vide:mp4v" - 506 samples
MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x20
MPEG-4 Visual Size 848 x 480 - ISO Reserved Profile
Pixel Aspect Ratio 1:1 - Indicated track size 848 x 480
Self-synchronized
Track # 2 Info - TrackID 2 - TimeScale 1000 - Duration 00:00:16.916
Media Info: Language "Undetermined" - Type "soun:mp4a" - 793 samples
MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40
MPEG-4 Audio AAC LC - 2 Channel(s) - SampleRate 48000
Synchronized on stream 1
※ この例の場合動画ファイルに設定されているCopyrightsがおかしいため表示が化けている。
-
TimeScale
内部で時刻/時間を表現するときの単位を1秒の何分の1にするかを指定(らしい)。この例では1msec単位となる。
トラックのより詳細な情報
mp4box -info 1 file.ext
1の部分はトラック番号を指定
表示例
[iso file] Box "gnre" has 6 extra bytes
Track # 1 Info - TrackID 1 - TimeScale 1000 - Duration 00:00:17.028
Media Info: Language "Undetermined" - Type "vide:mp4v" - 506 samples
Handler name: VideoHandler
MPEG-4 Config
Visual Stream - ObjectTypeIndication 0x20
MPEG-4 Visual Size 848 x 480 - ISO Reserved Profile
Pixel Aspect Ratio 1:1 - Indicated track size 848 x 480
Decoding Buffer size 73489 - Average bitrate 6000 kbps - Max Bitrate 600
0 kbps
No stream dependencies for decoding
StreamPriority 0
Computed info from media:
Total size 12813185 bytes - Total samples duration 16995 ms
Average rate 6406 kbps - Max Rate 6455 kbps
box構成をXMLで出力
mp4box -diso file.ext (file_info.xmlに出力) mp4box -diso -std file.ext (標準出力に出力)
出力例
<?xml version="1.0" encoding="UTF-8"?> <!--MP4Box dump trace--> <IsoMediaFile Name="niwa.3gp"> <FileTypeBox MajorBrand="3gp4" MinorVersion="768"> <BoxInfo Size="28" Type="ftyp"/> <BrandEntry AlternateBrand="3gp4"/> <BrandEntry AlternateBrand="mp41"/> <BrandEntry AlternateBrand="3gp6"/> </FileTypeBox> <MediaDataBox dataSize="13203670"> <BoxInfo Size="13203678" Type="mdat"/> </MediaDataBox> <MovieBox> (略)
インデントはしてくれない。
udta (UserDataBox)は、実際はtrakより前にある場合でも、XMLではtrakの後ろに出力されてしまうようだ。
備考
mp4のフォーマット
基本事項
構成概略
mp4 +-- track 1 トラック | +-- media メディア これはトラックにつき1個 | +-- chunk 1 sampleの塊 | | +- sample 1 動画ならフレーム | | +- sample 2 | | +- ... | +-- chunk 2 | +-- ... +-- track 2 +-- ...
trackは、1がビデオで2がオーディオ、など。
sampleはchunkにグルーピングされ、chunkの連なりでビデオ全体またはオーディオ全体となる。
オーディオがステレオの場合にどう表現されるかは? 少なくとも別トラックになるわけではない模様。
T-01Cで録画した.3gpの例
内容の説明は、前記「携帯ゲーム機PSPの動画ファイル「MP4」とは何か」を参考に記載。
ボックスの種類 mp4box -disoのXMLのタグ名 内容
ftyp FileTypeBox 互換性情報
MajorBrand: 3gp4 MinorVersion 768
AlternateBrand: 3gp4, mp41, 3gp6
mdat MediaDataBox ビデオ、オーディオのバイト列(本体)
ここのサイズがとても大きい
moov MovieBox
mvhd MovieHeaderBox ムービーのヘッダ 長さ(時間)、更新時刻、
TimeScale(時間を指定するときの単位)
udta UserDataBox タイトル、製作者などの情報?
mp4boxの-disoで出力したXMLでは2つのtrakの後にあるが
実際にはこの位置に存在
cprt CopyrightBox
auth UnknownBox
titl UnknownBox
dscp UnknownBox
perf UnknownBox
gnre GenreBox
rtng UnknownBox
clsf UnknownBox
kywd UnknownBox
loci UnknownBox
albm UnknownBox
yrrc UnknownBox
trak TrackBox トラック
tkhd TrackHeaderBox トラックのヘッダ 長さ(時間)、更新時刻、
縦横ドット数、
mdia MediaBox メディア
mdhd MediaHeaderBox メディアのヘッダ 長さ(時間)、更新時刻、言語?など
TimeScale(時間を指定するときの単位)
hdlr MediaHeaderBox メディアの種類(ビデオかオーディオか)
ここの場合はビデオ
minf MediaInformationBox
vmhd VideoMediaHeaderBox ビデオトラックデータ固有の情報
らしいが実質的なデータは持っていない?
dinf DataInformationBox トラックデータの存在場所の情報
dref DataReferenceBox
url URLDataEntryBox ファイル外部にデータ本体があるときはそのURL?
ファイル内部にあるためか実質的データはなし。
stbl SampleTableBox
stsd SampleDescriptionBox エンコーディングの情報?
mp4v MPEGVisualSampleDescriptionBox エンコーディングのパラメータ?
幅高さ、DPI、色深度
esds MPEG4ESDescriptorBox エンコーディングのパラメータ? ビットレートなど
stts TimeToSampleBox 各sampleの再生時間の一覧
stss SyncSampleBox トラックデータのランダムアクセス可能な位置
(フレーム番号)の一覧
stsc SampleToChunkBox 各chunkのsample数の一覧
stsz SampleSizeBox 各sampleのバイト長
stco ChunkOffsetBox 各chunkのバイト位置(ファイルの先頭を0とする)
trak TrackBox
tkhd TrackHeaderBox トラックのヘッダ 長さ(時間)、ボリューム
mdia MediaBox メディア
mdhd MediaHeaderBox メディアのヘッダ 長さ(時間)、更新時刻、言語?など
時間を指定するときの単位
hdlr MediaHeaderBox メディアの種類(ビデオかオーディオか)
ここの場合はオーディオ
minf MediaInformationBox
smhd SoundMediaHeaderBox オーディオトラックデータ固有の情報
dinf DataInformationBox トラックデータの存在場所の情報
dref DataReferenceBox
url URLDataEntryBox ファイル外部にデータ本体があるときはそのURL?
ファイル内部にあるためか実質的データはなし。
stbl SampleTableBox
stsd SampleDescriptionBox エンコーディングの情報?
mp4a MPEGAudioSampleDescriptionBox エンコーディングのパラメータ?
サンプリングレート(=1000)、チャンネル数(=2)
サンプルのビット数(=16)
esds MPEG4ESDescriptorBox エンコーディングのパラメータ? ビットレートなど
ビデオと同じBOXが使われている(esds)
stts TimeToSampleBox 各sampleの再生時間の一覧
stsc SampleToChunkBox 各chunkのsample数の一覧
stsz SampleSizeBox 各sampleのバイト長
stco ChunkOffsetBox 各chunkのバイト位置(ファイルの先頭を0とする)
stblに出現するstts, stsc, stsz, stcoは、おそらく以下の関係にあるのだろう。
バイト数/位置の情報 時間の情報
-- +------+--------+ ← stcoのエントリで
↑ |chunk |sample | chunkのファイル内バイト位置を
| | |
stscの | +--------+ -- --
エントリで | |sample | ↑stszのエントリで ↑sttsのエントリで
chunk内の | | | ↓ sampleのサイズを ↓ sampleの再生時間を
sample数を | +--------+ -- --
| |sample |
| +--------+
| |sample |
| +--------+
↓ | |sample |
-- +------+--------+ ← stcoのエントリ
|chunk |sample |
| +--------+
| |sample |
+------+--------+ ← stcoのエントリ
|chunk |sample |
| +--------+
... .....
stssはビデオのほうのみ存在。各エントリーはsampleの番号をさし、1,30,60,90,と30置きになっているが、sampleのサイズから判断してキーフレームが30置きに出現しているわけでもなさそうで、stssが指す先は必ずしもキーフレームではなさそう。
ビデオとオーディオはすでにインターリーブされている。mdat中にビデオのchunk1個とオーディオのチャンク2個(最後だけ1個)が交互に出現。