熟悉MP4数据结构的人有吗?

39

在文档中搜索持续时间。它可以是头部中的8字节(版本1)或4字节长度。 - Michael Todd
@MichaelTodd 我已经做了,文件中有很多时间长度。如果没有人知道答案,我会阅读整个文档以更好地理解。 - The Student
相关(这是关于Java的):https://dev59.com/BHA75IYBdhLWcg3w8-FJ - The Student
2
也许你可以查看 VLC/mplayer/插入开源MP4播放器名称的源代码,看看它是如何确定持续时间的? - terminus
@lepple mp4和avi的结构一样吗? - The Student
可能没有固定的地方。我不了解mp4,但对于mpeg 1和2(我也不是很了解),我认为您必须计算GOP(图片组)以及每个GOP中的帧数,然后根据帧速率进行计算。不过我可能错了。即使GOP的数量也没有存储,我想 - 您只需要扫描并查看(想象一下基于磁带的摄像机就可以理解为什么)。不过我很可能错了。 - user180247
9个回答

16

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

(它有一个库,而且是开源的,因此您可以只检查所需的部分)


我不再寻找这个答案了,但这可能是这里最好的答案。 - The Student
http://www.onlinemp4parser.com/ 提供的关于原子的详细信息比mediainfo更多。 - Alam

11

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

6
据我所知,“mp4”容器源自QuickTime原子结构。您可以阅读QuickTime文件格式的描述。
解析QuickTime原子并不是一件大事(看看atomicParsley项目)。至于MP4,我不确定,但对于MOV文件-在“mvhd”(电影头)原子和“tkhd”(轨道头)原子中有一个“持续时间”字段。这个持续时间通常是帧数乘以“时间刻度”属性。 时间刻度可以在相同的原子中找到。

3

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

为了找到你需要的内容,你需要更多的参考文件。我建议在这里这里查看...但你可能还需要搜索其他不同类型的音/视频流。


2

电影的持续时间在电影头部的mvhd中。

秒为单位的持续时间是从mvhd中的两个字段派生出来的。

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

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

因此,给定时间刻度'ts'和持续时间'dur',有:

持续时间(秒)= dur / ts

2
基本上,MP4的结构是一个树形结构。宏区域包括:
  • ftyp-文件类型
  • moov-包含元数据(歌曲标题,作者,url和其他信息)
  • free-空白区域,用于分隔头部和数据
  • mdat-包含音频帧
您可以尝试使用这个免费的MP4分析工具。

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


1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接