使用FFmpeg旋转视频

joc*_*ull 395 ffmpeg rotation video-processing

我一直试图找出如何使用FFmpeg旋转视频.我正在处理以纵向模式拍摄的iPhone视频.我知道如何使用MediaInfo(优秀的库,顺便说一句)确定当前的旋转度,但我现在卡在FFmpeg上.

根据我的阅读,您需要使用的是vfilter选项.根据我的看法,它应该是这样的:

ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
Run Code Online (Sandbox Code Playgroud)

但是,我不能让这个工作.首先,-vfilters不再存在,它现在只是-vf.其次,我收到此错误:

No such filter: 'rotate'
Error opening filters!
Run Code Online (Sandbox Code Playgroud)

据我所知,我有一个FFmpeg的全选版本.运行ffmpeg -filters显示:

Filters:
anull            Pass the source unchanged to the output.
aspect           Set the frame aspect ratio.
crop             Crop the input video to x:y:width:height.
fifo             Buffer input images and send them when they are requested.
format           Convert the input video to one of the specified pixel formats.
hflip            Horizontally flip the input video.
noformat         Force libavfilter not to use any of the specified pixel formats
 for the input to the next filter.
null             Pass the source unchanged to the output.
pad              Pad input image to width:height[:x:y[:color]] (default x and y:
 0, default color: black).
pixdesctest      Test pixel format definitions.
pixelaspect      Set the pixel aspect ratio.
scale            Scale the input video to width:height size and/or convert the i
mage format.
slicify          Pass the images of input video on to next video filter as multi
ple slices.
unsharp          Sharpen or blur the input video.
vflip            Flip the input video vertically.
buffer           Buffer video frames, and make them accessible to the filterchai
n.
color            Provide an uniformly colored input, syntax is: [color[:size[:ra
te]]]
nullsrc          Null video source, never return images.
nullsink         Do absolutely nothing with the input video.
Run Code Online (Sandbox Code Playgroud)

拥有vfliphflip的选项非常棒,但他们只是不会让我到达我需要去的地方.我需要能够将视频至少旋转90度.270度也是一个很好的选择.旋转选项哪里去了?

小智 644

顺时针旋转90度:

ffmpeg -i in.mov -vf "transpose=1" out.mov
Run Code Online (Sandbox Code Playgroud)

对于转置参数,您可以传递:

0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip
Run Code Online (Sandbox Code Playgroud)

使用-vf "transpose=2,transpose=2"180度.

确保你从这里使用最近的ffmpeg版本(静态构建将正常工作).

请注意,这将重新编码音频和视频部分.您通常可以通过使用来复制音频而无需触摸它-c:a copy.要更改视频质量,请设置比特率(例如-b:v 1M)或者如果您想要VBR选项,请查看H.264编码指南.

解决方案也是使用此便捷脚本.

  • 对于180你可以使用`-vf"transpose = 2,transpose = 2"` (58认同)
  • 当我使用这个命令时,我得到**低质量的视频输出**,除非 - 正如我刚刚发现的那样 - 我也使用这个参数:`-vcodec libx264`.但是如果我不需要查找要使用的编码,那将是很好的,因为ffmpeg应该已经知道它.**有什么建议?** (24认同)
  • 当前的文档指出"数值已被弃用,应该被删除以支持符号常量." http://ffmpeg.org/ffmpeg-filters.html#transpose因此`cclock_flip`,`clock`,`cclock`或`clock_flip`而不是`0`,`1`,`2`或`3`. (18认同)
  • 视频仍然会有方向信息,所以现在视频将在iphone上错过. (8认同)
  • 与Sadi一样,有没有办法"复制"原始视频的质量? (8认同)
  • 我会使用`-a:c copy`标志(在`-vf`标志之后)来复制音频流.我的手机的相机使用aac拍摄视频,ffmpeg默认不支持我的发行版. (3认同)
  • 所以为了旋转180度我必须用"transpose = 1"转换两次?我不希望使用hflip的镜像效果. (2认同)
  • @AlexReinking我想你的意思是-c:一个副本。 (2认同)

Rod*_*olo 131

如果您不想重新编码视频并且您的播放器可以处理旋转元数据,您只需使用ffmpeg更改元数据中的旋转:

ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最好的答案.但是要做一点改进.为了避免丢失视频中剩余的元数据(例如日期,相机),请执行`ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate ="90"-codec copy output.m4v`.这样,输入文件上的所有全局元数据将作为全局元数据复制到输出文件,并且仅更改旋转元数据. (48认同)
  • 如何用`ffmpeg -i input.m4v 2>&1 |检查旋转元数据 grep rotate` (11认同)
  • 如果你有一个肖像模式的视频,只想"UN-rotate"它有一个标准的1920x1080,那么你可能想要`rotate = 0`. (9认同)
  • 恕我直言最佳解决方案,因为不需要重新编码,大多数视频播放器支持元数据轮换.此外,Google照片等云端服务.但是,请记住ffmpeg不一定要复制原始文件中的所有元数据!因此,我建议明确指定从原始文件复制所有其他元数据:`ffmpeg -i input.mp4 -codec copy -map_metadata 0 -metadata:s:v:0 rotate = 0 output.mp4` (7认同)
  • 尝试了 `-metadata:s:vrotate="180"`,没有用。那应该有效吗? (2认同)
  • 正如答案中所述:“如果您不想重新编码视频并且您的播放器可以处理旋转元数据” (2认同)

rwi*_*ams 82

你试过transpose了吗?喜欢(来自其他答案)

 ffmpeg -i input -vf transpose=2 output
