用FFmpeg旋转video
我一直想弄清楚如何用FFmpeg旋转video。 我正在使用纵向模式拍摄的iPhonevideo。 我知道如何使用MediaInfo (优秀的库,顺便说一句)确定当前的旋转度,但我现在卡在FFmpeg。
从我读到的,你需要使用的是一个vfilter选项。 根据我所看到的,应该是这样的:
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
但是,我无法得到这个工作。 首先, -vfilters不再存在,现在只是-vf 。 其次,我得到这个错误:
No such filter: 'rotate' Error opening filters!
据我所知,我有一个FFmpeg的所有选项的构build。 运行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选项是伟大的,但他们只是不会让我需要去的地方。 我需要能够旋转video90度至less。 270度将是一个很好的select。 旋转选项哪里去了?
顺时针旋转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版本(静态构build将正常工作)。
请注意,这将重新编码audio和video部分。 您通常可以通过使用-c:a copy
来复制audio而不用触摸它。 要更改video质量,请设置比特率(例如,使用-b:v 1M
),或者在需要VBR选项时查看H.264编码指南 。
一个解决scheme也是使用这个便捷的脚本 。
你尝试过transpose
吗? 像(从另一个答案)
ffmpeg -i input -vf transpose=2 output
如果您使用的是旧版本,则必须更新ffmpeg才能使用转置function,因为它已于2011年10月添加。
FFmpeg 下载页面提供了静态构build,您可以直接执行而无需编译它们。
如果您不想重新编码video,而您的播放器可以处理旋转元数据,则可以使用ffmpeg更改元数据中的旋转:
ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v
我在search相同的答案时遇到了这个页面。 现在已经有六个月的时间了,从那以后,这个版本已经被多次更新了。 不过,我想为在这里寻找这些信息的其他人添加一个答案。
我正在使用这些存储库中的Debian Squeeze和FFmpeg版本。
ffmpeg的MAN页面指出以下用途
ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg
关键在于您不要使用度数variables,而是从MAN页面预定义设置variables。
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
工作正常
要顺时针旋转图片,可以使用旋转滤镜,以弧度表示正angular度。 用90度等同于PI / 2,你可以这样做:
ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
逆时针angular度必须是负的
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
转置滤波器可以同样适用于90度,但对于其他angular度来说,这是一个更快或唯一的select。
如果你得到一个“编解码器是实验性的,但实验编解码器没有启用”错误使用这个:
ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile
发生与我一些.mov文件与AACaudio。
该脚本将输出具有“fixedFiles”下的目录结构的文件。 目前是固定的MOV文件,并会根据video的原始“旋转”执行一些转换。 在运行Mavericks的Mac上使用iOS捕获的video,但应该可以轻松导出。 依靠安装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
Alexy的回答几乎为我工作,除了我得到这个错误:
时基1/90000不受MPEG 4标准支持,时基分母的最大允许值为65535
我只需要添加一个参数(-r 65535/2733)到命令,它的工作。 完整的命令是这样的:
ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4
不幸的是,Ubuntu版本的ffmpeg确实支持videofilter。
您需要使用avidemux或其他编辑器来达到相同的效果。
在编程方式,mencoder已被推荐。