标题: 视频旋转 创建: 2024-03-07 21:06 更新: 2024-03-19 19:54 链接: 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://mediainfo.sourceforge.net/ https://mediaarea.net/en/MediaInfo https://mediaarea.net/MediaInfoOnline (在线版) https://mediaarea.net/en/MediaInfo/Download/Windows -------------------------------------------------------------------------- K-Lite带MediaInfo: "C:\Program Files (x86)\K-Lite Codec Pack\Tools\MediaInfo.exe" MediaInfo用于查看各种多媒体文件的元数据,资源管理器右键菜单里MediaInfo就是 它。MediaInfo可以便携化,只需两个文件: X:\Green\GUI\mediainfo.exe X:\Green\GUI\mediainfo.dll 可以命令行启动: "C:\Program Files (x86)\K-Lite Codec Pack\Tools\MediaInfo.exe" some.mp4 X:\Green\GUI\mediainfo.exe some.mp4 X:\Green\MediaInfo\MediaInfo.exe some.mp4 MediaInfo官网是: https://mediaarea.net/en/MediaInfo 官网现有24.01.1版,有中文语言包,不如20.08版小巧。 2) exiftool exiftool也可查看多媒体文件的元数据 apt install libimage-exiftool-perl $ exiftool -ver 12.40 $ exiftool some.mp4 ... Matrix Structure : 1 0 0 0 1 0 0 0 1 ... Rotation : 270 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 ☆ 旋转视频 手机横屏录制视频,在PC上用MPC播放,画面可能顺时针旋转90度,想逆时针转90度 回去。用"Windows Media Player"播放时,认Rotation字段,画面已如所愿。 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 "-v quiet"比"-hide_banner"更清净 -------------------------------------------------------------------------- https://ffmpeg.org/ffmpeg-filters.html#transpose transpose参数: 0 cclock_flip counter-clockwise and vertical flip (default) 逆时针旋转90度+垂直翻转 1 clock clockwise 顺时针旋转90度 2 cclock counter-clockwise 逆时针旋转90度 3 clock_flip clockwise and vertical flip 顺时针旋转90度+垂直翻转 transpose=1,transpose=1 顺时针旋转180度 已不推荐transpose参数用数值,建议使用符号,比如将0换成cclock_flip -------------------------------------------------------------------------- https://ffmpeg.org/ffmpeg-filters.html#rotate rotate=PI:bilinear=0 顺时针旋转180度,视觉效果同"transpose=1,transpose=1" when using the rotate filter, the bilinear interpolation should be turned off (by using bilinear=0) for angles divisible by 90, otherwise it may look blurry 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度 -------------------------------------------------------------------------- 查看更多filter: ffmpeg -v quiet -filters | less 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 $ exiftool -rotation orig_rotation_90.mp4 Rotation : 90 用MediaInfo确认Rotation字段已正确设置 ffmpeg -hide_banner -i orig_rotation_90.mp4 $ ffmpeg -hide_banner -i orig_rotation_90.mp4 2>&1 | grep "displaymatrix: rotation" displaymatrix: rotation of -90.00 degrees ffmpeg这个显示极易带来困扰,此间显示-90,表示播放时顺时针旋转90度,此间显 示90,表示播放时逆时针旋转90度。ffmpeg未显示Rotation字段原值,它显示90时, 实际值是270,也即-90。 用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,这会带来困扰。 用ffplay测试播放效果 ffplay -v quiet -i orig_rotation_90.mp4 ffplay -v quiet -i orig_rotation_270.mp4 orig_rotation_270.mp4只是设置过Rotation字段,并未实际旋转过,是否有旋转效 果,依赖所用播放器,比如MPC看到的就是未旋转过的原始状态。 4.2.1) -noautorotate ffmpeg旋转时有个特性,会在Rotation字段基础上旋转,假设起始位置就是Rotation 字段所示位置,输出结果则会重置Rotation字段(清零)。这给不了解此特性的人带来 困扰。相比之下,"-display_rotation"时无此叠加效应,直接取负后设置。 可给ffmpeg指定"-noautorotate"参数禁用前述行为,即不理会Rotation字段当前值, 视其为0的情况下进行实际旋转,但输出结果保留Rotation字段原值。 ffmpeg -v quiet -noautorotate -i orig_rotation_270.mp4 -vf "transpose=clock" -c:a copy orig_rotation_270_90_noautorotate.mp4 $ exiftool -rotation orig_rotation_270.mp4 Rotation : 270 $ exiftool -rotation orig_rotation_270_90_noautorotate.mp4 Rotation : 270 用MPC播放orig_rotation_270.mp4,正常视效;播放 orig_rotation_270_90_noautorotate.mp4,顺时针旋转90度。用WMP播放 orig_rotation_270.mp4,逆时针旋转90度;播放 orig_rotation_270_90_noautorotate.mp4,正常视效。 ffplay -i orig_rotation_270_90_noautorotate.mp4 上例正常视效(同WMP)。ffplay也有"-noautorotate"参数,即不理会Rotation字段当 前值,于是播放效果同MPC。 ffplay -noautorotate -i orig_rotation_270_90_noautorotate.mp4 上例顺时针旋转90度(同MPC)。所有视效全都有合理解释,但确实坑爹。 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 $ exiftool -rotation orig_rotation_90_del_rotation.mp4 Rotation : 0 用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字段。 $ ffmpeg -hide_banner -i orig_rotation_90_del_rotation.mp4 2>&1 | grep "displaymatrix: rotation" (无输出) $ ffprobe -v quiet orig_rotation_90_del_rotation.mp4 -show_streams | grep 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=0 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 int[0] 00 01 00 00 int[4] 00 01 00 00 -------------------------------------------------------------------------- rotation=90 00 00 00 00 00 01 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 int[1] 00 01 00 00 int[3] ff ff 00 00 -------------------------------------------------------------------------- rotation=-90 (270) 00 00 00 00 ff ff 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 int[1] ff ff 00 00 int[3] 00 01 00 00 -------------------------------------------------------------------------- rotation=180 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 int[0] ff ff 00 00 int[4] ff ff 00 00 -------------------------------------------------------------------------- ☆ 旋转图片 真实旋转适用于mp4、jpg,Rotation字段只适用于mp4。 ffmpeg -v quiet -i orig.jpg -vf "rotate=-95*(PI/180)" -c:a copy rotate_neg_95.jpg ffmpeg -v quiet -i orig.jpg -vf "hflip" -c:a copy hflip.jpg ffmpeg -v quiet -i orig.jpg -vf "vflip" -c:a copy vflip.jpg 对图片进行水平翻转、垂直翻转,再发微博,防夹图。但这是一种非用户友好方案, 需有配套的还原查看工具,比如: ffplay -v quiet -i rotate_neg_95.jpg -vf "rotate=95*(PI/180)" ffplay -v quiet -i hflip.jpg -vf "hflip" ffplay -v quiet -i vflip.jpg -vf "vflip" Win10的画图,其"旋转"功能中自带水平翻转、垂直翻转。iPhone编辑图片,下方选 裁剪,左上角有水平翻转。Android编辑图片,下方选裁切旋转,左侧是水平翻转, 右侧是顺时针旋转,通过一定组合可实现垂直翻转。 打开Word,复制图片,粘贴,单击图片,图片工具,旋转,水平翻转/垂直翻转。 浏览器中,可利用CSS。右键点击图片,点击"检查",在"元素"中单击,新增 "transform: rotateY(180deg)";英文版是"右键Inspect->element.style";这是水 平翻转。垂直翻转是"transform: rotateX(180deg)"。 ☆ 小结 若视频播放视效出现预期外的旋转,应先检查Rotation字段,必要时重置Rotation字 段,再做后续处理。 ffmpeg做真实旋转时,最好指定-noautorotate参数,避免困扰。 使用Rotation字段实现视频旋转,有利于保持原画质,只要播放器支持,推荐ffplay, 兼容性更好。 真实旋转适用于mp4、jpg,Rotation字段只适用于mp4。