92

我正在寻找一种方法来旋转我的 Nexus 4 在我的 Debian Wheezy 系统上拍摄的视频。视频是以纵向模式拍摄的,我想将它们旋转到横向模式。优选地,旋转是命令行驱动的。

我发现了几个先前的问题,这些问题暗示了一个很好的解决方案,但我似乎无法让它发挥作用。

首先是这个问题: Rotating videos with FFmpeg

但这表明ffmpeg已过时,我应该使用avconv。我发现这个问题详细说明了前进的道路。 https://askubuntu.com/questions/269429/how-can-i-rotate-video-by-180-degrees-with-avconv

这使我使用以下命令:

avconv -i original.mp4 -vf "transpose=1" -codec:v libx264 -preset slow -crf 25 -codec:a copy flipped.mp4

然而,这非常慢(最后一次测试花了我 6 个多小时,不到 3 分钟的镜头)并且不会产生可播放的电影。我在记录输出时也收到一个错误,指出 Mb Rate > level limit。

这里重新编码有问题吗?在应用旋转之前,我是否应该先将手机中的视频重新编码为另一种更“可行”的编码?还是我错过了另一个重要的点?

4

5 回答 5

127

如果您只想更改元数据,以便考虑标志的媒体播放器播放旋转的文件,请尝试以下操作:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

正如在 stackoverflow 上的其他地方找到的那样。

于 2015-01-04T17:33:09.377 回答
55

Rotation=0 解决了我的问题。我开始以纵向模式录制视频,意识到自己的错误并立即将手机转为横向继续录制。我的 iphone 已将视频标记为整个视频的肖像。

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

解决它。

于 2015-10-18T22:57:07.470 回答
50

FFmpeg即使使用该选项,类似的程序也会更改元数据。可以读取旋转矩阵和旋转标志,从 10.89 版本开始也可以如下所述编写。-map_metadataexiftool

为了获得真正的无损(包括元数据)旋转,我找不到解决方案,所以我抓住了一个十六进制编辑器(例如HxD)并分析了旋转的视频文件。

MP4真正的无损旋转:

  • 使用十六进制编辑器打开 mp4 并搜索vide以找到视频轨道的元数据

  • 上面的一些行(对于我的文件主要是 9,有时是 12)你应该看到trak...\tkhd

  • 中间应该有一个@标志(HEX 40)

  • 在它之前的两行中,旋转矩阵被存储

  • 无旋转:

     00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
     00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     40
    
  • 180°:

     FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
     FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     40
    
  • 顺时针 90°:

     00 00 00 00 00 01 00 00 00 00 00 00 FF FF 00 00 
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
     40 
    
  • 90° 逆时针:

     00 00 00 00 FF FF 00 00 00 00 00 00 00 01 00 00 
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
     40
    

根据需要更改文件,并且应该在支持旋转标志的播放器中旋转它(大多数当前播放器都这样做)。

如果您的视频包含立体声音频,这显然不会切换,因此如果您希望声音与视频旋转(180°)匹配,则需要切换左右声道。

ExifTool 无损旋转:

来源

将旋转设置为 270°:

exiftool -rotation=270 FILE.mp4

将 90° 添加到现有旋转值:

exiftool "-rotation<${rotation;$_ += 90}" FILE.mp4
于 2018-03-28T12:48:53.063 回答
3

这个答案只是对 LordNeckbeard 提供的评论的总结。

旋转不编码

在不重新编码的情况下进行旋转是不可能的,除非:

  • 你的输入是 MJPEG
  • 你在播放时旋转

使用正确的 ffmpeg 旋转编码

要正确理解所需的步骤,应该从阅读或至少略读这个问题开始:

ffmpeg、libav、avconv有什么区别和相似之处?

总结:avconv 是 ffmpeg 的一个分支,debian 维护者选择了 avconv,你必须从源代码编译正确的 ffmpeg。

下一步是从源代码编译正确的 ffmpeg,详见此处:

ffmpeg for Debian 编译指南

最后一步是使用其他帖子中的命令:

如何使用 FFmpeg 将视频翻转 180°(垂直/倒置)?使用 FFmpeg 旋转视频

总结:ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4

于 2014-08-01T07:00:22.710 回答
2

您在问题中提到了几件事:

  1. 几乎没有机会在不重新编码的情况下进行旋转。已经指出了该规则的例外(MJPEG 编解码器),但您不太可能使用它,因此它超出了这个问题的范围。我会提到这种能力的原因是JPEG可以通过元数据进行转换。因此,如果您能够找到具有元数据旋转的容器,您将能够旋转,但到目前为止不存在(或传播得足够广泛)。

    更新这个答案现在提供了一种无损旋转 MP4 容器的方法。

  2. 如果你花了几个小时来旋转和重新编码 3 分钟的视频,那么问题可能在于分辨率很高。我的意思是巨大的!您能否提供的输出,avprobe original.mp4以便可以确定。

  3. Libav 与 FFmpeg 的争论非常适得其反(你可以从这里已经发布的 fud 数量看出这一点)。基本上已经发生的事情是项目的分裂,一些开发人员采取了一种方式和另一种方式,FFmpeg 项目设法保留名称的事实只是一个侥幸,将一个项目称为原始项目和另一个项目是没有意义的。项目之间的差异主要在开发风格和理念上。如果您将 FFmpeg 描述为更开放源代码而将 Libav 描述为更多自由软件,那么您就不会那么大错特错了。理性的人希望最终开发者能够清醒过来,也许不是合并项目,而是更大程度地合作。当 Ubuntu 最初问世时,在每次 Debian GNU/Linux 聊天中,都有大量的消息,类似于“

于 2014-11-09T10:43:25.640 回答