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個)が交互に出現。