Mp4 文件(以及许多其他文件)使用MPEG-4 http://en.wikipedia.org/wiki/MPEG-4标准,它将内部的数据排列在称为原子的小盒子中。你可以在这找到关于原子的精彩描述Page http://atomicparsley.sourceforge.net/mpeg-4files.html。简而言之,原子被组织成树状结构,其中一个原子可以是其他原子的父级,也可以是数据的容器,但不能同时是两者(尽管有些人打破了这个规则)
特别是您正在寻找的原子称为“tkhd”(轨道头)。你可以找到原子列表here http://www.mp4ra.org/atoms.html.
在这个原子中,您将找到视频的元数据。指定了“tkhd”原子的结构here http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-SW1
最后,您需要的元数据块(不是原子)称为“矩阵结构”。从开发者.apple.com http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737:
矩阵中的所有值都是 32 位定点数,除以
16.16,但 {u, v, w} 列除外,该列包含除以 2.30 的 32 位定点数。
如下图所示:
9 字节矩阵从“tkhd”原子的字节 48 开始。 0° 方向的“矩阵结构”示例为 1 0 0 0 1 0 0 0 1(单位矩阵)
SO!
毕竟,你需要修改这个矩阵。下一段摘自开发者.apple.com http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737:
变换矩阵定义如何从一个坐标映射点
空间到另一个坐标空间。通过修改a的内容
变换矩阵,可以进行多种标准图形的变换
显示操作,包括平移、旋转和缩放。这
描述了用于完成二维变换的矩阵
数学上由 3×3 矩阵表示。
这意味着变换矩阵定义了一个函数,将每个坐标映射到一个新坐标。
由于您只需要旋转图像,因此只需修改最左边的 2 x 3 矩阵,该矩阵由字节 0、1、3、4、6 和 7 定义。
以下是我用来表示每个方向的 2 x 3 矩阵(3x3 矩阵的值 0、1、3、4、6 和 7):
0°:(x', y') = (x, y)
1 0
0 1
0 0
90°:(x', y') = (高度 - y, x)
0 1
-1 0
高度 0
180°:(x', y') = (宽度 - x, 高度 - y)
-1 0
0 -1
宽度高度
270°:(x', y') = (y, 宽度 - x)
0 -1
1 0
0 width
如果没有,宽度和高度可以在矩阵结构之后获得。它们也是 4 字节的定点数 (16.16)。
您的视频元数据很可能包含 90° 矩阵
(感谢菲尔·哈维,创造者Exiftool http://www.sno.phy.queensu.ca/~phil/exiftool/感谢他的帮助和出色的软件)