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

ste*_*des 68 debian ffmpeg rotation video-encoding avconv

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

我发现以前的几个问题暗示了一个很好的解决方案,但我似乎无法让它运作起来.

首先是这个问题: 使用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
Run Code Online (Sandbox Code Playgroud)

然而,这是非常缓慢的(上次测试花了我超过6小时不到3分钟的镜头)并且不会导致可播放的电影.我也在记录输出时出现错误,该错误表明Mb Rate> level limit.

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

小智 100

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

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4
Run Code Online (Sandbox Code Playgroud)

在stackoverflow上的其他地方找到.

  • 好的,刚刚再次遇到这个问题,但现在有更多的FFmpeg经验.`-metadata`之后的`:s:v:0`是流说明符,它只告诉ffmpeg它应该添加元数据的流.`:s`代表输入文件的流,`:v`选择视频流,数字是流索引,从零开始 - 所以这只会选择第一个视频流.由于您通常没有多个视频流,`:s:v`应该会产生相同的结果.`-c`选项指定要使用的编解码器,使用`copy`来复制流,而无需重新编码. (7认同)
  • @Sigur尝试`ffprobe -v quiet output.mp4 -show_streams | grep rot`.在成功应用旋转的视频上,我看到此输出:`TAG:rotate = 90 rotation = -90` (3认同)
  • 有没有对参数的解释?例如.我找到了一个答案,其中`-metadata`之后的`:0`不存在 - 这是做什么的?什么是`-c copy`?.. (2认同)
  • 不是所有玩家都会支持这个 (2认同)

小智 46

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

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4
Run Code Online (Sandbox Code Playgroud)

固定它.

  • 你能解释一下这个参数吗? (7认同)

aXe*_*-HH 22

FFmpeg和类似的程序甚至使用选项更改元数据-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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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 
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)

根据需要更改文件,并且应该在支持旋转标记的玩家中旋转(大多数当前玩家都可以).

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

  • 我无法理解这怎么没有得到任何赞成.其他答案明确说谎,除非是MJPEG,否则你无法无损地旋转视频.这对我有用,它是无损的,没有重新编码(即时),我保证文件中的其他内容都没有改变,我不必为从网上下载随机可执行二进制文件而烦恼.这甚至比从接受的答案设置命令行更快.有一个upvote和谢谢!:) (3认同)
  • 谢谢。我想这是在 SX 上找到一个有多个答案的旧问题的更好解决方案的问题。实际上有多个类似的主题,我试图回答/帮助这些信息,但被其他更复杂的用户阻止。不过,更多的是关于 SX 元的讨论。 (2认同)
  • 刚试过。美丽的。只用了几秒钟,效果很好,并且可以 100% 还原为原始文件。谢谢! (2认同)
  • 我还将此方法烘焙到[独立工具](https://gitlab.com/AndreKR/mp4-rotator)中。 (2认同)