Run Code Online (Sandbox Code Playgroud)

如果您使用的是旧版本,则必须更新ffmpeg才能使用2011年10月添加的转置功能.

FFmpeg 下载页面提供静态构建,您可以直接执行而无需编译它们.

  • 感觉就像我在接受答案前1.5年提供有用答案而受到惩罚. (4认同)
  • @rwilliams 虽然这是一个很好的答案,并且比 Alexy 的答案早 1.5 年,但它的缺点是它没有包含有关转置的作用或如何使用它的更多信息。很高兴您链接到它,但链接到相关信息的缺点是(如本例所示)链接不再指向正确的文档。如果没有别的事,我将提交编辑来修复链接。 (4认同)
  • @JonasB 用逗号分隔过滤器。请参阅http://stackoverflow.com/questions/6195872/applying-multiple-filters-at-once-with-ffmpeg (2认同)

小智 19

我在搜索相同的答案时遇到了这个页面.现在已经有六个月的时间了,这个问题从那时起已经多次更新了版本.但是,我想为在这里遇到的其他人寻找此信息添加答案.

我正在使用这些存储库中的Debian Squeeze和FFmpeg版本.

ffmpeg的MAN页面说明了以下用法

ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg
Run Code Online (Sandbox Code Playgroud)

关键是您不要使用度数变量,而是使用MAN页面中的预定义设置变量.

0=90CounterCLockwise and Vertical Flip  (default) 
1=90Clockwise 
2=90CounterClockwise 
3=90Clockwise and Vertical Flip
Run Code Online (Sandbox Code Playgroud)


Bij*_*lle 16

要顺时针旋转图片,您可以使用旋转滤镜,指示以弧度为单位的正角度.90度等于PI/2,您可以这样做:

ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
Run Code Online (Sandbox Code Playgroud)

对于逆时针方向,角度必须为负

ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
Run Code Online (Sandbox Code Playgroud)

转置滤镜在90度时同样适用,但对于其他角度,这是更快或唯一的选择.

  • 这是唯一对我有用的选择. (2认同)
  • 这很棒.我发现有可能获得更精细的弧度分辨率,因为`*`表现为乘法:`ffmpeg -i in.avi -vf"rotate = -8*PI/40"-q 1 out.avi`(略旋转次数少于-PI/4 = -10*PI/40) (2认同)

小智 12

ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4 
Run Code Online (Sandbox Code Playgroud)

即使有最新的来源,也行不通

必须改变顺序:

ffmpeg -i input.mp4 -vf vflip output.mp4
Run Code Online (Sandbox Code Playgroud)

工作良好

  • "以__radians__表示的任意角度旋转视频." 文档:http://ffmpeg.org/ffmpeg-filters.html#rotate因此,需要弧度`rotate = PI/2`或`rotate = 90*PI/180` (2认同)

小智 8

与最后提到的解决方案采用不同方法的另一个解决方案是检查您的相机驱动程序是否支持 v4l2 相机控制(这很常见)。
在终端中,只需输入:

v4l2-ctl -L
Run Code Online (Sandbox Code Playgroud)

如果您的相机驱动程序支持 v4l2 相机控件,您应该得到类似以下内容(下面的列表取决于您的相机驱动程序支持的控件):

               contrast (int)    : min=0 max=255 step=1 default=0 value=0 flags=slider
             saturation (int)    : min=0 max=255 step=1 default=64 value=64 flags=slider
                    hue (int)    : min=0 max=359 step=1 default=0 value=0 flags=slider
white_balance_automatic (bool)   : default=1 value=1 flags=update
            red_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
           blue_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
               exposure (int)    : min=0 max=65535 step=1 default=0 value=885 flags=inactive, volatile
         gain_automatic (bool)   : default=1 value=1 flags=update
                   gain (int)    : min=0 max=1023 step=1 default=0 value=32 flags=inactive, volatile
        horizontal_flip (bool)   : default=0 value=0
          vertical_flip (bool)   : default=0 value=0
Run Code Online (Sandbox Code Playgroud)

如果你幸运的话它支持horizo​​ntal_flipvertical_flip
然后你需要做的就是设置horizo ​​ntal_flip

v4l2-ctl --set-ctrl horizontal_flip=1
Run Code Online (Sandbox Code Playgroud)

或者通过以下方式进行vertical_flip

v4l2-ctl --set-ctrl vertical_flip=1
Run Code Online (Sandbox Code Playgroud)

然后您可以调用您的视频设备来捕获新视频(请参见下面的示例),并且视频将被旋转/翻转。

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -f mpegts input.mp4
Run Code Online (Sandbox Code Playgroud)

当然,如果您需要处理已经存在的视频,那么此方法不是您正在寻找的解决方案。

这种方法的优点是我们在传感器级别翻转图像,因此驱动程序的传感器已经为我们提供了翻转的图像,这节省了应用程序(如 FFmpeg)任何进一步的和不必要的处理。


sab*_*ujp 6

如果您收到"编解码器是实验性的但未启用实验性编解码器"错误,请使用以下命令:

ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile
Run Code Online (Sandbox Code Playgroud)

我发生了一些带有aac音频的.mov文件.

  • @LOlliffe 添加 `-sameq` (2认同)
  • @AndrewSchleifer谢谢.我试过了,但ffmpeg向我扔了'选项'sameq'被删除了.如果您正在寻找保持质量的选项(这不是-sameq的用途),请使用-qscale 0或等效的品质因数选项.无法为选项'sameq'设置值'1':无效的参数`-qscale也会出错.`请使用-q:a或-q:v,-qscale是不明确的,但仍然有效. (2认同)