我一直试图弄清楚如何旋转视频与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 -i input -vf transpose=2 output

如果您使用的是旧版本,如果您想使用转置特性,则必须更新ffmpeg,因为它是在2011年10月添加的。

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


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

我使用的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

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

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

必须改变顺序:

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

工作正常


不幸的是,Ubuntu版本的ffmpeg支持视频过滤器。

您需要使用avidemux或其他编辑器来实现相同的效果。

在编程方式上,推荐使用mencoder。


顺时针旋转90:

ffmpeg -i in.mov -vf "transpose=1" out.mov

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

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

使用-vf "转置=2,转置=2"旋转180度。

确保您使用的是这里的最新ffmpeg版本(静态构建就可以了)。

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

另一种解决方案是使用这个方便的脚本。


如果你得到一个“Codec是实验性的,但实验性Codec未启用”的错误,使用这个:

ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile

发生在我的一些。mov文件与aac音频。


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

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

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

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

这个脚本将输出目录结构在“fixedFiles”下的文件。目前被固定到MOV文件,并将根据视频的原始“旋转”执行一些转换。适用于运行Mavericks的Mac上的iOS捕获的视频,但应该很容易导出。依赖于同时安装exiftool和ffmpeg。

#!/bin/bash

# rotation of 90 degrees. Will have to concatenate.
#ffmpeg -i <originalfile> -metadata:s:v:0 rotate=0 -vf "transpose=1" <destinationfile>
#/VLC -I dummy -vvv <originalfile> --sout='#transcode{width=1280,vcodec=mp4v,vb=16384,vfilter={canvas{width=1280,height=1280}:rotate{angle=-90}}}:std{access=file,mux=mp4,dst=<outputfile>}\' vlc://quit

#Allowing blanks in file names
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

#Bit Rate
BR=16384

#where to store fixed files
FIXED_FILES_DIR="fixedFiles"
#rm -rf $FIXED_FILES_DIR
mkdir $FIXED_FILES_DIR

# VLC
VLC_START="/Applications/VLC.app/Contents/MacOS/VLC -I dummy -vvv"
VLC_END="vlc://quit"


#############################################
# Processing of MOV in the wrong orientation
for f in `find . -regex '\./.*\.MOV'` 
do
  ROTATION=`exiftool "$f" |grep Rotation|cut -c 35-38`
  SHORT_DIMENSION=`exiftool "$f" |grep "Image Size"|cut -c 39-43|sed 's/x//'`
  BITRATE_INT=`exiftool "$f" |grep "Avg Bitrate"|cut -c 35-38|sed 's/\..*//'`
  echo Short dimension [$SHORT_DIMENSION] $BITRATE_INT

  if test "$ROTATION" != ""; then
    DEST=$(dirname ${f})
    echo "Processing $f with rotation $ROTATION in directory $DEST"
    mkdir -p $FIXED_FILES_DIR/"$DEST"

    if test "$ROTATION" == "0"; then
      cp "$f" "$FIXED_FILES_DIR/$f"

    elif test "$ROTATION" == "180"; then
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{vfilter={rotate{angle=-"$ROTATION"}},vcodec=mp4v,vb=$BR}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      $(eval ffmpeg -i \"$f\" -vf hflip,vflip -r 30 -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\")

    elif test "$ROTATION" == "270"; then
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=2,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    else
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{scale=1,width=$SHORT_DIMENSION,vcodec=mp4v,vb=$BR,vfilter={canvas{width=$SHORT_DIMENSION,height=$SHORT_DIMENSION}:rotate{angle=-"$ROTATION"}}}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      echo ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" 
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    fi

  fi

echo 
echo ==================================================================
sleep 1
done

#############################################
# Processing of AVI files for my Panasonic TV
# Use ffmpegX + QuickBatch. Bitrate at 16384. Camera res 640x424
for f in `find . -regex '\./.*\.AVI'` 
do
  DEST=$(dirname ${f})
  DEST_FILE=`echo "$f" | sed 's/.AVI/.MOV/'`
  mkdir -p $FIXED_FILES_DIR/"$DEST"
  echo "Processing $f in directory $DEST"
  $(eval ffmpeg -i \"$f\" -r 20 -acodec libvo_aacenc -b:a 128k -vcodec mpeg4 -b:v 8M -flags +aic+mv4 \"$FIXED_FILES_DIR/$DEST_FILE\" )
echo 
echo ==================================================================

done

IFS=$SAVEIFS

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

ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4

逆时针方向的角度必须是负的

ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4

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


如果你不想重新编码你的视频,你的播放器可以处理旋转元数据,你可以使用ffmpeg改变元数据中的旋转:

ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.m4v

智能手机:录制了一段垂直视频

想把它发送到一个网站侧它是90°向左(逆时针,横向格式)嗯。

Ffmpeg -i input.mp4 -vf "rotate=0" output.mp4

它。我又得到了垂直格式

Debian buster: ffmpeg—版本 ffmpeg版本4.1.4-1~deb10u1版权(c) 2000-2019 ffmpeg开发者


另一个解决方案与前面提到的解决方案不同,就是检查您的相机驱动程序是否支持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)节省了任何进一步和不必要的处理。


对我来说是这样的

顺时针旋转

 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包


由于ffmpeg转置命令非常慢,使用下面的命令顺时针旋转视频90度。

快速命令(不编码)-

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

对于完整的视频编码(Slow命令,进行编码)

ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile

我遇到了与OP相同的问题,得到了No such filter: 'rotate'错误,即使旋转过滤器显示为支持——filters。我需要旋转一个任意的角度,所以目前所有的答案都是旋转90度的倍数都不成立。我发现-vf的语法要求符号周围有空格,这与官方文档相反。

改变:

vf的旋转= 1.23

to

-vf 'rotate = 1.23'让它为我工作。

完整的例子:

Ffmpeg.exe -i input.mp4 -vf "rotate = 3.0, crop = 1920:1080"输出.mp4

这是ffmpeg 4.3.2版本


默认情况下,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