创建: 2024-03-07 21:06
更新: 2024-03-09 14:50
https://scz.617.cn/windows/202403072106.txt目录:
☆ 多媒体文件元数据
1) MediaInfo
2) exiftool
3) iPhone录制的视频
4) 删除所有非必需的元数据
☆ 旋转视频
1) MPC
2) ffmpeg
3) ffplay
4) Rotation字段
4.1) exiftool
4.2) ffmpeg
4.2.1) -noautorotate
4.3) ffprobe
4.4) 重置Rotation字段
4.5) 非正交Rotation字段
4.6) 16进制编辑Rotation字段
☆ 小结
☆ 多媒体文件元数据
1) MediaInfo
参看
MediaInfo
https://mediaarea.net/en/MediaInfo
https://mediaarea.net/en/MediaInfo/Download/Windows
MediaInfo用于查看各种多媒体文件的元数据,官网现有24.01.1版,有中文语言包,不如20.08版小巧。
2) exiftool
exiftool也可查看多媒体文件的元数据
apt install libimage-exiftool-perl
exiftool some.mp4
3) iPhone录制的视频
用MediaInfo查看iPhone横屏录制的some.mp4,注意到
Encoded date : 2024-03-07 13:33:50 UTC
Tagged date : 2024-03-07 13:34:24 UTC
Writing library : Apple QuickTime
com.apple.photos.originating.signature : ...
Rotation : 270
有录制时间,有signature,我猜每部iPhone该值唯一,若确如此,就属于隐私信息,可用于取证,定位到人。Rotation有点意思,表示播放时顺时针旋转270度;不是所有播放器都认该字段,MPC不认,Windows Media Player、ffplay认。
4) 删除所有非必需的元数据
iPhone录制的some.mp4,其元数据中有个signature令人不安,这属于非必需的元数据,条件允许时宜删除所有非必需的元数据,比如:
exiftool -all= -overwrite_original some.mp4
☆ 旋转视频
1) MPC
MPC播放视频时,可进行各种旋转、翻转
查看->全景扫描->顺时针旋转90度 // clockwise
逆时针旋转90度 // anti-clockwise or counter-clockwise
垂直翻转 // flip vertically
镜像翻转 // flip horizontally
2) ffmpeg
假设测试用例是orig.mp4
ffmpeg -v quiet -i orig.mp4 -vf "transpose=0" -c:a copy transpose_0.mp4
ffmpeg -v quiet -i orig.mp4 -vf "transpose=1" -c:a copy transpose_1.mp4
ffmpeg -v quiet -i orig.mp4 -vf "transpose=clock" -c:a copy transpose_clock.mp4
ffmpeg -v quiet -i orig.mp4 -vf "transpose=2" -c:a copy transpose_2.mp4
ffmpeg -v quiet -i orig.mp4 -vf "transpose=3" -c:a copy transpose_3.mp4
ffmpeg -v quiet -i orig.mp4 -vf "transpose=1,transpose=1" -c:a copy transpose_1_1.mp4
ffmpeg -v quiet -i orig.mp4 -vf "rotate=PI:bilinear=0" -c:a copy rotate_180.mp4
ffmpeg -v quiet -i orig.mp4 -vf "rotate=45*(PI/180)" -c:a copy rotate_45.mp4
ffmpeg -v quiet -i orig.mp4 -vf "rotate=-45*(PI/180)" -c:a copy rotate_neg_45.mp4
ffmpeg -v quiet -i orig.mp4 -vf "rotate=90*(PI/180):bilinear=0" -c:a copy rotate_90_cut.mp4
ffmpeg -v quiet -i orig.mp4 -vf "rotate=90*(PI/180):bilinear=0:oh=iw:ow=ih" -c:a copy rotate_90.mp4
ffmpeg -v quiet -i orig.mp4 -vf "hflip" -c:a copy hflip.mp4
ffmpeg -v quiet -i orig.mp4 -vf "vflip" -c:a copy vflip.mp4
ffmpeg -v quiet -i orig.mp4 -vf "hflip,vflip" -c:a copy hflip_vflip.mp4
transpose参数:
0 cclock_flip
逆时针旋转90度+垂直翻转
1 clock
顺时针旋转90度
2 cclock
逆时针旋转90度
3 clock_flip
顺时针旋转90度+垂直翻转
transpose=1,transpose=1
顺时针旋转180度
已不推荐transpose参数用数值,建议使用符号,比如将0换成cclock_flip
rotate=PI:bilinear=0
顺时针旋转180度,视觉效果同"transpose=1,transpose=1"
rotate=45*(PI/180)
顺时针旋转45度
rotate=-45*(PI/180)
逆时针旋转45度,rotate支持负数
rotate=90*(PI/180):bilinear=0:oh=iw:ow=ih
顺时针旋转90度,不切割图像,以原窗口长宽进行旋转
使用rotate参数时,缺省情况下会切割图像,若想以原窗口长宽进行旋转,需增加参数,对比如下两条命令的输出结果:
ffmpeg -v quiet -i orig.mp4 -vf "rotate=90*(PI/180):bilinear=0" -c:a copy rotate_90_cut.mp4
ffmpeg -v quiet -i orig.mp4 -vf "rotate=90*(PI/180):bilinear=0:oh=iw:ow=ih" -c:a copy rotate_90.mp4
hflip
镜像翻转 或 水平翻转
vflip
垂直翻转
hflip,vflip
水平翻转+垂直翻转,相当于顺时针旋转180度
3) ffplay
ffplay也有MPC播放时旋转的功能
ffplay -v quiet -i orig.mp4 -vf "rotate=45*(PI/180)"
ffplay -v quiet -i orig.mp4 -vf "rotate=90*(PI/180):bilinear=0:oh=iw:ow=ih"
ffplay -v quiet -i orig.mp4 -vf "hflip,vflip"
4) Rotation字段
4.1) exiftool
exiftool可设置Rotation字段
cp orig.mp4 orig_rotation_90.mp4
exiftool -q -rotation=90 -overwrite_original orig_rotation_90.mp4
用ffplay测试播放效果,已顺时针旋转90度
ffplay -v quiet -i orig_rotation_90.mp4
4.2) ffmpeg
ffmpeg可设置Rotation字段
ffmpeg -v quiet -display_rotation -90 -i orig.mp4 -codec copy orig_rotation_90.mp4
ffmpeg -v quiet -display_rotation 90 -i orig.mp4 -codec copy orig_rotation_270.mp4
ffmpeg的"-display_rotation 90"实际设置-90,或者说270;"-display_rotation -90"实际设置90,这会带来困扰。
4.2.1) -noautorotate
ffmpeg旋转时有个特性,会在Rotation字段基础上旋转,假设起始位置就是Rotation字段所示位置,输出结果则会重置Rotation字段(清零)。这给不了解此特性的人带来困扰。相比之下,"-display_rotation"时无此叠加效应,直接取负后设置。
可给ffmpeg指定"-noautorotate"参数禁用前述行为,即不理会Rotation字段当前值,视其为0的情况下进行实际旋转,但输出结果保留Rotation字段原值。
4.3) ffprobe
ffprobe也可查看Rotation字段,但与ffmpeg一样易带来困扰;将它显示的值取负才是实际值。
$ ffprobe -v quiet orig_rotation_90.mp4 -show_streams | grep rotation
rotation=-90$ ffprobe -v quiet orig_rotation_270.mp4 -show_streams | grep rotation
rotation=90
4.4) 重置Rotation字段
用exiftool重置Rotation
cp orig_rotation_90.mp4 orig_rotation_90_del_rotation.mp4
exiftool -q -rotation=0 -overwrite_original orig_rotation_90_del_rotation.mp4
用ffmpeg重置Rotation
ffmpeg -v quiet -display_rotation 0 -i orig_rotation_90.mp4 -codec copy orig_rotation_90_del_rotation.mp4
重置Rotation为0时,exiftool还能查看Rotation字段,但MediaInfo、ffmpeg、ffprobe均不显示为0的Rotation字段。
4.5) 非正交Rotation字段
之前演示的Rotation字段都是90度的整数倍,包括0度。Rotation字段可以是任意度数,但WMP只支持90度的整数倍,其他度数视之0度。相比之下,ffplay支持任意度数。
ffmpeg -v quiet -display_rotation -10 -i orig.mp4 -codec copy orig_rotation_10.mp4
ffmpeg -v quiet -display_rotation 20 -i orig.mp4 -codec copy orig_rotation_neg_20.mp4
用ffplay检验视效,已做出相应旋转
ffplay -v quiet -i orig_rotation_10.mp4
ffplay -v quiet -i orig_rotation_neg_20.mp4
WMP播放上述两视频,与0度无异,未做旋转
4.6) 16进制编辑Rotation字段
some.mp4的"Matrix Structure"的a/b/u/c/d/v/x/y/w,共9个32位整型字段,占36字节。
假设没有exiftool、ffmpeg,可用WinHex之类的工具直接修改"Matrix Structure",以设置Rotation字段。
16进制编辑"Matrix Structure"的结果,ffplay容错性好于WMP。
☆ 小结
若视频播放视效出现预期外的旋转,应先检查Rotation字段,必要时重置Rotation字段,再做后续处理。
ffmpeg做真实旋转时,最好指定-noautorotate参数,避免困扰。
使用Rotation字段实现视频旋转,有利于保持原画质,只要播放器支持,推荐ffplay,兼容性更好。
(完整版看TXT)