使用ffmpeg转换为.mp4时,从iphone捕获的视频会旋转

aqs*_*aqs 19 iphone ffmpeg .mov video-conversion

当我尝试在我的应用程序中上传从我的iPhone捕获的视频时,服务器执行从.mov到.mp4的转换,以便可以在其他平台上播放.但问题是,当我拍摄视频(纵向)并进行转换(使用ffmpeg)然后从服务器播放时,它似乎是旋转的.任何的想法?

Alb*_*bin 29

FFMPEG 在2015年将默认行为更改为使用旋转元数据自动旋转视频源.这是作为v2.7发布的.

如果您的ffmpeg版本是v2.7或更高版本,但未遵循您的旋转元数据,则问题很可能是您正在使用基于元数据的自定义轮播.这将导致相同的逻辑应用两次,更改或取消旋转.

除了删除自定义旋转(推荐)之外,还可以选择关闭自动旋转-noautorotate.

ffmpeg -noautorotate -i input.mp4...

这也适用于某些旧版本.


maa*_*cls 19

您还可以执行的操作是在旋转时删除QuickTime特定的元数据.mov.这将确保视频在VLC和QuickTime中以相同的方式旋转

ffmpeg -i in.mov -vf "transpose=1" -metadata:s:v:0 rotate=0 out.mov
Run Code Online (Sandbox Code Playgroud)

以下是该-metadata选项的文档(来自http://ffmpeg.org/ffmpeg.html):

-metadata[:metadata_specifier] key=value (output,per-metadata)
Run Code Online (Sandbox Code Playgroud)

设置元数据键/值对.

可以给出可选的metadata_specifier以在流或章节上设置元数据.有关详细信息,请参阅-map_metadata文档.

此选项将覆盖使用-map_metadata设置的元数据.也可以使用空值删除元数据.

例如,要在输出文件中设置标题:

 ffmpeg -i in.avi -metadata title="my title" out.flv 
Run Code Online (Sandbox Code Playgroud)

要设置第一个音频流的语言:

 ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
Run Code Online (Sandbox Code Playgroud)


bla*_*lah 18

为了完整起见,发生这种情况的原因是iPhone实际上只能以一个固定的方向捕获视频.然后,测量的方向记录在Apple特定的元数据中.

效果是Quicktime Player在播放期间读取元数据并将视频旋转到正确的方向,但其他软件(例如,VLC)不会将其显示为在实际编解码器数据中的方向.

这就是为什么rotate=90(或vflip,或transpose等)对某些人有效,而对其他人无效.根据录制过程中相机的握持方式,所需的旋转可能是90度,180度甚至270度.如果不阅读元数据,您只需要猜测需要多少轮换,修复一个视频的更改将失败.


Kir*_*odd 9

根据您拥有的ffmpeg版本及其编译方式,以下其中一项应该有效...

ffmpeg -vfilters "rotate=90" -i input.mov output.mp4
Run Code Online (Sandbox Code Playgroud)

...要么...

ffmpeg -vf "transpose=1" -i input.mov output.mp4
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,只有`ffmpeg -i input.mov -vf"transpose = 1"output.mp4`工作了 (2认同)

小智 6

使用vflip过滤器

ffmpeg -i input.mov -vf "vflip" output.mp4
Run Code Online (Sandbox Code Playgroud)

旋转不适合我,transpose = 1旋转90度


小智 5

所以 - 我也遇到了这个问题,这里是我的 0.02 美元:

1.) 有些视频确实有方向/旋转元数据,有些则没有:MTS(索尼 AVHCD)或我拥有的 AVI - 没有方向标签。MOV 和 MP4(ipad/iphone 或三星 Galaxy note2)确实有。

you can check the setting via 'exiftool -Rotation file'.
My videos often have 90 or 180 as the rotation.
Run Code Online (Sandbox Code Playgroud)

2.) ffmpeg - 无论带有元数据标签的手册页如何,似乎都没有在输出文件中设置它。- 旋转标签始终为“0”。它在输出中正确地报告了它 - 但它从未被设置为由 exiftool 报告。- 但是嘿 - 至少它在那里并且总是 0。

3.) 旋转角度:如果您想要旋转 +/- 90:transpose=1 表示顺时针 90,现在如果您需要 180 度,则为 2 ccw - 只需添加此过滤器两​​次。请记住 - 这是您指定的过滤器链。:-) - 请继续往下看。

4.) 旋转然后缩放:这很棘手 - 因为您很快就会遇到 MP4 输出格式违规问题。假设您有一个 1920x1080 MOV。旋转 90 得到 1080x1920 然后我们重新缩放到 -1:720 -> 1080*(720/1920) = 405 horiz 并且 405 水平不能被 2 整除 - 错误。手动修复此问题。自动修复此问题 - 需要一些 shell 脚本工作。

5.) 缩放然后旋转:您可以这样做 - 但最终会得到 720x1280。恶心。但这里的过滤器示例是:“-vf yadif = 1,scale = -1:720,transpose = 1”这不是我想要的 - 但可以工作得很好。

把它们放在一起: - 注意 - “故意错误的旋转标签”,只是为了演示 - 它根本不会出现在输出中!这将获取输入 -并将其旋转 180 度,然后重新缩放 - 重置旋转标签。- 通常 iPhone/ipad2 可以创建 180 度旋转材质。您只需将 '-metadata Rotation=x' 排除在外即可...

/usr/bin/ffmpeg -i input-movie.mov -timestamp 2012-06-23 08:58:10 -map_metadata 0:0 -metadata 旋转=270 -sws_flags lanczos -vcodec libx264 -x264opts me=umh -b 2600k - vf yadif=1,转置=1,转置=1,比例=1280:720 -f mp4 -y 输出电影.MP4

我有多个设备 - 例如机顶盒、ipad2、note2,并且我将所有输入材料(无论是 mp4、mov、MTS、AVI)转换为 720p mp4,到目前为止,所有生成的视频都能正确播放(方向、声音)在每个开发人员上。

希望能帮助到你。