【问题标题】:Anyone familiar with mp4 data structure?有人熟悉mp4数据结构吗?
【发布时间】:2011-03-04 16:25:09
【问题描述】:

mp4 file structure 的持续时间在哪里?

【问题讨论】:

  • 在文档中搜索持续时间。标头中的长度为 8 字节(版本 1)或 4 字节。
  • @MichaelTodd 我做到了,文件中有很多持续时间。如果没有人知道答案,我会阅读整个文档以便更好地理解。
  • 也许你可以看看 VLC/mplayer/insert-open-source-mp4-player-name 源代码,看看它是如何计算持续时间的?
  • @lepple mp4和avi是同一个结构吗?

标签: data-structures video mp4


【解决方案1】:

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

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

【讨论】:

  • 我不再寻找这个,但这可能是这里最好的答案。
  • onlinemp4parser.com 提供了比 mediainfo 更多的原子细节
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    对于 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(比特流); 如果(版本 == 1){ creationTime = createDate(bitstream.readBytes(8)); 修改时间 = createDate(bitstream.readBytes(8)); timeScale = (int)bitstream.readBytes(4); 持续时间 = bitstream.readBytes(8); 已读 += 28; } 别的 { creationTime = createDate(bitstream.readBytes(4)); 修改时间 = createDate(bitstream.readBytes(4)); timeScale = (int)bitstream.readBytes(4); 持续时间 = bitstream.readBytes(4); 已读 += 16; } int qt_preferredRate = (int)bitstream.readBytes(4); int qt_preferredVolume = (int)bitstream.readBytes(2); bitstream.skipBytes(10); 长 qt_matrixA = bitstream.readBytes(4); 长 qt_matrixB = bitstream.readBytes(4); 长 qt_matrixU = bitstream.readBytes(4); 长 qt_matrixC = bitstream.readBytes(4); 长 qt_matrixD = bitstream.readBytes(4); 长 qt_matrixV = bitstream.readBytes(4); 长 qt_matrixX = bitstream.readBytes(4); 长 qt_matrixY = bitstream.readBytes(4); 长 qt_matrixW = bitstream.readBytes(4); 长 qt_previewTime = bitstream.readBytes(4); 长 qt_previewDuration = bitstream.readBytes(4); 长 qt_posterTime = bitstream.readBytes(4); 长 qt_selectionTime = bitstream.readBytes(4); 长 qt_selectionDuration = bitstream.readBytes(4); 长 qt_currentTime = bitstream.readBytes(4); 长 nextTrackID = bitstream.readBytes(4); 已阅读 += 80;
    返回已读;
    }
    在旁注中,我使用这些值来计算播放时间和 fps,如下所示:

        double fps = (videoSampleCount * timeScale) / (double) duration;
        double videoTime = ((double) duration / (double) timeScale);
    
    videoSampleCount 变量来自“stsz”原子。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            所以给定时间刻度“ts”和持续时间“dur” Duration in seconds = dur / ts

            【讨论】:

              【解决方案8】:

              使用 MP4Parser http://code.google.com/p/mp4parser/ 如之前的海报所述 - 他们甚至有一个提供持续时间的示例:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 2011-05-11
                  • 1970-01-01
                  • 2012-06-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-03-08
                  相关资源
                  最近更新 更多