mp4ファイル構造のどこにその期間がありますか?
9 に答える
これはあなたの問題への答えではないかもしれませんが、それは私のものでした:http: //mediainfo.sourceforge.net/
(ライブラリがあり、オープンソースなので、必要な部分を確認するだけです)
Red5 MP4リーダーには、タイムスケールフィールドと期間フィールドの両方が含まれているため、「mvhd」アトムを使用しました。アトムからの継続時間の取得は、使用されているバージョンによって異なります。以下に例を示します。
public long create_full_atom(MP4DataStream bitstream) throws IOException {
long value = bitstream.readBytes(4);
version = (int)value >> 24;
flags = (int)value & 0xffffff;
readed += 4;
return readed;
}
public long create_movie_header_atom(MP4DataStream bitstream) throws IOException {
create_full_atom(bitstream);
if (version == 1) {
creationTime = createDate(bitstream.readBytes(8));
modificationTime = createDate(bitstream.readBytes(8));
timeScale = (int)bitstream.readBytes(4);
duration = bitstream.readBytes(8);
readed += 28;
} else {
creationTime = createDate(bitstream.readBytes(4));
modificationTime = createDate(bitstream.readBytes(4));
timeScale = (int)bitstream.readBytes(4);
duration = bitstream.readBytes(4);
readed += 16;
}
int qt_preferredRate = (int)bitstream.readBytes(4);
int qt_preferredVolume = (int)bitstream.readBytes(2);
bitstream.skipBytes(10);
long qt_matrixA = bitstream.readBytes(4);
long qt_matrixB = bitstream.readBytes(4);
long qt_matrixU = bitstream.readBytes(4);
long qt_matrixC = bitstream.readBytes(4);
long qt_matrixD = bitstream.readBytes(4);
long qt_matrixV = bitstream.readBytes(4);
long qt_matrixX = bitstream.readBytes(4);
long qt_matrixY = bitstream.readBytes(4);
long qt_matrixW = bitstream.readBytes(4);
long qt_previewTime = bitstream.readBytes(4);
long qt_previewDuration = bitstream.readBytes(4);
long qt_posterTime = bitstream.readBytes(4);
long qt_selectionTime = bitstream.readBytes(4);
long qt_selectionDuration = bitstream.readBytes(4);
long qt_currentTime = bitstream.readBytes(4);
long nextTrackID = bitstream.readBytes(4);
readed += 80;
return readed;
}
ちなみに、私は次のように再生時間とfpsを計算するために値を使用しました
double fps = (videoSampleCount * timeScale) / (double) duration;
double videoTime = ((double) duration / (double) timeScale);
。videoSampleCount変数は「stsz」アトムから取得されます。
私の知る限り、「mp4」コンテナはQuickTimeアトム構造から派生しています。QuickTime File Format の説明を読むことができます。
quicktime アトムの解析は大したことではありません ( atomicParsley プロジェクトを見てください)。MP4についてはわかりませんが、MOVファイルについては、「mvhd」(ムービーヘッダー)アトムと「tkhd」(トラックヘッダー)アトムに「デュレーション」フィールドがあります。この持続時間は、通常、フレーム数に「タイム スケール」アトリビュートを掛けたものです。時間スケールは同じ原子で見つけることができます。
ムービーの長さは、ムービー ヘッダー mvhd にあります。秒単位の期間は、mvhd の 2 つのフィールドから取得されます。
- 4バイトのタイムスケール
- 4 バイトの長さ
これらは、@Tom Brito によって投稿された仕様の 380 行目と 382 行目です。
したがって、タイムスケール「ts」と期間「dur」が与えられた場合
Duration in seconds = dur / ts
基本的に MP4 構造はツリーです。マクロ領域は次のとおりです。
- ftyp - ファイルタイプ
- moov - メタデータ (曲のタイトル、作者、URL、その他の情報) が含まれています
- free - ヘッダーとデータを分離するための空の領域
- mdat - オーディオ フレームを含む
このフリーウェア MP4 アナライザー ツールを試すことができます
http://www.thinmultimedia.co.kr/products/MP4Reader_download.html
メディア ボックス ビューアーを使用できます。MP4 と Quicktime パーサーです。Quicktime ファイルを開くと、原子構造が表示されます。動画の説明アトムを探します。そのプロパティの 1 つは期間です。Media Box Viewer はwww.jdxsoftware.orgからダウンロードできます。