我用三星Galaxy II录制了全高清视频,当我将其上传到YouTube时,我发现它变成了90度像肖像布局1080x1920而不是1920x1080。 我找到了问题的原因:
YouTube正在阅读视频元数据并根据Exif旋转视频 编码前的方向
这是ExifTool报告(请参阅最后一个标签“轮换”):
ExifTool Version Number : 8.61
File Name : video.mp4
Directory : .
File Size : 217 MB
File Modification Date/Time : 2011:08:11 00:47:23+04:00
File Permissions : rw-rw-rw-
File Type : 3GP
MIME Type : video/3gpp
Major Brand : 3GPP Media (.3GP) Release 4
Minor Version : 0.3.0
Compatible Brands : 3gp4, 3gp6
Movie Data Size : 227471371
Movie Header Version : 0
Create Date : 1900:01:00 00:00:00
Modify Date : 1900:01:00 00:00:00
Time Scale : 1000
Duration : 0:01:46
Preferred Rate : 1
Preferred Volume : 100.00%
Preview Time : 0 s
Preview Duration : 0 s
Poster Time : 0 s
Selection Time : 0 s
Selection Duration : 0 s
Current Time : 0 s
Next Track ID : 3
Track Header Version : 0
Track Create Date : 1900:01:00 00:00:00
Track Modify Date : 1900:01:00 00:00:00
Track ID : 1
Track Duration : 0:01:46
Track Layer : 0
Track Volume : 0.00%
Image Width : 1920
Image Height : 1080
Graphics Mode : srcCopy
Op Color : 0 0 0
Compressor ID : avc1
Source Image Width : 1920
Source Image Height : 1080
X Resolution : 72
Y Resolution : 72
Bit Depth : 24
Video Frame Rate : 30.023
Matrix Structure : 1 0 0 0 1 0 0 0 1
Media Header Version : 0
Media Create Date : 1900:01:00 00:00:00
Media Modify Date : 1900:01:00 00:00:00
Media Time Scale : 16000
Media Duration : 0:01:46
Handler Type : Audio Track
Handler Description : SoundHandler
Balance : 0
Audio Format : mp4a
Audio Channels : 1
Audio Bits Per Sample : 16
Audio Sample Rate : 16000
Play Mode : SEQ_PLAY
Avg Bitrate : 17.1 Mbps
Image Size : 1920x1080
Rotation : 90
如何删除整个Exif数据或只编辑Rotation属性?
答案 0 :(得分:41)
Mp4文件(以及许多其他文件)使用MPEG-4标准,该标准将数据排列在名为atoms的小框中。你可以在这个Page找到很好的原子描述。简而言之,原子被组织成树状结构,其中原子可以是其他原子的母体或数据的容器,但不是两者(尽管有些人违反了这个规则)
特别是你要寻找的原子叫做“tkhd”(Track Header)。您可以找到原子列表here。
在此原子中,您将找到视频的元数据。 “tkhd”原子的结构指定为here
最后,您需要的元数据块(不是原子)称为“矩阵结构”。来自developer.apple.com:
矩阵中的所有值都是32位定点数除以 16.16,除了{u,v,w}列,其中包含32位定点数,除以2.30。
如下图所示:
9字节矩阵从“tkhd”原子的字节48开始。方向为0°的“矩阵结构”的示例将是1 0 0 0 1 0 0 0 1(单位矩阵)
SO!
毕竟,你需要的是修改这个矩阵。下一个段落取自developer.apple.com:
变换矩阵定义了如何从一个坐标映射点 空间进入另一个坐标空间。通过修改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')=(height - y,x)
0 1
-1 0
身高0
180°:(x',y')=(widht - x,height - y)
-1 0
0 -1
宽度高度
270°:(x',y')=(y,width - x)
0 -1
1 0
0宽度
如果没有它们,可以在矩阵结构之后获得宽度和高度。它们也是4字节(16.16)的定点数。
您的视频元数据很可能包含90°矩阵
(感谢Exiftool的创作者Phil Harvey的帮助和精彩的软件)
答案 1 :(得分:0)
在我的情况下,更改exif数据并没有解决问题,因为它实际上是正确的。问题是大多数玩家忽略它(即他们认为它是0)。
如果您想使用Rotation exif标签,可以通过MediaRecorder.setOrientationHint()进行控制。这比事后修改要容易得多。如果YouTube上传器尊重标签,那么这就是您所需要的。
但我找到的唯一解决方案是旋转视频本身,或使用UI提示引导用户以相机的自然0方向录制视频。
在Android中没有内置的旋转视频机制。