【求解】OPPO的Live Photo是如何实现jpg存储视频信息的

问题不大 2024-11-08 16:40 1

佬友们,请问有没有了解OPPO的Live Photo是怎么实现的?或者说OPPO是通过什么来保存Live Photo的视频信息的?

需求: 探讨通过immich实现Live Photo在iOS和Android之间互通的可能性

背景:



  • 最近主力机从iPhone转移到一加13,弄了个immich作为图片存储服务;

  • iPhone的Live Photo很明确就是图片+视频(HEIC+MOV)的形式,在immich server里也是这么体现的。

  • 可以使用《O+互联》将iPhone的Live Photo转移到一加,仍然是Live Photo,但是格式会变为jpg,jpg还能保存视频信息?

  • 一加的Live Photo竟然只有一张jpg图片?跟iPhone类似,从immich拉回一加的仍然是Live Photo(仅限由一加拍的Live Photo)




最新回复 (18)
  • zen 11-08 16:44
    1楼

    用 file 命令看看那个文件 实际上到底是什么

  • bigjb 11-08 16:46
    2楼

    图片隐写?看一下二级制

  • Douglas·Lee 11-08 16:48
    3楼

    本质上是谷歌的技术,去搜索一下MVIMG (Android JPG Motion Picture)


    基本上就是利用exif信息记录xml数据,其中关键信息是视频的偏移量(Micro Video Offset),根据这个数据读取字节,就能获得一段视频。


    存储结构类似于夹心饼干


    下面引用一些可以参考的资料:


    https://medium.com/android-news/working-with-motion-photos-da0aa49b50c

  • 问题不大 楼主 11-08 16:49
    4楼

    考虑过隐写,但我怀疑他们能用这种方式?等有空看看。我心思着隐写这不是之前搞ctf用的么

  • 问题不大 楼主 11-08 16:52
    5楼

    专业,学到了。谢谢佬,我去学习学习。

    那这么看来,如果Android不支持heic+mov的话,是不可能实现通过immich无缝实现双平台互通了

  • Douglas·Lee 11-08 16:56
    6楼

    BTW,如果你有需要的话,我之前写了个从这种照片中提取出视频的脚本


    #!/bin/bash
    set -e
    function extract {
    local file="$1"
    local newFile="${file/%.jpg/.mp4}"
    if [[ -f "$newFile" ]]; then
    echo "File $newFile exists, so ignoring$file"
    else
    local offset_hex=$(strings -t x "$file" | grep 'ftypmp42' | cut -d ' ' -f 1)
    local offset=$(( 16#$offset_hex ))
    if [[ -n "$offset" ]]; then
    offset=$(( offset - 4 ))
    dd if="$file" of="$newFile" bs=1 skip="$offset" 2>/dev/null
    else
    echo "Not processing $file because the string 'ftypmp42' did not occur exactly once in file"
    fi
    fi
    }
    for f in "$@"; do
    if [[ "$f" == MVIMG*jpg ]]; then
    extract "$f"
    else
    echo "Ignoring $f because its file name does not match MVIMG*jpg pattern"
    fi
    done
  • 问题不大 楼主 11-08 16:56
    7楼

    #快问快答添加

  • 问题不大 楼主 11-08 16:58
    8楼

    非常感谢 ^-^

  • bigjb 11-08 16:59
    9楼

    我怎么感觉这个就是图片隐写的一种应用啊

  • Douglas·Lee 11-08 17:01
    10楼

    如果Android不支持heic+mov的话,是不可能实现通过immich无缝实现双平台互通了



    关于iOS与安卓针对Live Photos互通一直是个难点,希望老哥研究有成果给大家通报下

  • Douglas·Lee 11-08 17:02
    11楼

    确实算是一种隐写

  • 问题不大 楼主 11-08 23:25
    12楼

    OPPO的解决方案应该是魔改了谷歌的那一套,EXIF信息里没有关键字,文件里也搜不到“ftypmp42”关键字,所以那个脚本行不通。

    不过在EXIF里有一些关键字段,等有时间的时候我再琢磨琢磨

  • Douglas·Lee 11-09 01:36
    13楼

    方便的话可以发一张原图我也测试一下嘛。

  • 问题不大 楼主 11-09 12:43
    14楼

    MD5 (IMG20241105200249.jpg) = 2ba27343db17d6b20c0c58db598d4061

    https://www.123865.com/s/wThDVv-iHnc3?提取码:NVgv

  • xico 11-09 15:56
    15楼

    看 EXIF 实在琢磨不出来偏移量,直接查文件标识就找到了。



  • 问题不大 楼主 11-09 16:25
    16楼

    cool!

    奇怪,我查的时候 我没搜到ftypmp42,shell脚本也没识别出来这个串,那看来还是MVIMG

  • 橘子Jun 12-09 21:09
    17楼

    其实就是Google的Motion Photo Format



    OPPO在这个基础上添加了点内容(谷歌拍出来的OPPO相册不识别,但是谷歌相册可以识别OPPO的)

    我搞了个网页版动态照片解析,可以试试看

  • 橘子Jun 09-25 21:13
    18楼

    域名到期了,如果还有需求的话可以使用 https://motion-photo-parser.netlify.app

* 帖子来源Linux.do
返回