Skip to content

研究探索 iPhone 实况照片 HEIC 与安卓实况图片的底层实现差异

最近在处理媒体文件导出和相册迁移时,顺便研究了一下手机里的实况照片(Live Photos / Motion Photos)。原本以为各大厂商的实现原理大同小异,无非就是把视频数据嵌入到图片文件里,但翻看底层文件结构后才发现,iOS 和安卓的思路完全不同。


1. 安卓实况图片:JPEG 内嵌视频文件

在安卓阵营(例如 Google Pixel 的 Motion Photo、三星、小米、OPPO、vivo 等),绝大多数厂商的实现逻辑都是单文件嵌入

JPEG 格式本身就具有很高的扩展性,允许在文件尾部或者 EXIF/XMP 标记块中写入自定义二进制数据。安卓厂商正是利用了这一点:

  • 文件本身是一个合法的 .jpg 图片,任何普通图片查看器都能正常打开它并显示主图。
  • 视频数据(通常是一段 short MP4)被直接拼接在 JPEG 文件的末尾(EOF 之后)。
  • 在 JPEG 的 XMP 元数据中,会写入诸如 MicroVideoOffsetMotionPhotoPresentationTimestamp 等标记,告诉相册播放器:“从文件倒数第 X 个字节开始,是一段独立的 MP4 视频”。

这种做法的优点很明显:对外表现为单个 .jpg 文件,发给不支持实况照片的平台时,对方接收到的就是一张标准图片,不会多出一堆散落的文件。但缺点是文件体积会变大,而且在某些会将图片进行压缩或抹除 Exif 信息的分享管道里,尾部的视频数据很容易被裁剪掉。


2. iPhone 实况照片:并不是内嵌,而是 2 个文件“假装”成 1 个文件

最开始我也以为 iOS 的 HEIC 也会像安卓那样把 MOV 视频内嵌到 HEIC 文件内部。但实际上,从 iOS 的设计来看完全不是这样。

在 iPhone 的系统相册里,实况照片看起来就像是一张单独的动态图片,用户长按就能播放声音和动画。但如果你把照片导出到电脑或者使用命令行查看底层文件系统,就会发现 iOS 的实况照片本质上是两个独立的文件组合,系统相册假装它们是一个文件

  1. 静态主图:一个标准的 IMG_XXXX.HEIC(或早期 JPEG 格式)文件,包含高分辨率的核心静态帧。
  2. 视频文件:一个独立的 IMG_XXXX.MOV 文件,包含拍摄前后约 1.5 秒的视频及声音。

这两个文件是如何关联起来的?

苹果在 HEIC 文件和 MOV 视频文件的内部元数据中,都写入了一个全局唯一的 Content Identifier (Asset ID)。当 iOS 相册扫描到文件夹里有一个 .HEIC 和一个 .MOV 具有相同的 Asset ID 时,就会自动把它们缝合,在 UI 上展现为一张完整的 Live Photo。

所以,HEIC 自身并没有内嵌视频,它是靠 HEIC + MOV 这两个文件相互配合,才最终呈现出兼具静态高清帧、动态动画与声音的实况照片。


3. 实际体验对比:苹果依然保持领先

拿到了底层原理之后,再回头看实际使用体验,不得不说苹果的 Live Photos 目前依然一骑绝尘,体验明显超越安卓和鸿蒙阵营:

  • 防抖与流畅度:iOS 的 Live Photo 在按下快门的瞬间,前后视频帧的对焦过渡、手抖补偿极其平滑,播放时几乎没有顿挫感。
  • 色彩与帧画质一致性:在很多安卓机型上,按住播放动态照片时,画面经常会出现明显的色彩跳变、白平衡突变或降噪算法失效导致的噪点暴增;而 iOS 的 HEIC 主图与 MOV 视频帧在色彩调校上保持了高度一致,从静态到动态的过渡几乎无缝。
  • 静态帧的抽取(封面选择):在 iOS 相册里自由拖动挑选“主要照片”(封面帧)时,系统不仅能顺滑切帧,还会实时对选中的视频帧进行超分辨率处理和画质增强,抽出来的静态图质量依然非常高。

虽然安卓的单文件封装在跨平台传输时有其便利之处,但在相册的综合沉浸感、画面防抖以及静态帧抽取的细节处理上,iPhone 的实况照片依然有着非常明显的优势。