I've been trying to figure out how to rotate video using FFmpeg. I'm using iPhone Video in portrait mode. I know how to use it MediaInfo (great library, by the way) determine the current rotation angle, but now I'm stuck with FFmpeg.
According to my reading, you need to use the vfilter option. From what I see, it should look like this:
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
But I can't make it work. First, - vfilters no longer exist, now it's just - vf. Second, I got the mistake:
No such filter: 'rotate' Error opening filters!
As far as I know, I have a full option build of FFmpeg. Run FFmpeg filters as follows:
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.
It's great to have vflip and hflip options, but they just don't get me where I need to go. I need to be able to rotate the video at least 90 degrees. 270 degrees is also an excellent choice. Where is the rotation option?
#1 building
If you encounter the error codec is in experimental state, but experimental codec is not enabled, use the following command:
ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile
Some. mov files with AAC Audio happened with me.
#2 building
Alexy's answer was almost useful to me, except that I encountered the following errors:
MPEG 4 standard does not support time base 1 / 90000, and the maximum allowed value of time base denominator is 65535
I just need to add a parameter (- r 65535/2733) to the command. Therefore, the complete command is:
ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4
#3 building
This script will output files with directory structure under "fixedFiles". Currently pinned to MOV files, many transformations will be performed based on the original "rotation" of the video. It can be used with iOS captured videos on a Mac running Mavericks, but it should be easy to export. It depends on that exiftool and ffmpeg are installed at the same time.
#!/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
#4 building
To rotate the picture clockwise, use the rotation filter to show a positive angle in radians. 90 degrees equals PI / 2, you can do this:
ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
For counter clockwise, the angle must be negative
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
The transposed filter works well at 90 degrees, but it's a faster choice for other angles.
#5 building
If you do not want to recode the video and the player can process the rotation metadata, you can use ffmpeg to change the rotation in the metadata:
ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v