旋转mp4视频而无需重新编码


76

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

我已经找到了几个先前的问题,这些问题暗示着一个好的解决方案,但是我似乎无法设法使其正常工作。

首先存在一个问题: 使用FFmpeg旋转视频

但这表明ffmpeg已过时,我应该使用avconv。我发现了这个问题,详细说明了前进的方向。 /ubuntu/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速率>级别限制。

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


5
ffmpeg来自FFmpeg的版本已经过时。ffmpeg来自Libav(FFmpeg的一个分支)的伪造的“ ”已经过时了。除非重新编码,否则无法旋转,除非:1)输入为MJPEG,或2)播放时旋转。
llogan 2014年

@LordNeckbeard我该如何区分?我使用软件包管理器安装ffmpeg,所以我猜我有正确的选择吗?
stedes


Answers:


112

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

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

正如stackoverflow上其他地方所发现的那样。


我尝试过,但没有成功。我在Lubuntu上使用mplayer。那么,如何读取元数据以检查其是否已更改?
Sigur

3
@Sigur试试ffprobe -v quiet output.mp4 -show_streams|grep rot。在成功应用旋转的视频上,我看到以下输出:TAG:rotate=90 rotation=-90
kwc

2
关于参数有什么解释吗?例如。我发现一个答案,其中:0-metadata是不存在的-这是什么呢?是-c copy为了什么 ..
Dennis98's

8
好的,只是再次遇到了这个问题,但是现在有了FFmpeg的更多经验。在:s:v:0之后-metadata是流符,刚刚告诉FFmpeg哪个流应该添加元数据。:s只是代表输入文件的流,:v选择视频流,数字是流索引,从零开始-因此,这只会选择第一个视频流。由于通常视频流不止一个,:s:v因此应得到相同的结果。该-c选项指定要使用的编解码器,仅用于copy复制流,而无需重新编码。
Dennis98 '17

2
并非所有玩家都支持此功能
Hamid Reza

50

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

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

固定它。


7
您能否进一步说明该参数?
祖鲁语2015年

33

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

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

MP4的真正无损旋转:

  • 使用十六进制编辑器打开mp4并搜索vide以查找视频轨道的元数据
  • 上面的一些行(对于我的文件,大多数为9行,有时为12行),您应该看到 trak...\tkhd
  • 在两者之间应该有一个@标志(十六进制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°)相匹配,则需要切换左右声道。


5
我不明白这没有得到任何支持。另一个答案是:如果没有MJPEG,就无法无损旋转视频。这对我有用,它是无损的,无需重新编码(即时),而且我保证文件中的其他内容都没有更改,而且我不必为从网络上下载随机可执行二进制文件而烦恼。这甚至比从接受的答案中设置命令行更快。有一个赞,谢谢!:)
解除锁定

1
谢谢。我想这是在SX上为多个问题找到更好的解决方案的问题。实际上,有多个类似的主题,我尝试回答/帮助获取此信息,但被其他更精巧的用户阻止。不过,更多关于SX meta的讨论。
aXeL-HH

1
刚刚尝试过。美丽。仅用了几秒钟,就可以完美工作,并且可以100%还原到原始文件。谢谢!
尖顶

1
@ user3469861代码集成到exiftool v10.89,你可能只是想使用:u88.n24.queensu.ca/exiftool/forum/index.php/...
阿克塞尔-HH

1
我也将此方法烘焙到独立工具中
AndreKR

2

您在问题中涉及到几件事:

  1. 几乎没有机会无需重新编码就可以旋转。该规则(MJPEG编解码器)的例外已经被指出,但是您不太可能使用它,因此它超出了此问题的范围。我将提到此功能的原因是可以通过元数据转换JPEG。因此,如果您能够找到一个具有元数据旋转功能的容器,那么您将可以旋转它,但是到目前为止没有一个容器存在(或分布得足够广泛)。
  2. 如果您花了数小时来旋转和重新编码3分钟的视频,那么问题可能出在巨大的分辨率上。我的意思是巨大!您能否提供的输出avprobe original.mp4以便可以确定。
  3. Libav与FFmpeg的辩论适得其反(通过此处已张贴的fud数量可以看到这一点)。基本上发生的事情是该项目的分裂,有一些开发人员采取了另一种方式,FFmpeg项目设法保留了该名称只是一个fl幸,而将一个项目称为原始项目而将另一个项目称为叉子是没有道理的。项目之间的差异主要在于开发风格和理念上。如果您将FFmpeg表征为更多的开放源代码,并将Libav表征为更多的自由软件,那么您将不会完全被误解。理性的人希望最终开发人员能发挥自己的见识,也许不合并项目,而在更大程度上进行合作。Ubuntu最初问世时,在每次Debian GNU / Linux聊天中,都会出现“

3
JPEG也可以无损旋转而无需更改元数据
Walter Tross

@WalterTross据我所知,只有在分辨率可被块大小整除的情况下,才能完成此过程,否则,只有通过更改EXIF才能真正无损地做到这一点。如果我错了,请纠正我。
v010dya

2

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

无需编码即可旋转

除非重新编码,否则无法进行不重新编码的旋转:

  • 您输入的是MJPEG
  • 播放时旋转

使用正确的ffmpeg进行编码旋转

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

ffmpeg,libav和avconv之间有什么异同?

简介:avconv是ffmpeg的分支,debian维护者选择了avconv,您必须从源代码编译正确的ffmpeg。

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

ffmpeg的Debian编译指南

最后一步是使用其他文章中的命令:

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

摘要:ffmpeg -vfilters“ rotate = 90” -i input.mp4 output.mp4

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.