逆向(iOS):压缩和解压live图(.livp)——百度一刻相册+百度网盘识别支持
市面上首篇把静态图+mov短视频打包回live图的方案, 不需要iPhone参与 。
逆向(iOS):压缩和解压live图(.livp)——百度一刻相册+百度网盘识别支持
重磅原创!
背景
iPhone拍照的live图实际上是一个静态图+一个短视频,如果你把它导入电脑会得到一个文件夹(里面为xx.heic静态图+xx.mov短视频),如果你把它导入网盘或照片同步工具(如一刻相册)则会得到一个.livp格式的文件(其实是xx.heic静态图和xx.mov短视频的zip)。
截至今日市面上有大量的 live图/.livp文件 解压或转静态图的方案,但未能找到任何关于如何把 .heic静态图+.mov短视频 压缩/打包 回软件可以识别的live图的方案(直接压缩为zip的话网盘/第三方相册识别不了的)。现有的生成live图的方案均需iOS参与,实际上是调用了iOS系统接口存了静态图和动态视频到相册中,无法独立于iPhone相册备份和分享。
经过两个下午的研究,终于找到了稳定的可以把 静态图+短视频 打包回 百度网盘和一刻相册可以直接识别的(.livp格式)live图的方案。
livp文件组成介绍
首先需要明确的是,.livp文件的得到方式是 xx.heic静态图+xx.mov短视频 这两个文件直接压缩为.zip压缩包,然后修改后缀.zip为.livp。
关于网盘/第三方相册能否识别的核心就在于压缩为.zip时候的具体压缩方式。具体的zip压缩需要满足以下几点:
- 不压缩(别扭吗?不别扭)。
zip命令添加参数-0代表只打包不做压缩,保持原始字节。 - 去掉额外的文件属性(eXclude extra file attributes)。
zip命令添加参数-X代表 不保存文件的Unix UID/GID等信息。 - 注释。还需要使用
-z参数给.zip文件添加形如0002000000300022175F0003002217BE003D8A51313030304C495650的注释(字符串类型),用来快速获取原始文件数据在zip文件中的位置信息。
至于注释是什么含义?注释一共有以下七部分组成:
1 | |
| 含义 | 举例 | |
|---|---|---|
| part1 | 静态图类型 | 0002代表heic 0005代表jepg |
| part2 | 30+静态图文件名长度 即静态文件起始偏移地址 |
如00000034 |
| part3 | 静态图字节数 | 如000A0B3C |
| part4 | 动态图类型 | mov、mp4均为0003 |
| part5 | part3 +(30+静态图文件名长度) +(30+动态图文件名长度) 即动态文件起始偏移地址 |
如000A0BA3 |
| part6 | 动态图字节数 | 如001BF0C7 |
| part7 | 1000LIVP的ASCII码 |
固定为313030304C495650 |
说明:
- part数值皆为16进制
- 有关文件名长度皆为30+文件名长度,其中的30是因为ZIP的
Local File Header固定是30字节 - part2:若为00000034,0x34等于十进制下的30+22,说明静态图文件名长度为22
- part5:若为000A0BA3,0x000A0BA3=0x000A0B3C+(30+len(静态图文件名))+(30+len(动态图文件名)),说明静态图文件名长度+动态图文件名长度=43。由part2可知静态图文件名长度为22,故可退出动态图文件名长度为21
- part3和part6的8位的字节数最大约$2^{4\times 8}$字节,说明静态文件和动态文件的最大大小约为4 GiB
- 关于静态图和动态图的文件类型,当前静态图仅支持jpeg和heic,动态图仅支持mov
软性规范:
前文中的说明是硬性规范,若不遵守则打包出来的.livp不可被识别。
在收集到的样本中,还都满足以下(若不遵守还可能能被正常识别的)约束:
- zip中Central Directory顺序为 静态图在#1、动态图在#2
- 静态图、动态图文件名(除后缀)相同,且为
xx.静态图类型。如123.JPG.jpeg+123.JGP.mov
所收集样本如下:
| 文件名 | zip comment | part1 | part2 | part3 | part4 | part5 | part6 | part7 | 静态图 | 动态视频 | 静态大小 | 视频大小 | Central Directory顺序 | 静态是否CD Entry #1 | part2文件名验证 | part3大小验证 | part5 offset验证 | part6大小验证 | part7 magic验证 | comment整体验证 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| byDouyinPinglun-1785162346395.zip | 00050000004C0000DEB700030000DF4E00119398313030304C495650 | 0005 | 76 | 57015 | 0003 | 57166 | 1151896 | 313030304C495650 | DB4381BF-ECF6-42C3-A127-5E12F1BD90C1.jpeg.jpeg | DB4381BF-ECF6-42C3-A127-5E12F1BD90C1.jpeg.mov | 57015 | 1151896 | 1:DB4381BF-ECF6-42C3-A127-5E12F1BD90C1.jpeg.jpeg 2:DB4381BF-ECF6-42C3-A127-5E12F1BD90C1.jpeg.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byDouyinPinglun-1785162619642.zip | 00050000004C0003380F0003000338A60044827C313030304C495650 | 0005 | 76 | 210959 | 0003 | 211110 | 4489852 | 313030304C495650 | 476EF0DD-D610-4565-B337-A414D3B446A0.jpeg.jpeg | 476EF0DD-D610-4565-B337-A414D3B446A0.jpeg.mov | 210959 | 4489852 | 1:476EF0DD-D610-4565-B337-A414D3B446A0.jpeg.jpeg 2:476EF0DD-D610-4565-B337-A414D3B446A0.jpeg.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byIPhoneAlbum-2026-06-18 164454.zip | 00020000003000197C18000300197C77003363B1313030304C495650 | 0002 | 48 | 1670168 | 0003 | 1670263 | 3367857 | 313030304C495650 | IMG_4791.HEIC.heic | IMG_4791.HEIC.mov | 1670168 | 3367857 | 1:IMG_4791.HEIC.heic 2:IMG_4791.HEIC.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byWeChat-1785161814000.zip | 0002000000500006754E0003000675ED0004E1A7313030304C495650 | 0002 | 80 | 423246 | 0003 | 423405 | 319911 | 313030304C495650 | 0c39bb34b965b43f4360177c35e63c_livephoto.HEIC.heic | 0c39bb34b965b43f4360177c35e63c_livephoto.HEIC.mov | 423246 | 319911 | 1:0c39bb34b965b43f4360177c35e63c_livephoto.HEIC.heic 2:0c39bb34b965b43f4360177c35e63c_livephoto.HEIC.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byWeibo-1785162196670.zip | 0005000000470002023E0003000202CB0049FE63313030304C495650 | 0005 | 71 | 131646 | 0003 | 131787 | 4849251 | 313030304C495650 | b240fc8f0bf3a4e9124eb274bfc27647.JPG.jpeg | b240fc8f0bf3a4e9124eb274bfc27647.JPG.mov | 131646 | 4849251 | 1:b240fc8f0bf3a4e9124eb274bfc27647.JPG.jpeg 2:b240fc8f0bf3a4e9124eb274bfc27647.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byWeibo-1785162215750.zip | 0005000000470001420E00030001429B0008DB69313030304C495650 | 0005 | 71 | 82446 | 0003 | 82587 | 580457 | 313030304C495650 | 513b1eb80638e900ee3c82c24b624ac2.JPG.jpeg | 513b1eb80638e900ee3c82c24b624ac2.JPG.mov | 82446 | 580457 | 1:513b1eb80638e900ee3c82c24b624ac2.JPG.jpeg 2:513b1eb80638e900ee3c82c24b624ac2.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byiOSLivpMakerA1785140204190.zip | 000200000032000095230003000095860003549D313030304C495650 | 0002 | 50 | 38179 | 0003 | 38278 | 218269 | 313030304C495650 | IMB_TVfDT6.HEIC.heic | IMB_TVfDT6.HEIC.mov | 38179 | 218269 | 1:IMB_TVfDT6.HEIC.heic 2:IMB_TVfDT6.HEIC.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| byiOSLivpMakerB1785140239500.zip | 000200000032000095230003000095860003549D313030304C495650 | 0002 | 50 | 38179 | 0003 | 38278 | 218269 | 313030304C495650 | IMB_TItMiu.HEIC.heic | IMB_TItMiu.HEIC.mov | 38179 | 218269 | 1:IMB_TItMiu.HEIC.heic 2:IMB_TItMiu.HEIC.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784822885314.zip | 00050000003400013DA8000300013E0F00290B76313030304C495650 | 0005 | 52 | 81320 | 0003 | 81423 | 2689910 | 313030304C495650 | 1784822885312.JPG.jpeg | 1784822885312.JPG.mov | 81320 | 2689910 | 1:1784822885312.JPG.jpeg 2:1784822885312.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784825599569.zip | 000500000034000282320003000282990026E509313030304C495650 | 0005 | 52 | 164402 | 0003 | 164505 | 2549001 | 313030304C495650 | 1784825599568.JPG.jpeg | 1784825599568.JPG.mov | 164402 | 2549001 | 1:1784825599568.JPG.jpeg 2:1784825599568.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826018626.zip | 000500000034000A0B3C0003000A0BA3001BF0C7313030304C495650 | 0005 | 52 | 658236 | 0003 | 658339 | 1831111 | 313030304C495650 | 1784826018625.JPG.jpeg | 1784826018625.JPG.mov | 658236 | 1831111 | 1:1784826018625.JPG.jpeg 2:1784826018625.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826025025.zip | 000500000034000154F2000300015559002AF65D313030304C495650 | 0005 | 52 | 87282 | 0003 | 87385 | 2815581 | 313030304C495650 | 1784826025024.JPG.jpeg | 1784826025024.JPG.mov | 87282 | 2815581 | 1:1784826025024.JPG.jpeg 2:1784826025024.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826240957.zip | 00050000003400019C03000300019C6A000A5C44313030304C495650 | 0005 | 52 | 105475 | 0003 | 105578 | 678980 | 313030304C495650 | 1784826240956.JPG.jpeg | 1784826240956.JPG.mov | 105475 | 678980 | 1:1784826240956.JPG.jpeg 2:1784826240956.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826455816.zip | 0005000000340000EFF400030000F05B00117DE0313030304C495650 | 0005 | 52 | 61428 | 0003 | 61531 | 1146336 | 313030304C495650 | 1784826455815.JPG.jpeg | 1784826455815.JPG.mov | 61428 | 1146336 | 1:1784826455815.JPG.jpeg 2:1784826455815.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826525504.zip | 0005000000340002CEB100030002CF1800404F27313030304C495650 | 0005 | 52 | 183985 | 0003 | 184088 | 4214567 | 313030304C495650 | 1784826525503.JPG.jpeg | 1784826525503.JPG.mov | 183985 | 4214567 | 1:1784826525503.JPG.jpeg 2:1784826525503.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826548924.zip | 0005000000340000CB3F00030000CBA6004394F4313030304C495650 | 0005 | 52 | 52031 | 0003 | 52134 | 4429044 | 313030304C495650 | 1784826548923.JPG.jpeg | 1784826548923.JPG.mov | 52031 | 4429044 | 1:1784826548923.JPG.jpeg 2:1784826548923.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826551937.zip | 0005000000340000D4B800030000D51F0024B200313030304C495650 | 0005 | 52 | 54456 | 0003 | 54559 | 2404864 | 313030304C495650 | 1784826551936.JPG.jpeg | 1784826551936.JPG.mov | 54456 | 2404864 | 1:1784826551936.JPG.jpeg 2:1784826551936.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826661272.zip | 00050000003400026F41000300026FA8002AB14F313030304C495650 | 0005 | 52 | 159553 | 0003 | 159656 | 2797903 | 313030304C495650 | 1784826661271.JPG.jpeg | 1784826661271.JPG.mov | 159553 | 2797903 | 1:1784826661271.JPG.jpeg 2:1784826661271.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826682972.zip | 0005000000340001A4BC00030001A5230043B766313030304C495650 | 0005 | 52 | 107708 | 0003 | 107811 | 4437862 | 313030304C495650 | 1784826682971.JPG.jpeg | 1784826682971.JPG.mov | 107708 | 4437862 | 1:1784826682971.JPG.jpeg 2:1784826682971.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1784826735475.zip | 000500000034000171880003000171EF0020E9EF313030304C495650 | 0005 | 52 | 94600 | 0003 | 94703 | 2157039 | 313030304C495650 | 1784826735474.JPG.jpeg | 1784826735474.JPG.mov | 94600 | 2157039 | 1:1784826735474.JPG.jpeg 2:1784826735474.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111017642.zip | 0005000000340000E80400030000E86B001BB639313030304C495650 | 0005 | 52 | 59396 | 0003 | 59499 | 1816121 | 313030304C495650 | 1785111017640.JPG.jpeg | 1785111017640.JPG.mov | 59396 | 1816121 | 1:1785111017640.JPG.jpeg 2:1785111017640.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111037676.zip | 0005000000340001B61D00030001B68400323B34313030304C495650 | 0005 | 52 | 112157 | 0003 | 112260 | 3291956 | 313030304C495650 | 1785111037674.JPG.jpeg | 1785111037674.JPG.mov | 112157 | 3291956 | 1:1785111037674.JPG.jpeg 2:1785111037674.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111049618.zip | 0005000000340002FA9F00030002FB06002DAE1B313030304C495650 | 0005 | 52 | 195231 | 0003 | 195334 | 2993691 | 313030304C495650 | 1785111049616.JPG.jpeg | 1785111049616.JPG.mov | 195231 | 2993691 | 1:1785111049616.JPG.jpeg 2:1785111049616.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111053035.zip | 0005000000340001B37000030001B3D7003D97C7313030304C495650 | 0005 | 52 | 111472 | 0003 | 111575 | 4036551 | 313030304C495650 | 1785111053034.JPG.jpeg | 1785111053034.JPG.mov | 111472 | 4036551 | 1:1785111053034.JPG.jpeg 2:1785111053034.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111299968.zip | 000500000034000511890003000511F0003DF3B6313030304C495650 | 0005 | 52 | 332169 | 0003 | 332272 | 4060086 | 313030304C495650 | 1785111299966.JPG.jpeg | 1785111299966.JPG.mov | 332169 | 4060086 | 1:1785111299966.JPG.jpeg 2:1785111299966.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111362419.zip | 000500000034000106000003000106670020D1E6313030304C495650 | 0005 | 52 | 67072 | 0003 | 67175 | 2150886 | 313030304C495650 | 1785111362417.JPG.jpeg | 1785111362417.JPG.mov | 67072 | 2150886 | 1:1785111362417.JPG.jpeg 2:1785111362417.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111370279.zip | 000500000034000177640003000177CB001B8306313030304C495650 | 0005 | 52 | 96100 | 0003 | 96203 | 1803014 | 313030304C495650 | 1785111370277.JPG.jpeg | 1785111370277.JPG.mov | 96100 | 1803014 | 1:1785111370277.JPG.jpeg 2:1785111370277.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111573040.zip | 000500000034000151EF000300015256001057C8313030304C495650 | 0005 | 52 | 86511 | 0003 | 86614 | 1071048 | 313030304C495650 | 1785111573038.JPG.jpeg | 1785111573038.JPG.mov | 86511 | 1071048 | 1:1785111573038.JPG.jpeg 2:1785111573038.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111584071.zip | 000500000034000177DC000300017843003F9CD5313030304C495650 | 0005 | 52 | 96220 | 0003 | 96323 | 4168917 | 313030304C495650 | 1785111584070.JPG.jpeg | 1785111584070.JPG.mov | 96220 | 4168917 | 1:1785111584070.JPG.jpeg 2:1785111584070.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111593304.zip | 0005000000340000FCB000030000FD1700251F38313030304C495650 | 0005 | 52 | 64688 | 0003 | 64791 | 2432824 | 313030304C495650 | 1785111593302.JPG.jpeg | 1785111593302.JPG.mov | 64688 | 2432824 | 1:1785111593302.JPG.jpeg 2:1785111593302.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111596758.zip | 00050000003400018D06000300018D6D001E17FD313030304C495650 | 0005 | 52 | 101638 | 0003 | 101741 | 1972221 | 313030304C495650 | 1785111596756.JPG.jpeg | 1785111596756.JPG.mov | 101638 | 1972221 | 1:1785111596756.JPG.jpeg 2:1785111596756.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111677659.zip | 000500000034000165530003000165BA001AAB93313030304C495650 | 0005 | 52 | 91475 | 0003 | 91578 | 1747859 | 313030304C495650 | 1785111677658.JPG.jpeg | 1785111677658.JPG.mov | 91475 | 1747859 | 1:1785111677658.JPG.jpeg 2:1785111677658.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111744347.zip | 000500000034000269960003000269FD00309257313030304C495650 | 0005 | 52 | 158102 | 0003 | 158205 | 3183191 | 313030304C495650 | 1785111744344.JPG.jpeg | 1785111744344.JPG.mov | 158102 | 3183191 | 1:1785111744344.JPG.jpeg 2:1785111744344.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111749921.zip | 00050000003400023E90000300023EF70033207B313030304C495650 | 0005 | 52 | 147088 | 0003 | 147191 | 3350651 | 313030304C495650 | 1785111749919.JPG.jpeg | 1785111749919.JPG.mov | 147088 | 3350651 | 1:1785111749919.JPG.jpeg 2:1785111749919.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785111935438.zip | 0005000000340003853800030003859F003AE8EB313030304C495650 | 0005 | 52 | 230712 | 0003 | 230815 | 3860715 | 313030304C495650 | 1785111935436.JPG.jpeg | 1785111935436.JPG.mov | 230712 | 3860715 | 1:1785111935436.JPG.jpeg 2:1785111935436.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112043181.zip | 00050000003400010A40000300010AA700216568313030304C495650 | 0005 | 52 | 68160 | 0003 | 68263 | 2188648 | 313030304C495650 | 1785112043179.JPG.jpeg | 1785112043179.JPG.mov | 68160 | 2188648 | 1:1785112043179.JPG.jpeg 2:1785112043179.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112047699.zip | 0005000000340001315F0003000131C6001B82B1313030304C495650 | 0005 | 52 | 78175 | 0003 | 78278 | 1802929 | 313030304C495650 | 1785112047697.JPG.jpeg | 1785112047697.JPG.mov | 78175 | 1802929 | 1:1785112047697.JPG.jpeg 2:1785112047697.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112087161.zip | 00050000003400046E43000300046EAA0035FBE3313030304C495650 | 0005 | 52 | 290371 | 0003 | 290474 | 3537891 | 313030304C495650 | 1785112087159.JPG.jpeg | 1785112087159.JPG.mov | 290371 | 3537891 | 1:1785112087159.JPG.jpeg 2:1785112087159.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112137552.zip | 00050000003400008BB2000300008C19000C3D77313030304C495650 | 0005 | 52 | 35762 | 0003 | 35865 | 802167 | 313030304C495650 | 1785112137550.JPG.jpeg | 1785112137550.JPG.mov | 35762 | 802167 | 1:1785112137550.JPG.jpeg 2:1785112137550.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112141114.zip | 0005000000340001F30400030001F36B002EB1C2313030304C495650 | 0005 | 52 | 127748 | 0003 | 127851 | 3060162 | 313030304C495650 | 1785112141112.JPG.jpeg | 1785112141112.JPG.mov | 127748 | 3060162 | 1:1785112141112.JPG.jpeg 2:1785112141112.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112153488.zip | 0005000000340002E11300030002E17A003BCB65313030304C495650 | 0005 | 52 | 188691 | 0003 | 188794 | 3918693 | 313030304C495650 | 1785112153486.JPG.jpeg | 1785112153486.JPG.mov | 188691 | 3918693 | 1:1785112153486.JPG.jpeg 2:1785112153486.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112251656.zip | 0005000000340002513400030002519B0027B47F313030304C495650 | 0005 | 52 | 151860 | 0003 | 151963 | 2602111 | 313030304C495650 | 1785112251654.JPG.jpeg | 1785112251654.JPG.mov | 151860 | 2602111 | 1:1785112251654.JPG.jpeg 2:1785112251654.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112256399.zip | 0005000000340001B6AA00030001B711001EC00D313030304C495650 | 0005 | 52 | 112298 | 0003 | 112401 | 2015245 | 313030304C495650 | 1785112256396.JPG.jpeg | 1785112256396.JPG.mov | 112298 | 2015245 | 1:1785112256396.JPG.jpeg 2:1785112256396.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112262047.zip | 000500000034000433F600030004345D000F4363313030304C495650 | 0005 | 52 | 275446 | 0003 | 275549 | 1000291 | 313030304C495650 | 1785112262045.JPG.jpeg | 1785112262045.JPG.mov | 275446 | 1000291 | 1:1785112262045.JPG.jpeg 2:1785112262045.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112523798.zip | 000500000034000445BA00030004462100343063313030304C495650 | 0005 | 52 | 279994 | 0003 | 280097 | 3420259 | 313030304C495650 | 1785112523797.JPG.jpeg | 1785112523797.JPG.mov | 279994 | 3420259 | 1:1785112523797.JPG.jpeg 2:1785112523797.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112535334.zip | 0005000000340001371700030001377E00222ABD313030304C495650 | 0005 | 52 | 79639 | 0003 | 79742 | 2239165 | 313030304C495650 | 1785112535332.JPG.jpeg | 1785112535332.JPG.mov | 79639 | 2239165 | 1:1785112535332.JPG.jpeg 2:1785112535332.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112544283.zip | 000500000034000114F1000300011558001B48FF313030304C495650 | 0005 | 52 | 70897 | 0003 | 71000 | 1788159 | 313030304C495650 | 1785112544281.JPG.jpeg | 1785112544281.JPG.mov | 70897 | 1788159 | 1:1785112544281.JPG.jpeg 2:1785112544281.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112718011.zip | 00050000003400028A03000300028A6A0016BD95313030304C495650 | 0005 | 52 | 166403 | 0003 | 166506 | 1490325 | 313030304C495650 | 1785112718009.JPG.jpeg | 1785112718009.JPG.mov | 166403 | 1490325 | 1:1785112718009.JPG.jpeg 2:1785112718009.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112817780.zip | 0005000000340005C3FB00030005C462003CCE1C313030304C495650 | 0005 | 52 | 377851 | 0003 | 377954 | 3984924 | 313030304C495650 | 1785112817778.JPG.jpeg | 1785112817778.JPG.mov | 377851 | 3984924 | 1:1785112817778.JPG.jpeg 2:1785112817778.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112877488.zip | 0005000000340003092300030003098A00270D80313030304C495650 | 0005 | 52 | 198947 | 0003 | 199050 | 2559360 | 313030304C495650 | 1785112877486.JPG.jpeg | 1785112877486.JPG.mov | 198947 | 2559360 | 1:1785112877486.JPG.jpeg 2:1785112877486.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112881541.zip | 0005000000340004335A0003000433C100345D30313030304C495650 | 0005 | 52 | 275290 | 0003 | 275393 | 3431728 | 313030304C495650 | 1785112881538.JPG.jpeg | 1785112881538.JPG.mov | 275290 | 3431728 | 1:1785112881538.JPG.jpeg 2:1785112881538.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112890568.zip | 000500000034000311A700030003120E0018E081313030304C495650 | 0005 | 52 | 201127 | 0003 | 201230 | 1630337 | 313030304C495650 | 1785112890566.JPG.jpeg | 1785112890566.JPG.mov | 201127 | 1630337 | 1:1785112890566.JPG.jpeg 2:1785112890566.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112937682.zip | 0005000000340004D5A900030004D610006FE812313030304C495650 | 0005 | 52 | 316841 | 0003 | 316944 | 7333906 | 313030304C495650 | 1785112937679.JPG.jpeg | 1785112937679.JPG.mov | 316841 | 7333906 | 1:1785112937679.JPG.jpeg 2:1785112937679.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112942839.zip | 0005000000340004B69E00030004B70500343BCA313030304C495650 | 0005 | 52 | 308894 | 0003 | 308997 | 3423178 | 313030304C495650 | 1785112942837.JPG.jpeg | 1785112942837.JPG.mov | 308894 | 3423178 | 1:1785112942837.JPG.jpeg 2:1785112942837.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
| 1785112957966.zip | 0005000000340003020600030003026D0028F833313030304C495650 | 0005 | 52 | 197126 | 0003 | 197229 | 2684979 | 313030304C495650 | 1785112957964.JPG.jpeg | 1785112957964.JPG.mov | 197126 | 2684979 | 1:1785112957964.JPG.jpeg 2:1785112957964.JPG.mov |
YES | PASS | PASS | PASS | PASS | PASS | PASS |
样本说明,TL;DR:
纯数字.zip的样本来自小红书,文件名以字母开头的样本来源见文件名描述。
样本统计脚本(将所有样本放到一个专门的文件夹下运行脚本可得到livp_analysis.md):
1 | |
静态图+动态图->live图脚本 (无需借助zip命令)
如果你有一个.jpg/.jpeg/.heic格式的静态图和一个.mov/.mp4格式的动态视频,则可以使用以下脚本将其打包为一个动态图。
脚本点我展开
1 | |
脚本使用方式:
1 | |
最新脚本请见Github@LetMeFly666/2livp
此脚本是通过研究仅存储的zip文件的格式,直接二进制手搓一个.livp文件出来。原理请见文章《Zip:手动生成仅存储的zip文件(以百度系iOS动态图.livp为例)》。
杂念
为何没有两图压为live图的方案?因为实际上.livp格式的live图本来就不是Apple公司官方定义的,只是大多互联网厂商为了适配苹果live图推出的不约而同的格式。
把相册中live图下载后解压缩比较容易,但是由于没有官方的压缩方案,所以压缩回去就比较困难了。
Mac/iOS系统上的live图方案(以及传输到Windows上)
iOS拍摄的live图如果想通过iCloud之外的方式同步到其他电脑/设备,主要有两个地方可以设置:
- 数据线传输时:
iPhone -> 设置(settings) -> 应用(Apps) -> 照片(photos) -> 最下面的“传输到Mac或PC”(Transfer to Mac or PC) -> 保留原片(Keep Originals) - AirDrop时:
分享 -> 选项(Options) -> 打开“所有照片数据”(All Photos Data)
这样分享一张照片会在电脑上得到一个文件夹。
将一个文件夹下所有的图片(甚至非图片文件)导出,能合成动态图则合成
将手机上一堆照片传输到电脑上后,会得到一个个如IMG_5526的文件夹。
将这些文件夹所在的文件夹路径记下来(如果在下载文件夹下则路径为~/Downloads),把以下脚本保存为lets_export_photos.py,运行python lets_export_photos.py 照片文件夹所在路径命令,即可在照片文件夹所在路径/_exported文件夹下找到一个个导出的照片文件,有的是静态图有的是live图,直接拖拽到百度网盘或一刻相册即可直接上传。
脚本默认会使用硬链接的方式导出图片(或文件),不会占用额外空间。
脚本点我展开
1 | |
最新脚本请见Github@LetMeFly666/2livp
特别说明:
你需要保证你系统上有python环境、zip命令。
上述脚本的执行过程中,例如目录结构为:
1
2
3
4
5
6
7
8
9
10Photos/
├── 1
│ └── 2
│ └── 某线上AI峰会电话.m4a
├── emptyFolder
├── IMG_5114
│ └── IMG_5114.PNG
└── IMG_5120
├── IMG_5120.HEIC
└── IMG_5120.MOV则执行
python lets_export_photos.py ~/Downloads/Photos将会生成:
1
2
3
4
5
6
7
8
9
10
11
12
13
14Photos/
├── _exported
│ ├── IMG_5114.PNG
│ ├── IMG_5120.livp
│ └── 某线上AI峰会电话.m4a
├── 1
│ └── 2
│ └── 某线上AI峰会电话.m4a
├── emptyFolder
├── IMG_5114
│ └── IMG_5114.PNG
└── IMG_5120
├── IMG_5120.HEIC
└── IMG_5120.MOV
The End
Github仓库:LetMeFly666/2livp
这个是原探究过程,TL;DR:
1 | |
这个是版本2(v1.1.0)的探究过程,TL;DR:
0002000000300022175F0003002217BE003D8A51313030304C495650
0002 00000030 0010B331 0003 0010B390 004208DB 313030304C495650
part1 part2 part3 part4 part5 part6 part7
- part1: 0002
- part2: 00000030
- part3: heic字节数(16进制)
- part4: 0003
- part5: part3+(30+静态图文件名长度)+(30+动态图文件名长度),目前来看其中静态图文件名长度必须是18
- part6: mov字节数(16进制)
- part7: 313030304C495650(ASCII含义为1000LIVP)
000500000034000A0B3C0003000A0BA3001BF0C7313030304C495650
0005 00000034 000A0B3C 0003 000A0BA3 001BF0C7 313030304C495650
part1 part2 part3 part4 part5 part6 part7
- part1: 之前的0002->现在的0005
- part2: 30+静态图文件名长度,30+len(‘1784826018625.JPG.jpeg’)=0x34,之前的30+18=0x30也符合
- part3: 静态图字节数(16进制) 658236=0x000A0B3C
- part4: 目前还是0003
- part5: part3+(30+静态图文件名长度)+(30+动态图文件名长度),0x000A0B3C+(30+len(‘1784826018625.JPG.jpeg’))+(30+len(‘1784826018625.JPG.mov’))=0x000A0BA3
- part6: mov字节数(16进制) 1831111=0x001BF0C7
- part7: 313030304C495650(ASCII含义为1000LIVP)
猜测0002-heic、0003-mov、0005-jpeg
感谢万能的小红书,让我收集到了47张实况图。
我收集了47张实况图(在当前文件夹下如1784822885314.zip、1784825599569.zip等共计47个.zip文件)
有没有办法写一个脚本统计:文件名、zipfile comment、zip里面静态图文件名、zip里面动态视频文件名;以及额外的:part1、静态图文件名、part4、动态视频文件名
这些字段?
并保存为markdown。
不对嗷,comment长这样,part含义如下:
0005 00000034 000A0B3C 0003 000A0BA3 001BF0C7 313030304C495650
part1 part2 part3 part4 part5 part6 part7
- part1: xxx
- part2: xxx
- part3: xxx
- part4: xxx
- part5: xxx
- part6: xxx
- part7: xxx
此外,你静态动态文件的判断再加个else吧,万一有文件不在你的枚举范围内
此外表格再加个字段,静态图是否总是Central directory entry #1
题外话:小红书保存的livp图片似乎都是时间戳(毫秒版).xxx
目前找到的抖音图文的live图下载下来都是视频,不是live图,只有评论区的才是
bytes.fromhex(‘313030304C495650’).decode(“ascii”)
‘1000LIVP’
请编写两个脚本,满足以下所有规范(硬性+软性)
脚本一:
打包一个静态图和一个动态图为.livp
脚本二:
导出一个文件夹下的所有图片:
当一个文件夹或子文件夹中存在且存在满足命名要求的静态图和动态的时,将其打包为.livp,不再导出原始两张图片;否则将原始文件导出(不论文件种类)。
导出文件夹默认为给定文件夹下新建一个_exported文件夹,如已经存在这个文件夹则新建一个暂不存在的_exported_random后缀文件夹,也可指定导出文件夹位置。所有文件直接在这个导出文件夹中,不再创建子文件夹。
如果将两个文件打包为了.livp,则直接写文件到对应位置;否则尽量将文件硬链接到对应位置。注意原始文件夹中可能存在子文件夹,导出时候若存在同名文件记得加上后缀。
脚本中写清楚使用说明。
一定满足上面所有要求、下面所有规范。
— 以下是规范 —
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源