视频旋转
2024-3-10 10:26:4 Author: mp.weixin.qq.com(查看原文) 阅读量:1 收藏

创建: 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)


文章来源: https://mp.weixin.qq.com/s?__biz=MzUzMjQyMDE3Ng==&mid=2247487213&idx=1&sn=09c7fb1d4da5e4ade5a0448891a40c25&chksm=fab2cdd2cdc544c449770fcf7b2b11ec2f4a80d027d345a369dd1dc98f841a02e7d41c603e1f&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh