web-dev-qa-db-ja.com

mp4データ構造に精通している人はいますか?

mp4ファイル構造 の期間はどこですか?

33
Tom Brito

これはあなたの問題に対する答えではないかもしれませんが、それは私のものでした: http://mediainfo.sourceforge.net/

(ライブラリがあり、オープンソースなので、必要な部分だけをチェックできます)

13
Camilo Martin

https://github.com/sannies/mp4parser プロジェクトを参照してください。 mp4ファイルの構造を示すJavaライブラリです。

8
Aftershock

私の知る限りでは、「mp4」コンテナはQuickTime atom構造から派生しています。QuickTimeFile Formatの説明を読むことができます。

Quicktimeアトムの解析は大したことではありません( atomicParsleyプロジェクト を見てください)。 MP4についてはわかりませんが、MOVファイルについては、「mvhd」(ムービーヘッダー)atomおよび「tkhd」(トラックヘッダー)atomに「duration」フィールドがありますこの持続時間は通常、フレーム数に「時間スケール」属性を掛けたもので、時間スケールは同じ原子内にあります。

6
2can

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);
6
Paul Gregoire

MP4 は「コンテナ」形式です。これは基本的に、さまざまなオーディオまたはビデオストリームを含めることができることを意味します。また、各ストリームには独自の期間値を設定できます...

必要なものを調べるには、さらにいくつかの参照ファイルが必要になります。 here および here ...を探すことをお勧めしますが、サポートしたいさまざまなタイプのA/Vストリームについて、それ以上の検索を行う必要があるでしょう。

4
ewall

MP4Parserの使用 http://code.google.com/p/mp4parser/ 前のポスターで述べたように-期間を提供するサンプルもあります:

https://mp4parser.googlecode.com/svn/trunk/examples/src/main/Java/com/googlecode/mp4parser/GetDuration.Java

1

基本的にMP4構造はツリーです。マクロ領域は次のとおりです。

  • ftyp-ファイルタイプ
  • moov-メタデータ(曲のタイトル、autors、url、およびその他の情報)が含まれています
  • free-ヘッダーとデータを分離するための空の領域
  • mdat-オーディオフレームが含まれています

このフリーウェアMP4 Analyzerツールを試すことができます

http://www.thinmultimedia.co.kr/products/MP4Reader_download.html

1

映画の長さは、映画のヘッダーmvhdにあります。秒単位の期間は、mvhdの2つのフィールドから導出されます。

  • 4バイトの時間スケール
  • 4バイトの持続時間

@Tom Britoが投稿した仕様の380行目と382行目です。

そのため、タイムスケール「ts」と期間「dur」を与えますDuration in seconds = dur / ts

0
Peter Tran