首页 文章

使用FFmpeg旋转视频

提问于
浏览
313

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

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

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

但是,我不能让这个工作 . 首先, -vfilters 不是't exist anymore, it'现在只是 -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.

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

10 回答

  • 11

    Alexy的回答几乎对我有用,除了我收到这个错误:

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

    我只需要在命令中添加一个参数(-r 65535/2733)就可以了 . 因此,完整的命令是:

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

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

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

    以编程方式,推荐使用mencoder .

  • 83

    顺时针旋转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 "transpose=2,transpose=2" 180度 .

    确保使用最近的ffmpeg版本from here(静态构建可以正常工作) .

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

    解决方案也是使用convenience script .

  • 2

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

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

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

    ffmpeg -i input -vf transpose=2 output
    

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

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

  • 12

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

    我正在使用这些存储库中的Debian Squeeze和 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
    
  • 3

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

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

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

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

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

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

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

    必须改变顺序:

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

    工作良好

  • 77

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

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

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

  • 17

    此脚本将输出"fixedFiles"下具有目录结构的文件 . 目前固定为MOV文件,并将根据视频的原始"rotation"执行多个转换 . 适用于运行Mavericks的Mac上的iOS捕获视频,但应该可以轻松导出 . 依赖已安装 exiftoolffmpeg .

    #!/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
    

相关问题