手机、相机拍摄的视频,mp5 文件一般都有元数据,包含了实际拍摄时间、GPS 位置信息。
如:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2021-10-20T09:11:25.000000Z
location : +31.4582+126.1096/
location-eng : +31.4582+126.1096/
com.android.version: 11
com.android.manufacturer: Xiaomi
com.android.model: Redmi K20 Pro
com.android.capture.fps: 60.000000
Duration: 00:00:02.17, start: 0.000000, bitrate: 4162 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 1920x1080, 2287 kb/s, SAR 1:1 DAR 16:9, 57.71 fps, 60 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time : 2021-10-20T09:11:25.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 98 kb/s (default)
Metadata:
creation_time : 2021-10-20T09:11:25.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]
可以看到,在视频容器元数据,记录了 location
、creation_time
,每个视频流的 Tag 也记录了 creation_time
这些信息在转码、剪辑的时候可能会丢失,丢失元数据,就很难再确定视频是什么时间拍摄的了。
因此,可以在 FFmpeg 转码时,显著表明复制元数据:
ffmpeg -i input.mp4 -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a out.mp4
解释下参数的意思:
-map_metadata 0
将第一个(索引从 0 开始)视频容器的元数据复制到输出-map_metadata:s:v 0:s:v
将第一个(索引从 0 开始)视频容器的视频流的元数据复制到输出的视频流-map_metadata:s:a 0:s:a
将第一个(索引从 0 开始)视频容器的音频流的元数据复制到输出的音频流
在实际操作中,也用不着这么多选项。只需要 -map_metadata 0
就可以了,Windows 系统、其它程序主要读取的是 mp4 的 creation_time
这个元数据,mp4 容器中的媒体流的元数据用处不大,所以只需要:
ffmpeg -i input.mp4 -map_metadata 0 out.mp4
即可。
如果要手动修改拍摄时间,就可以这样添加元数据:
ffmpeg -i input.mp4 -metadata creation_time="2021-02-26T03:59:10.000000Z" -c copy out.mp4
注意到上面的时间后缀是一个 Z
,这表示 UTC 时间,而不是当地时区时间。软件在读取时都会自动转换成相应的时区时间。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于