mp4ファイル構造 の期間はどこですか?
これはあなたの問題に対する答えではないかもしれませんが、それは私のものでした: http://mediainfo.sourceforge.net/
(ライブラリがあり、オープンソースなので、必要な部分だけをチェックできます)
https://github.com/sannies/mp4parser プロジェクトを参照してください。 mp4ファイルの構造を示すJavaライブラリです。
私の知る限りでは、「mp4」コンテナはQuickTime atom構造から派生しています。QuickTimeFile Formatの説明を読むことができます。
Quicktimeアトムの解析は大したことではありません( atomicParsleyプロジェクト を見てください)。 MP4についてはわかりませんが、MOVファイルについては、「mvhd」(ムービーヘッダー)atomおよび「tkhd」(トラックヘッダー)atomに「duration」フィールドがありますこの持続時間は通常、フレーム数に「時間スケール」属性を掛けたもので、時間スケールは同じ原子内にあります。
Red5 MP4リーダーでは、「mvhd」アトムを使用しました。これには、タイムスケールフィールドと期間フィールドの両方が含まれているためです。 atomから期間を取得することは、使用されているバージョンによって異なります。以下に例を示します。
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;
}
double fps = (videoSampleCount * timeScale) / (double) duration;
double videoTime = ((double) duration / (double) timeScale);
MP4Parserの使用 http://code.google.com/p/mp4parser/ 前のポスターで述べたように-期間を提供するサンプルもあります:
基本的にMP4構造はツリーです。マクロ領域は次のとおりです。
このフリーウェアMP4 Analyzerツールを試すことができます
http://www.thinmultimedia.co.kr/products/MP4Reader_download.html
映画の長さは、映画のヘッダーmvhdにあります。秒単位の期間は、mvhdの2つのフィールドから導出されます。
@Tom Britoが投稿した仕様の380行目と382行目です。
そのため、タイムスケール「ts」と期間「dur」を与えますDuration in seconds = dur / ts