skies457
V2EX  ›  Android

vivo 手机会改动 motion photo 的元信息,导致 Google Photos 无法播放

  •  
  •   skies457 · 1 day ago · 1102 views

    背景:手持 vivo X200s 和大疆 pocket ,导出的 live photo 是按类苹果格式(一张 jpg 和一段 mp4 )保存的,Google Photos 无法识别,会分成图像和视频分别上传。于是就 vibe 了一个 app 将这个格式转成 Google 的 motion photo 格式(内嵌 mp4 的 jpg ),但这个格式不能在 vivo 自己的相册里播放(猜测可能是兼容性问题)。

    最近突然发现之前正常播放上传的 motion photo 在 Google Photos 里无法播放了,点开是一个转圈的 loading 图标,神奇的是在 vivo 相册里突然可以播放了,把文件丢 codex 里分析发现大概率是这些 motion photo 文件被塞了点私货导致 Google Photos 无法播放:

    Key evidence inside the attached file:
    - The MP4 ends with a 240-byte Vivo-specific uuid box containing:
      - vivoMediaExtInfo
      - com.vivo.gallery.file.convert: 10004
      - com.android.camera.livephoto
      - cameralbum!
    - The JPEG XMP now includes:
      - VCamera:VMotionPhotoVersion="1"
      - VCamera:VMediaKitVersion="1.0.0.8"
    

    所有 motion photo 在没有任何操作的情况下都被改了,难绷(

    4 replies    2026-08-24 02:07:47 +08:00
    qbqbqbqb
        1
    qbqbqbqb  
       12h 9m ago
    你可以用自己的 vivo 手机拍一张 live photo ,然后 vibe 分析一下元数据格式(私货成分+Google 原生动态照片成分),再尝试 vibe 出一个输出最简有效格式的 Vivo 动态照片的 app (一定要反复测试,去除所有冗余的字段和含义未知的字段值,避免造成兼容性干扰),理论上应该可以输出能让 Vivo 相册和 Google Photos 都能识别的动态照片。

    上述操作中使用 vivo 手机拍摄的样本的时候,需要排除其中的 HDR Gain Map ( Google UltraHDR + VIVO 私货)的干扰(让 AI 知悉 jpg 里除了内嵌 mp4 以外还内嵌了其它私货注意区分即可),可以另外 vibe 一个剥离 HDR Gain Map 只保留正常 jpg 部分的 app 。

    我自己就是按照以上思路让 AI 自己做了一个 Skill 来生成 OPPO 兼容的 live photo ,OPPO 自带相册+谷歌相册+国内社交软件都能识别。
    qbqbqbqb
        2
    qbqbqbqb  
       12h 7m ago
    另外你可以用你的手机在微博、小红书等社交平台上下载一个别人用苹果上传的 live photo (社交软件下载的时候会自己构造一个兼容你手机格式的 jpg ,私货比手机自己拍摄的少)。可以把这个样本一起给 AI 进行 vibe 分析+开发。
    qbqbqbqb
        3
    qbqbqbqb  
       11h 55m ago
    按理说 XMP 头里面 VCamera 开头的元数据应该不影响谷歌相册兼容性,因为我自己使用的 OPPO 手机的 Live photo 就是 XMP 头里有 GCamera (谷歌原生)+OpCamera (私货)的元数据,不影响谷歌相册播放。

    文件末尾 vivo 附加的 box 可能是影响因素( OPPO+谷歌兼容的 live photo 没有这部分)。

    另外可以再 Vibe 分析一下 Exif ,看一下里面是否有私货,有的字段比如 UserComment 可以包含一些能被手机相册识别的 feature flag ( bitmask )。
    skies457
        4
    skies457  
    OP
       4h 57m ago
    @qbqbqbqb 感谢大佬热心回复,分析了下 google photos 播放不了的原因可能是本地文件改动导致缓存(视频 offset ?)对不上,文件复制一份就可以正常播放了(下表 ID 1 )

    用 codex 生成的测试样例进行测试,目前看起来应该加上 vivo UUID 就可以在两边同时播放:

    | ID | Format difference | Google | Vivo |
    | -: | ------------------------------------------------------ | :----: | :--------------------: |
    | 1 | Full Vivo rewrite, including invalid secondary padding | ✓ | ✓ |
    | 2 | Standard Google XMP + Vivo UUID only | ✓ | ✓ |
    | 3 | Standard XMP + VCamera + Vivo UUID | ✗ | Recognized, won’t play |
    | 4 | Vivo XMP + UUID, secondary padding removed | ✓ | ✓ |
    | 5 | Standard XMP + VCamera, no UUID | ✗ | ✗ |
    | 6 | Vivo XMP, no UUID, no secondary padding | ✓ | ✗ |
    | 7 | Standard XMP + secondary padding only | ✗ | ✗ |
    | 8 | Vivo XMP, no UUID, with secondary padding | ✓ | ✗ |

    7 和 8 对比还挺有意思的,感觉 Google Photos 可能对 vivo 格式做了特殊兼容处理(
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1015 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    ♥ Do have faith in what you're doing.