23

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

4

10 回答 10

36

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

如果您的 ffmpeg 版本是 v2.7 或更高版本,但您的轮换元数据不受尊重,则问题可能是您使用基于元数据的自定义轮换。这将导致两次应用相同的逻辑,改变或取消旋转。

除了删除您的自定义旋转(推荐)之外,还有一个选项可以关闭自动旋转-noautorotate

ffmpeg -noautorotate -i input.mp4...

这也适用于一些旧版本。

于 2015-06-17T18:11:01.493 回答
20

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

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

这就是为什么rotate=90(or vflip, or transpose, or etc.) 对某些人有效,但对其他人无效。根据记录期间相机的握持方式,必要的旋转可能是 90、180 甚至 270 度。如果不阅读元数据,您只是在猜测需要多少轮换,而修复一个视频的更改将在另一个视频上失败。

于 2012-02-23T20:39:45.570 回答
19

您还可以做的是在旋转.mov. 这将确保视频在 VLC 和 QuickTime 中以相同的方式旋转

ffmpeg -i in.mov -vf "transpose=1" -metadata:s:v:0 rotate=0 out.mov

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

-metadata[:metadata_specifier] key=value (output,per-metadata)

设置元数据键/值对。

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

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

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

 ffmpeg -i in.avi -metadata title="my title" out.flv 

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

 ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
于 2012-12-18T08:17:42.403 回答
10

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

ffmpeg -vf "transpose=1" -i input.mov output.mp4

...或者...

ffmpeg -vfilters "rotate=90" -i input.mov output.mp4
于 2012-02-23T07:56:53.707 回答
6

使用vflip过滤器

ffmpeg -i input.mov -vf "vflip" output.mp4

Rotate 对我不起作用,并且transpose=1旋转了 90 度

于 2012-12-08T21:59:42.263 回答
4

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

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

you can check the setting via 'exiftool -Rotation file'.
My videos often have 90 or 180 as the rotation.

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

3.) 旋转角度:如果你想旋转 +/- 90:转置 = 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 Rotation=270 -sws_flags lanczos -vcodec libx264 -x264opts me=umh -b 2600k - vf yadif=1,transpose=1,transpose=1,scale=1280:720 -f mp4 -y output-movie.MP4

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

希望能帮助到你。

于 2013-11-24T09:59:00.663 回答
0

为了将我的 iPhone 纵向格式视频包含到网页中,我刚刚发现了以下在纵向显示中获取 .mp4 文件的方法。

第 1 步:在 QuickTime Player 中,将文件导出为 480p(我假设 720p 或 1080p 也可以)。你再次得到一个 .mov 文件。

步骤 2:在 QT Player 中获取新文件,然后导出到“iPad、iPhone……”。你得到一个 .m4v 文件。

第 3 步:我正在使用 Miro Video Converter,但可能任何现成的转换器都可以工作,以获取您的 .mp4 文件。

像(冗长的)魅力一样工作。

于 2015-07-27T22:40:43.110 回答
0

我用 Ipad3 拍摄了视频,它的方向是颠倒的,我想这是所有 Apple 设备在某些版本中的常见情况。除此之外,长达 3 分钟的 MOV 文件 (1920x1090) 大小约为 500 Mb,因此无法轻松共享。我必须将其转换为 MP4,并分析我在 stackoverflow 上找到的所有线程,这是我使用的 ffmpeg 的最终代码字符串(ffmpeg 版本 2.8.4):

ffmpeg -i IN.MOV -s 960x540 -metadata:s:v rotate="0" -acodec libmp3lame OUT.mp4

如果您不需要调整大小和音频编解码器更改,我想您可以离开 '-metadata:s:v rotate="0"'。请注意,如果您调整视频大小,宽度和高度应完全划分为 4。

于 2017-04-10T21:15:49.247 回答
0

虽然话题老了。希望这会对某人有所帮助:

获取 ffmpeg 最新版本:https ://www.ffmpeg.org/download.html

对我有用的命令(翻转 180 度):

ffmpeg -noautorotate -i input.mp4 -filter:v "rotate=PI" output.mp4

当度数由-filter:v "PI/180*degrees"

例如 -filter:v "45*PI/180"45 度

一个很好的解释在这里 https://superuser.com/questions/578321/how-to-rotate-a-video-180-with-ffmpeg

于 2018-04-05T12:58:44.523 回答
0

或者...简单地更改现有文件中的标签:

读取当前旋转

exiftool -Rotation <file>

然后,例如:

exiftool -Rotation=180 <file>

将其设置为 180

于 2020-02-25T14:28:33.633 回答