当我尝试在我的应用程序中上传从我的 iPhone 捕获的视频时,服务器会执行从 .mov 到 .mp4 的转换,以便可以在其他平台上播放。然而问题是当我拍摄视频(纵向)并转换(使用ffmpeg)然后从服务器播放时,它似乎被旋转了。任何的想法?
10 回答
FFMPEG在 2015 年将默认行为更改为使用旋转元数据自动旋转视频源。这是作为 v2.7 发布的。
如果您的 ffmpeg 版本是 v2.7 或更高版本,但您的轮换元数据不受尊重,则问题可能是您使用基于元数据的自定义轮换。这将导致两次应用相同的逻辑,改变或取消旋转。
除了删除您的自定义旋转(推荐)之外,还有一个选项可以关闭自动旋转-noautorotate
。
ffmpeg -noautorotate -i input.mp4
...
这也适用于一些旧版本。
为了完整起见,发生这种情况的原因是 iPhone 实际上只以一个固定方向捕捉视频。然后将测量的方向记录在 Apple 特定的元数据中。
效果是 Quicktime Player 在播放期间读取元数据并将视频旋转到正确的方向,但其他软件(例如,VLC)不这样做,并将其显示为实际编解码器数据中的方向。
这就是为什么rotate=90
(or vflip
, or transpose
, or etc.) 对某些人有效,但对其他人无效。根据记录期间相机的握持方式,必要的旋转可能是 90、180 甚至 270 度。如果不阅读元数据,您只是在猜测需要多少轮换,而修复一个视频的更改将在另一个视频上失败。
您还可以做的是在旋转.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
根据您拥有的 ffmpeg 版本及其编译方式,以下其中一项应该可以工作...
ffmpeg -vf "transpose=1" -i input.mov output.mp4
...或者...
ffmpeg -vfilters "rotate=90" -i input.mov output.mp4
使用vflip过滤器
ffmpeg -i input.mov -vf "vflip" output.mp4
Rotate 对我不起作用,并且transpose=1旋转了 90 度
所以 - 我也遇到了这个问题,这里是我的 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,直到现在所有生成的视频都可以正确播放(方向、声音)在每个开发人员上。
希望能帮助到你。
为了将我的 iPhone 纵向格式视频包含到网页中,我刚刚发现了以下在纵向显示中获取 .mp4 文件的方法。
第 1 步:在 QuickTime Player 中,将文件导出为 480p(我假设 720p 或 1080p 也可以)。你再次得到一个 .mov 文件。
步骤 2:在 QT Player 中获取新文件,然后导出到“iPad、iPhone……”。你得到一个 .m4v 文件。
第 3 步:我正在使用 Miro Video Converter,但可能任何现成的转换器都可以工作,以获取您的 .mp4 文件。
像(冗长的)魅力一样工作。
我用 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。
虽然话题老了。希望这会对某人有所帮助:
获取 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
或者...简单地更改现有文件中的标签:
读取当前旋转
exiftool -Rotation <file>
然后,例如:
exiftool -Rotation=180 <file>
将其设置为 180