视频基础元数据读取
能读什么
ZenConverter 用 Android 系统 API MediaMetadataRetriever 读取视频的基础元数据:
| 字段 | 说明 | 来源 |
|---|---|---|
| 时长 | 视频总时长(毫秒) | MediaMetadataRetriever.METADATA_KEY_DURATION |
| 分辨率 | 宽 × 高 | METADATA_KEY_VIDEO_WIDTH / HEIGHT |
| 容器码率 | 视频流的码率(bits/s) | MediaMetadataRetriever 直接暴露(API 31+) |
| 帧率 | 视频流的帧率 | MediaMetadataRetriever 直接暴露 |
这些字段覆盖了"我想知道这个视频有多长、多大、分辨率多少"的最常见需求。
为什么只看不写
视频元数据清理明确不做,原因有三层:
1. 格式多样性太高
视频容器格式远比图片多:MP4/MKV/MOV/WEBM/AVI/3GP/TS/MTS/……每种格式的元数据结构完全不同,处理每种格式的元数据写回都是独立工程量。
2. 写回风险太大
视频元数据嵌在容器内部的各种 box/chunk 里,修改一个值可能需要:
- 更新该 box 的 size 字段;
- 重建交叉引用(offset table);
- 验证所有 box 的完整性;
- 不破坏视频帧和音频帧的数据位置。
一次写错 = 整个视频容器损坏 = 视频打不开。风险远大于收益。
3. 和图片的对比
图片(JPG)的元数据(APP1 段)可以直接删掉(见 JPG EXIF 擦除页面),因为删除不影响像素数据的位置。但视频的元数据 box 经常在容器中间位置,删掉它后面所有内容的 offset 都要更新——工程量不是一个量级。
如果你需要清理视频元数据
有两条可行路线:
- 转码时过滤元数据:用 ZenConverter 的视频互转路线重新编码输出——输出视频只包含新编码生成的元数据,源视频的拍摄时间、GPS、相机信息等元数据不会被自动拷贝(视频互转路线是重新编码,不是 stream copy);
- 桌面端 ffmpeg:
ffmpeg -i input.mp4 -map_metadata -c copy output.mp4可以在桌面端清除元数据(stream copy 不改像素,只清除容器元数据)。
路线 1 虽然会有损(重新编码),但能彻底去掉不需要的元数据,是 ZenConverter 生态里唯一可行的办法。
和视频互转的关系
ZenConverter 的视频互转路线(MP4 → MP4 等)本身就是重新编码,输出视频不携带源视频的原始元数据。这意味着:
- 如果你对元数据有顾虑,直接用 ZenConverter 视频互转路线重新编码一遍(哪怕转相同格式),输出文件就是干净的;
- 这不是 ZenConverter "故意擦除元数据",而是重新编码的副作用——重新编码生成了一个新的文件,源容器的元数据本来就不会自动拷贝。
使用场景
| 场景 | 推荐 |
|---|---|
| 想知道手机拍的视频有多长、分辨率多少 | 隐私工具 → 查看视频元数据 |
| 想把视频发出去但不泄露拍摄时间 | 视频互转 → 选相同格式重新编码 → 输出干净视频 |
相关页面
- JPG 原地 EXIF 擦除与备份恢复 —— 图片能擦,视频不能擦,对比有意思
- HEIC/HEIF 元数据查看 —— HEIC 也是只看不写
- 视频格式互转原理 —— 重新编码本身就去掉了旧元数据
