我正在用 iPhone 录制视频并将其上传到我的 Linux 服务器。用户可以在网站上看到这些视频。如果用户在 Mac 或 iDevices 上观看视频,视频看起来不错,但当用户在 Windows 系统上观看该视频时,这些视频会发生旋转。
我猜这是因为录制的视频中有一些苹果标志,而 Windows 系统无法读取。我可以用某种方式录制视频,这样它们就不会在 Windows 系统上旋转吗?或者我有什么办法可以使用 FFmpeg 以正确的界面方向重新编码视频?
我对 FFmpeg 或 iOS 方式都持开放态度。
答案1
您无法更改 iOS 相机录制视频的方式。它会设置一个旋转标志,如果您希望视频在 OS X 和 Windows(以及其他播放器)中都能正确显示,您必须:
- 删除旋转标志。现在您的视频是横向的,但仍然显示错误。
- 重新编码视频,并旋转它。
下载 ffmpeg(为您的操作系统进行静态构建就可以了)。
然后你需要transpose
过滤器,例如
ffmpeg -i portrait.mov \
-c:v libx264 -filter:v "transpose=1" \
-c:a copy \
-metadata:s:v:0 rotate=0 out.mp4
几点说明:
在这里,
transpose=1
将旋转 90°。如果你的视频是上下颠倒的,你需要组合选项。你可以使用-filter:v "transpose=2,transpose=2"
或其他。参见此处:如何使用 FFmpeg 将视频翻转 180°(垂直/颠倒)?该
-metadata:s:v:0 rotate=0
选项可确保第一个视频流中的旋转元数据再次设置为 0(之前为 90),因此您的视频现在在 OS X 和其他操作系统上都可以正常显示。当然,转置会重新编码视频,这会降低质量。添加
-crf
选项后-c:v libx264
设置恒定利率因子,用于控制质量。使用较低的值可获得更好的质量。23 实际上是默认值,因此您根本不需要指定它,但如果视频最终看起来不好,您可能希望选择低至 18 的值,例如-c:v libx264 -crf 18
。在某些情况下,您可能只想删除旋转标志,但保持原始视频比特流完好无损。为此,请用
-c:v libx264 -filter:v "transpose=1"
替换-c:v copy
。查看x264 编码指南了解更多信息。
答案2
下载并安装视频解复用器。
打开视频并选择:
Video Output = Copy
Audio Output = Copy
Output Format = MP4 Muxer
Configure = Rotate Video 270°
最后,文件 > 保存新的旋转视频。
答案3
出色地,
手机通常会录制旋转的视频,但随后会添加一些旋转元数据以供媒体播放器读取,然后旋转它们以供观看。
Windows 7 的 Windows Media Player 忽略了旋转元数据。
Windows 10 的 Windows Media Player 遵循旋转元数据。
ffplay 有一个选项 -autorotate 或 -noautorotate https://ffmpeg.org/ffplay.html 这样你就能清楚地看到差异。
该命令的 ffmpeg 和 mediainfo(可以在 Windows 上安装)可以显示旋转元数据。
如果这样做ffmpeg -i blah.mp4 -acodec libmp3lame -vcodec libx264 blah2.mp4
,将会根据旋转元数据对旋转的视频进行重新编码,并从输出中删除任何旋转元数据。
因此,任何显示为旋转的视频(由忽略旋转元数据的媒体播放器显示)都将被修复。这样所有媒体播放器都可以以正确的方向播放它。
它真的是那么简单..
在我知道我使用 ffmpeg 首先删除旋转元数据(如果存在)之前,然后根据旋转元数据重新编码旋转的视频...这是一个混乱的情况。
但后来我发现,仅仅是提到的最简单的标准 ffmpeg 命令,常规重新编码,就能产生相同的结果,它会在编码视频时考虑旋转元数据,并从输出中删除旋转元数据!
因此,您可以将所有视频从“手机”复制到某个目录中,然后在其中创建一个名为“a”的目录,然后执行for %f in (*.mp4) do @echo ffmpeg -i -acodec libmp3lame -vcodec libx264 a\%f
此操作,然后没有名为“a”的子目录,ffmpeg 会将所有 mp4 文件修复给您!