在 macOS 命令行下,查看照片(图片)的拍摄时间、方向、分辨率等元数据,工程上结论非常明确:
首选工具:
exiftool
这是业界事实标准,准确、全面、可脚本化。
下面按推荐程度 + 实用性给你完整说明。
一、首选方案(强烈推荐):exiftool
1️⃣ 安装
brew install exiftool
2️⃣ 查看一张照片的完整信息
exiftool photo.jpg
你会看到非常全面的输出,包括:
- 拍摄时间
- 方向(Orientation)
- 分辨率
- 相机 / 手机型号
- GPS(如果有)
- EXIF / XMP / IPTC 信息
二、你关心的几个关键字段(重点)
1️⃣ 拍摄时间(最重要)
exiftool -DateTimeOriginal photo.jpg
常见字段含义:
| 字段 | 说明 |
|---|---|
DateTimeOriginal |
真实拍摄时间(最可靠) |
CreateDate |
创建时间 |
ModifyDate |
修改时间 |
👉 工程上优先用 DateTimeOriginal
2️⃣ 照片方向(是否需要旋转)
exiftool -Orientation photo.jpg
典型输出:
Orientation : Rotate 90 CW
常见取值:
| Orientation | 含义 |
|---|---|
| Horizontal (normal) | 正常 |
| Rotate 90 CW | 需要顺时针旋转 |
| Rotate 180 | 旋转 180° |
| Rotate 270 CW | 逆时针 90° |
3️⃣ 分辨率 / 尺寸
exiftool -ImageWidth -ImageHeight photo.jpg
输出示例:
Image Width : 4032
Image Height : 3024
4️⃣ 一次性输出你最关心的字段(推荐)
exiftool \-DateTimeOriginal \-Orientation \-ImageWidth \-ImageHeight \photo.jpg
三、批量查看(你很可能会用到)
1️⃣ 当前目录下所有 JPG / PNG
exiftool -DateTimeOriginal -Orientation -ImageWidth -ImageHeight *.jpg
2️⃣ 输出为“单行,便于脚本处理”
exiftool -s -s -s \-DateTimeOriginal \-Orientation \-ImageWidth \-ImageHeight \photo.jpg
输出:
2023:09:18 14:32:10
Rotate 90 CW
4032
3024
3️⃣ 输出为 CSV(工程化强烈推荐)
exiftool -csv \-FileName \-DateTimeOriginal \-Orientation \-ImageWidth \-ImageHeight \*.jpg
四、macOS 自带工具(不推荐做主方案)
⚠️ mdls(精度与字段不稳定)
mdls photo.jpg
- 依赖 Spotlight
- EXIF 字段不完整
- 不适合工程校验
⚠️ sips(只适合基础信息)
sips -g creation photo.jpg
sips -g pixelWidth -g pixelHeight photo.jpg
缺点:
- 拍摄时间经常拿不到
- 不支持完整 EXIF
五、如果你在做“工程级照片处理”,这些点要注意
结合你之前的使用场景(Android 端照片迁移 / 校验 / 同步),我给你几个关键建议:
✅ 拍摄时间优先级
DateTimeOriginal > CreateDate > 文件时间
✅ 方向一定要读 EXIF
- Android / iOS 拍照 大量依赖 Orientation
- 不读 Orientation,显示一定出问题
✅ Android 端字段对齐
| macOS / exiftool | Android |
|---|---|
| DateTimeOriginal | ExifInterface.TAG_DATETIME_ORIGINAL |
| Orientation | ExifInterface.TAG_ORIENTATION |
| ImageWidth | TAG_IMAGE_WIDTH |
| ImageHeight | TAG_IMAGE_LENGTH |
在 macOS 上,要精确获取视频时长到毫秒(ms)级别,结论很明确:
最准确、最通用、工程上可接受的方案是:
ffprobe(FFmpeg)
下面按准确性、可用性、工程实践给你完整说明。
一、首选方案(强烈推荐):ffprobe
1️⃣ 安装(只需一次)
brew install ffmpeg
2️⃣ 获取“精确到毫秒”的视频时长
ffprobe -v error \-show_entries format=duration \-of default=noprint_wrappers=1:nokey=1 \input.mp4
输出示例:
12.345678
单位:秒(浮点数)
3️⃣ 转换为毫秒(ms)
ffprobe -v error -show_entries format=duration \-of default=noprint_wrappers=1:nokey=1 \input.mp4 | awk '{ printf "%.0f\n", $1 * 1000 }'
输出示例:
12346
这是工程上最常用的写法。
二、为什么 ffprobe 是“准确”的?
它读取的是:
- 容器级 duration(不是估算)
- 时间基(time_base)
- 帧时间戳(PTS/DTS)
尤其适合:
- MP4 / MKV / MOV
- H.264 / H.265
- VFR(可变帧率)视频
准确度远高于 Finder / QuickTime / shell 内建工具
三、如果你要“逐帧级别”的极致准确(可选)
基于帧时间戳统计(极端严谨)
ffprobe -v error \-select_streams v:0 \-show_entries frame=pts_time \-of csv=p=0 \input.mp4 | tail -n 1
- 取最后一帧的
pts_time - 理论上是播放时间轴的真实终点
⚠️ 缺点:
- 慢
- 对超长视频不友好
四、其他工具对比(不推荐为主方案)
❌ mdls(macOS 自带)
mdls input.mp4 | grep kMDItemDurationSeconds
问题:
- 精度不稳定
- 常被四舍五入
- 不适合工程用途
⚠️ mediainfo
brew install mediainfo
mediainfo --Output=JSON input.mp4
- 精度还可以
- 但在某些 MP4 / fragmented MP4 上会有偏差
- 不如 ffprobe 权威
五、推荐你直接用的“工程级函数”
Bash 函数版(可直接放脚本)
video_duration_ms() {ffprobe -v error -show_entries format=duration \-of default=noprint_wrappers=1:nokey=1 "$1" \| awk '{ printf "%.0f\n", $1 * 1000 }'
}
使用:
video_duration_ms test.mp4
六、一句工程结论
在 macOS 命令行环境下,
ffprobe是唯一同时满足:
- ms 级精度
- 格式通用
- 行为稳定
- 工程可复现
的方案。
如果你接下来是要把这个结果用于 Android 端校验 / 视频同步 / 时间戳对齐 / 传输完整性判断,我也可以直接帮你对齐一套「mac → Android」一致的时间模型。