37

mp4 文件结构中的持续时间在哪里?

4

9 回答 9

16

这可能不是你的问题的答案,但它是我的:http: //mediainfo.sourceforge.net/

(它有一个库并且是开源的,所以你可以检查你需要的部分)

于 2010-06-25T05:18:43.717 回答
10

请参阅https://github.com/sannies/mp4parser项目。它是一个显示 mp4 文件结构的 Java 库。

于 2013-07-01T19:29:04.073 回答
7

对于 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;
}


在旁注中,我使用这些值来计算播放时间和 fps,如下所示:
    double fps = (videoSampleCount * timeScale) / (double) duration;
    double videoTime = ((double) duration / (double) timeScale);
videoSampleCount 变量来自“stsz”原子。

于 2010-09-03T22:29:27.560 回答
6

据我所知-“mp4”容器源自 QuickTime 原子结构。您可以阅读 QuickTime 文件格式的描述。

解析 quicktime 原子并不是什么大问题(查看atomicParsley 项目)。我不确定 MP4,但至于 MOV 文件 - 在“mvhd”(电影头)原子和“tkhd”(轨道头)原子中有一个“持续时间”字段。这个持续时间通常是帧数乘以“时间尺度”属性。时间尺度可以在相同的原子中找到。

于 2010-07-13T00:47:21.697 回答
3

MP4是一种“容器”格式,这基本上意味着它可以包含许多不同的音频或视频流。每个流都可以有自己的持续时间值......

为了挖掘出你需要的东西,你需要更多的参考文件。我可能会建议在这里这里查看……但您可能需要搜索您想要支持的不同类型的 A/V 流。

于 2010-06-24T21:27:36.160 回答
2

基本上 MP4 结构是一棵树。宏观领域是:

  • ftyp - 文件类型
  • moov - 包含元数据(歌曲标题、作者、网址和其他信息)
  • free - 用于分隔标题和数据的空白区域
  • mdat - 包含音频帧

你可以试试这个免费的 MP4 Analyzer 工具

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

于 2015-03-25T11:03:43.540 回答
2

电影的持续时间在电影标题 mvhd 中。以秒为单位的持续时间来自 mvhd 中的两个字段。

  • 4 字节时间刻度
  • 4 字节持续时间

这些是@Tom Brito 发布的规范中的第 380 和 382 行。

所以给定时间尺度'ts'和持续时间'dur' Duration in seconds = dur / ts

于 2015-07-11T00:49:41.940 回答
1

使用 MP4Parser http://code.google.com/p/mp4parser/之前的海报提到 - 他们甚至有一个提供持续时间的样本:

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

于 2013-11-06T02:34:42.193 回答
-1

可以使用媒体框查看器。它是 MP4 和 Quicktime 解析器。打开 Quicktime 文件时,可以看到原子结构。寻找视频描述原子。它的属性之一是持续时间。Media Box Viewer 可以从www.jdxsoftware.org下载。

于 2012-10-19T17:14:43.023 回答