有谁熟悉mp4数据结构?

时间:2010-06-16 21:03:50

标签: data-structures video mp4

mp4 file structure中的持续时间是什么时候?

9 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:6)

对于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”原子。

答案 4 :(得分:4)

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

要挖掘出你需要的东西,你需要更多的参考文件。我可能会建议您查看herehere ...但您可能不得不在此之外搜索您想要支持的不同类型的A / V流。

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

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

您可以尝试使用此免费软件MP4分析工具

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

答案 7 :(得分:0)

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

  • 4字节时标
  • 4字节持续时间

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

所以给定时间刻度'ts'和持续时间'dur' $scope.getTitle = function(direction) { if (direction==="positive") { return "Increase"; } else if (direction==="negative") { return "Decrease"; } };

答案 8 :(得分:-1)

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