无需重新编码即可旋转mp4视频

时间:2014-07-30 07:56:37

标签: ffmpeg rotation debian video-encoding avconv

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

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

首先,有一个问题: 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

然而,这是非常慢的(上次测试花了不到3个小时的镜头超过6个小时)并且不会导致可播放的电影。我还在记录输出中出现错误,该错误表明Mb Rate>等级限制。

这里有重新编码的问题吗?在应用轮换之前,我是否应首先将视频从手机重新编码为另一种,更“可行”的编码?或者我错过了另一个重点?

5 个答案:

答案 0 :(得分:93)

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

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

找到elsewhere on stackoverflow

答案 1 :(得分:43)

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

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

修正了它。

答案 2 :(得分:16)

FFmpeg以及类似的计划change the metadata即使使用-map_metadata选项也是如此。 exiftool可以读取旋转矩阵和旋转标志,但无法写入。

为了获得真正的无损(包括元数据)旋转,我找不到解决方案,所以我抓住了一个十六进制编辑器(例如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°cw:

    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°ccw:

    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°)匹配,则需要切换左右声道。

答案 3 :(得分:3)

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

  1. 如果没有重新编码,您几乎没有机会旋转。已经指出了该规则的例外(MJPEG编解码器),但是你不太可能使用它,因此它超出了这个问题的范围。我将提到这种能力的原因是JPEG可以通过元数据转换。因此,如果您能够找到具有元数据轮换的容器,您将能够旋转,但到目前为止还没有(或者足够广泛)。
  2. 如果花了几个小时来旋转并重新编码3分钟的视频,则问题可能在于巨大的分辨率。我的意思是巨大的!您能否提供avprobe original.mp4的输出,以便确定。
  3. Libav与FFmpeg的辩论非常适得其反(你可以看到已经在这里发布的fud数量)。基本上发生的事情是项目的分裂,一些开发人员以一种方式和另一种方式,FFmpeg项目设法保留名称的事实只是一个侥幸,将一个项目原始和另一个分叉调用是没有意义的。项目之间的差异主要在于发展风格和哲学。如果你将FFmpeg描述为更多开放源代码,将Libav描述为更多自由软件,那么你就不会错。理性的人们希望最终开发人员能够理解,也许不会合并项目,而是在更大程度上合作。当Ubuntu最初出现时,在每次Debian GNU / Linux聊天中都有大量的消息,而且#34; Ubuntu不是Debian !!!!!!!",但现在情况已经平静下来了双方对彼此非常满意。

答案 4 :(得分:1)

这个答案只是LordNeckbeard提供的评论摘要。

无编码旋转

除非:

,否则无法重新编码
  • 您的输入是MJPEG
  • 你在播放时旋转

使用正确的ffmpeg

进行编码旋转

要正确理解为此所需的步骤,首先应该阅读或至少略过这个问题:

What are the differences and similarities between ffmpeg, libav, and avconv?

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

下一步是从源代码编译正确的ffmpeg,如下所述:

Compilation guide of ffmpeg for Debian

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

How to flip a video 180° (vertical/upside down) with FFmpeg? 要么 Rotating videos with FFmpeg

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