我一直试图弄清楚如何旋转视频与FFmpeg。我正在处理以竖屏模式拍摄的iPhone视频。我知道如何使用MediaInfo(优秀的库,顺便说一下)确定当前的旋转程度,但我现在卡住了FFmpeg。

从我所读到的,你需要使用的是一个vfilter选项。根据我看到的,它应该是这样的:

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

然而,我不能让它工作。首先,-vfilters已经不存在了,现在只有-vf。其次,我得到这个错误:

No such filter: 'rotate'
Error opening filters!

据我所知,我有一个全选项的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.

拥有vflip和hflip的选项很棒,但它们不能让我去我需要去的地方。我需要至少能够将视频旋转90度。270度也是个不错的选择。旋转选项去哪儿了?


当前回答

默认情况下,ffmpeg.exe旋转过滤器可能会切割图像。为了保持原来的窗口宽度和高度,逆时针旋转90°,可以使用:


ffmpeg.exe -i infilename -vf rotate=-PI/2:oh=iw:ow=ih outfilename

通过添加:oh=iw:ow=ih,指定[外窗宽]=[输入窗高],[外窗宽]=[输入窗高],这相当于-vf转置=2,旋转而不切割图像。

在这里:

iw: input width
ih: input height
ow: output width
oh: output height

请参阅https://ffmpeg.org/ffmpeg-filters.html#rotate

其他回答

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

不管用,即使是最新的消息来源…

必须改变顺序:

ffmpeg -i input.mp4 -vf vflip output.mp4

工作正常

我在寻找同样的答案时偶然发现了这一页。从最初提出这个要求到现在已经有六个月了,从那时起构建已经更新了很多次。然而,我想为在这里寻找这一信息的其他人添加一个答案。

我使用的Debian挤压和FFmpeg版本从这些存储库。

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

ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg

关键在于您不使用度数变量,而是使用来自MAN页面的预定义设置变量。

0=90CounterCLockwise and Vertical Flip  (default) 
1=90Clockwise 
2=90CounterClockwise 
3=90Clockwise and Vertical Flip

另一个解决方案与前面提到的解决方案不同,就是检查您的相机驱动程序是否支持v4l2相机控件(这是非常常见的)。在终端输入:

v4l2-ctl -L

如果你的相机驱动程序支持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

如果你幸运的话,它支持horizontal_flip和vertical_flip。 然后你所需要做的就是设置horizontal_flip:

v4l2-ctl --set-ctrl horizontal_flip=1

或者vertical_flip:

v4l2-ctl --set-ctrl vertical_flip=1

然后你可以调用你的视频设备来捕捉一个新的视频(见下面的例子),视频将被旋转/翻转。

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -f mpegts input.mp4

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

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

Alexy的回答几乎适用于我,除了我得到了这个错误:

MPEG 4标准不支持timebase 1/90000,最大值 时间基准分母的允许值是65535

我只需要在命令中添加一个参数(-r 65535/2733),它就可以工作了。完整的命令如下:

ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4

对我来说是这样的

顺时针旋转

 ffmpeg -i "path_source_video.mp4" -filter:v "transpose=1" "path_output_video.mp4"

逆时针方向旋转

 ffmpeg -i "path_source_video.mp4" -filter:v "transpose=0,transpose=1,transpose=0" -acodec copy "path_output_video.mp4"

我使用zeranoe包