Talk is Cheap

Show me Your Code

省流:按照以下步骤,从 tmap 中取出二进制元数据,之后解析。HEIF 和 AVIF 的容器格式是一样的,可以通用。

  1. 环境:准备 MP4Box
  2. 找到 tmap,并取出。
  3. 按 ISO 21496-1 解析。
# 1. 安装 MP4Box,用 brew 或其他包管理器
brew install gpac
# 2. 找到 `tmap`
MP4Box -info example.heic
# 3. 上一句的输出里,找到 `tmap` 的 ID
MP4Box -dump-item [ID] example.heic
# 4. 用 Python 或别的办法解析
uv run parse_binary_payload.py

这个脚本,可以从 GitHub 获得,需要在 main 中替换一下路径。

测试了以下几个例子:

  • iPhone 拍的 HEIC
  • iPhone 的 HDR HEIC 屏幕截图
  • libavif 制作的 AVIF Gainmap
  • Lightroom 导出的 AVIF Gainmap(导出时选最大兼容)

Show me Your Prompt

思路来自 ISO 21496-1 中 C.3 六连问的第四个:

(d) How is the gain map metadata binary payload stored?

意思就是不管什么格式的图像,都需要存储二进制的 gainmap metadata。

于是向 AI 提问如下(感觉放标准文件的原文不太好,请读者自行查找标准文件)。

[ISO 21496-1 的附录 C.2, C.3]

调研 HEIC,AVIF 这两种图像格式是如何存储 C.3 中所述的信息的。

与 AI 共舞

到这里,你已经看完了和标题有关系的部分,接下来是如何与 AI 协作的部分,随便记录一下说不定什么时候就会被淘汰掉的思路。

综述和搜索

如果你像我一样对 HEIF 和 AVIF 的内部结构几乎一无所知,第一步是让 AI 去搜集一下信息,充当以前搜索引擎的工作,这里用到了以下模型。

  • Gemini 3.1 Pro(网页对话)
  • Grok 4.2 Beta (API)
  • Qwen DeepResearch(网页对话)
  • GPT 5.4 Pro(网页对话)

这一步我习惯派出很多个 AI 去做,搜索结果更全一些,而且放着不用岂不是亏了。这几个模型里除了 Gemini 3.1 Pro 没什么多轮能力,主要利用其自身的世界知识,剩下几个都带有搜索和多步执行。Grok 的 API 似乎有问题,问个 Hello 扣了我 16w token 的钱,GPT 5.4 Pro 非常非常慢,回答的语气很令人讨厌,Qwen 主要是看搜索后的参考文献,不过太新的东西他一般搜不出什么。

方案制定

上面这些信息回来之后,就已经大致解决了,几个模型都返回了从 tmap 里找等类似的答案。把各种信息都丢给 Gemini,让它出了一个清单,如何一步步的解析出想要的东西,每一步执行什么终端命令等。

执行

方案定好之后,找个 Codex 等 CLI 类的,能执行命令的工具,把上一步的清单执行一下,理想情况下,就能获得最终结果了,这一步用的是 GLM-5。

在这里有个小插曲,tmap 里不光有二进制的元数据,除了哈苏实现的 HEIF 以外,别的都在最开头的地方有一个额外的版本号,占用一个字节,而且我给它的示例图片里的 gainmapmax 数值上等于 alt headroomgainmapmin 等于 base headroom,导致里面能解析出一些相同的数,GLM-5 没能意识到这两点,一直在尝试切片和不同的顺序来解码,等我发现的时候已经消耗了 300w token 了,早知道用个聪明点的模型。

审核与再次搜索

由于 GLM-5 上一步执行的不太成功,把它的一些输出又丢给别的模型进行第二轮搜索,这里用的是 Grok 4.2 beta(网页对话)。Grok 从 libheif 的一个 PR 里发现了这个额外的版本号字节问题。

整理代码

到这里就做完了,让 Copilot 整理了一下代码,多找几个测试图看看能不能顺利解析。用 Copilot 是因为他不要钱,而且最近砍掉了模型选择,只能用自动模型,所以基本只能干点这种杂活。

力大砖飞 大道至简

上面叽里咕噜说了一大堆,说不定下次有哪个能联网的 AI 产品被问到相似的问题时,就直接搜到这里来给出回答了。

从 Cloudflare 提供的数据来看,每天访问本博客的机器人远远多于人类,其中大部分都是各种大模型公司的爬虫,比搜索引擎的爬虫多十倍不止。

再畅想一下,再过个半年一年的,等把这些东西都塞进训练数据里,基础模型直接就能解决这样的问题了吧。