我一直在用C#编写一个读取.mov文件的程序。我能够解析整个事情,忽略我不理解的块,并从我所做的块中获取相关信息。
我要做的是从文件中获取FPS,但获得它并不是直截了当的。我假设因为格式可以以不同的速率存储许多电影。
如果有人能指出我正确的方向,我应该看看哪些块(原子)?我以为它是stts,但并非所有.mov文件都包含那个块!
我误解了。 stts atom始终存在,这是您获取计算FPS的信息的地方。以下代码尚未经过全面测试,但它确实适用于我拥有的所有.mov文件。
void ReadSTTS(BinaryReader reader)
{
int versionAndFlags = reader.ReadInt32(true);
int nEntries = reader.ReadInt32(true);
int sampleCount = 0;
int sampleDuration = 0;
for (int i = 0; i < nEntries; i++)
{
sampleCount += reader.ReadInt32(true);
sampleDuration += reader.ReadInt32(true);
}
FPS = (float)Math.Round((float)mediaTimeScale / ((float)mediaDuration / (float)sampleCount), 2);
}
mediaTimeScale和mediaDuration都来自mvhd atom。 ReadInt32(true)是一个更改字节序的扩展,因为我正在Windows机器上读取.mov。