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

106

我正在寻找一种方法,在我的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

然而,这样做非常慢(最后一次测试花费了我超过6个小时才得到不到3分钟的录像),而且结果不能播放。我还在日志输出中收到一个错误消息,指出 Mb Rate > level limit。

重新编码是否存在问题?我是否应该先将手机上的视频重新编码为另一种更“可操作”的编码,然后再进行旋转?或者我漏掉了其他重要的点吗?


7
жқҘиҮӘFFmpegзҡ„ffmpeg并дёҚиҝҮж—¶пјҢLibavпјҲFFmpegзҡ„еҲҶж”Ҝпјүдёӯзҡ„дјӘйҖ е“Ғ"ffmpeg"жүҚжҳҜиҝҮж—¶зҡ„гҖӮйҷӨйқһиҫ“е…ҘдёәMJPEGжҲ–еңЁж’ӯж”ҫиҝҮзЁӢдёӯж—ӢиҪ¬пјҢеҗҰеҲҷж— жі•иҝӣиЎҢж—ӢиҪ¬иҖҢдёҚйҮҚж–°зј–з ҒгҖӮ - llogan
@LordNeckbeard 我怎么能区分它们?我使用软件包管理器安装了ffmpeg,所以我猜我有正确的版本? - stedes
1
关于一般的旋转,请参见如何使用FFmpeg翻转视频180°(垂直/倒置)?,对于MJPEG输入,请参见使用ffmpeg和exiftran无损旋转MJPEG视频 - llogan
6个回答

141

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

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

stackoverflow上其他地方发现的。


我尝试过这个,但没有成功。我正在Lubuntu上使用mplayer。那么,如何读取元数据以检查是否已更改? - Sigur
3
请尝试运行命令ffprobe -v quiet output.mp4 -show_streams|grep rot。在旋转成功应用的视频上,我看到以下输出: TAG:rotate=90 rotation=-90 - kwc
2
有关这些参数的解释吗?例如,我找到了一个答案,在-metadata后面没有:0 - 这是什么意思?-c copy是什么意思?.. - Dennis98
18
刚刚重新看到这个问题,我现在对FFmpeg有更多的经验了。 在-metadata后面的:s:v:0是流指示器,它告诉FFmpeg应将元数据添加到哪个流中。 :s代表输入文件的流,:v选择视频流,数字是流索引,从零开始 - 这将仅选择第一个视频流。由于通常不会有多个视频流,:s:v应该得出相同的结果。 -c选项指定要使用的编解码器,copy表示只复制流,不重新编码。 - Dennis98
3
并非所有玩家都会支持此事。 - Hamid Reza
显示剩余5条评论

81

FFmpeg和类似的程序在使用-map_metadata选项时会改变元数据exiftool可以读取旋转矩阵和旋转标志,自10.89版本以来也可以按照下面描述的方式进行写入。

要实现真正无损(包括元数据)的视频旋转,我找不到解决方案,所以我使用十六进制编辑器(例如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

7
我无法理解为什么这个没有获得任何赞。其他答案发布了显然的谎言,声称除非是MJPEG,否则你不能旋转视频而不损失质量。这对我很有用,它是无损的,没有重新编码(瞬间完成),我有一个保证文件中的其他内容不会被更改,也不需要下载网络上的随机可执行二进制文件。这甚至比从被接受的答案设置命令行还要快。点个赞,谢谢! :) - deLock
2
谢谢。我猜这是在 Stack Exchange 上一个旧问题有多个答案,需要找到更好的解决方案的问题。实际上有很多类似的主题,我试图用这些信息回答/帮助,但却被其他更详细的用户阻止了。虽然这更像是 Stack Exchange 元话题的讨论。 - aXeL-HH
2
刚试了一下,太棒了。只用了几秒钟,完美地完成了任务,并且可以100%还原到原始文件。谢谢! - Spire
1
@user3469861 代码已经集成到了exiftool v10.89中,您可能只需要使用它:http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,6670.msg46809.html - aXeL-HH
2
我还将这种方法制作成了一个独立工具 - AndreKR
显示剩余10条评论

56

旋转=0解决了我的问题。我开始以竖屏模式录制视频,意识到我的错误并立即将手机转为横屏继续录制。我的iPhone将整个视频标记为竖屏。

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

问题已得到解决。


12
你可以解释一下这个参数吗? - Zulu
1
这并不实际旋转您的视频,对吧?它只是试图指示视频播放器以旋转的方式播放您的视频,但并非所有视频播放器都支持该功能,而且据我所知,这甚至不是真正的视频旋转。 - Raleigh L.

3
这个答案只是对LordNeckbeard提供的评论的简要概述。
旋转而不重新编码除非: - 输入是MJPEG - 您在播放时旋转
使用正确的ffmpeg进行编码旋转需要正确理解所需步骤,应该开始阅读或至少浏览此问题: ffmpeg、libav和avconv之间的差异和相似之处是什么? 摘要:avconv是ffmpeg的一个分支,debian维护者选择了avconv,您必须从源代码编译正确的ffmpeg。
下一步是按照此处详细说明的方式从源代码编译正确的ffmpeg: Debian上的ffmpeg编译指南 最后一步是使用其他帖子中找到的命令。

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

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


2
在您的问题中,有几个方面需要注意:
  1. 几乎没有可能在不重新编码的情况下旋转视频。虽然已经有人提到了MJPEG编解码器是一个例外,但是很少有人使用它,所以这超出了此问题的范围。我会提到这种能力的原因是JPEG可以通过元数据进行转换。因此,如果您能找到一个具有元数据旋转的容器,您就可以旋转,但目前不存在(或者普及度不够)。

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

  2. 如果旋转和重新编码3分钟的视频花费了您几个小时,那么问题可能在于分辨率过高。我指的是非常高!您可以提供avprobe original.mp4的输出,以便确定原因。

  3. Libav与FFmpeg之间的争论非常低效(您可以看到这里已经发布了大量的FUD)。基本上发生的事情是项目分裂,一些开发人员走了一条路,而另一些则走了另一条路,FFmpeg项目设法保持名称只是一个偶然事件,称一个项目为原始的,另一个项目为分支是没有意义的。两个项目之间的差异主要在于开发风格和哲学上。如果您将FFmpeg描述为更开放源代码,将Libav描述为更自由软件,那么您不会完全错误。理性的人们希望最终开发人员能醒悟过来,并且也许不会合并项目,但会更多地合作。当Ubuntu最初推出时,在每个Debian GNU/Linux聊天中都有大量的信息,例如“Ubuntu不是Debian!!!!!” ,但现在情况已经平息,双方都相当满意。


5
JPEG也可以进行无损旋转,而不改变元数据。 - Walter Tross
@WalterTross 我的理解是,只有在分辨率可被块大小整除时才能进行这个过程,否则,只有通过更改EXIF才能真正无损地完成。如果我错了,请纠正我。 - v010dya

0

一行解决方案

npx rotate-video --source=/sourceVideoPath --destination=/Users/destinationVideoDir --extension=MP4 --angle=270

注意:您需要先安装FFMPEG命令行界面install


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接