【问题标题】:How to remove or edit Exif from mp4 video?如何从 mp4 视频中删除或编辑 Exif?
【发布时间】:2011-10-24 21:47:36
【问题描述】:

我用三星 Galaxy II 录制了一个全高清视频,当我将它上传到 YouTube 时,我发现它变成了 90 度,就像纵向布局 1080x1920 而不是 1920x1080。 我找到了问题的原因:

YouTube 正在读取视频元数据并根据 Exif 旋转视频 编码前的方向

这是 ExifTool 报告(请参阅最后一个标签“Rotation”):

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 属性?

【问题讨论】:

    标签: youtube orientation quicktime mp4 exif


    【解决方案1】:

    Mp4 文件(以及许多其他文件)使用MPEG-4 标准,该标准将其中的数据排列在称为原子的小盒子中。您可以在 Page 中找到对原子的详细描述。简而言之,原子以树状结构组织,其中一个原子可以是其他原子的父级,也可以是数据的容器,但不能同时是两者(尽管有些人违反了这个规则)

    特别是您正在寻找的原子称为“tkhd”(Track Header)。你可以找到原子列表here

    在这个原子中,您将找到视频的元数据。指定“tkhd”原子的结构here

    最后,您需要的元数据块(不是原子)称为“矩阵结构”。来自developer.apple.com

    矩阵中的所有值都是 32 位定点数,除以 16.16,除了 {u, v, w} 列,它包含除以 2.30 的 32 位定点数。

    如下图所示:

    9 字节矩阵从“tkhd”原子的第 48 字节开始。 0° 方向的“矩阵结构”示例为 1 0 0 0 1 0 0 0 1(单位矩阵)

    所以!

    毕竟,您需要修改这个矩阵。下一段摘自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') = (高度 - 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 的帮助和出色的软件)

    【讨论】:

    • 修复一些错误:旋转矩阵由字节0、1、3、4定义。我刚学了一些用hexdump的3gp文件,宽度和高度可能没用。
    • @twinsant 您需要字节 6 和 7 来指定旋转功能。例如 180°: (x', y') = (widht - x, height - y) 对于坐标 (0, 0) (top-left) 将被移动到 (width, height) (bottom, right)跨度>
    • 这很好,但是一些示例代码会很有帮助!有人吗?
    • 有什么 Linux 软件可以编辑视频的这些属性吗?
    • 这个答案提供了很好的理论背景。有关实用的解决方案,请参阅stackoverflow.com/a/31573690/5069869
    【解决方案2】:

    就我而言,更改 exif 数据并没有解决问题,因为它实际上是正确的。问题是大多数玩家忽略了它(即他们认为它是 0)。

    如果您确实想使用 Rotation exif 标签进行播放,您可以通过 MediaRecorder.setOrientationHint() 来控制它。这比事后修改要容易得多。如果 YouTube 上传者尊重该标签,那么这就是您所需要的。

    但我找到的唯一解决方案是旋转视频本身,或者使用 UI 提示引导用户以相机的自然 0 方向录制视频。

    Android 中没有用于旋转视频的内置机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-08
      • 2020-11-16
      • 2014-06-15
      • 2012-04-30
      • 1970-01-01
      • 2014-01-10
      • 2021-08-06
      • 1970-01-01
      相关资源
      最近更新 更多