Sign up ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have a video that was recorded upside down. Is it possible to correct this with FFmpeg?

share|improve this question
Are you asking about flipping it during a playback or re-encoding with correct orientation? – Mxx Apr 5 '13 at 6:37
@Mxx I was thinking re-encoding, but what did you mean by during playback? – Louis Apr 5 '13 at 6:38
Media players that use ffmpeg as a decoding backend can also utilize all of its filters. See this screenshot "Offset and flip" filter. Also see – Mxx Apr 5 '13 at 6:44
Oh okay, cool. That would work for me, but I also want to share it. I'll take a look at the SO question. – Louis Apr 5 '13 at 6:46

5 Answers 5

up vote 47 down vote accepted



ffmpeg will automatically rotate the video unless:

  • your input contains no rotate metadata
  • your ffmpeg is too old

Rotation metadata

Some videos, such as from iPhones, are not physically flipped, but contain video stream displaymatrix side data or rotate metadata. Some players ignore these metadata and some do not. Refer to ffmpeg console output to see if your input has such metadata:

$ ffmpeg -i input.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
      rotate          : 180
    Side data:
      displaymatrix: rotation of -180.00 degrees


ffmpeg will automatically physically rotate the video according to any existing video stream rotation metadata.

You need a build that includes commit 1630224, from 2 May 2015, to be able to use the autorotation feature.


ffmpeg -i input.mp4 -c:a copy output.mp4

To disable this behavior use the -noautorotate option.

If the input contains no metadata or if your ffmpeg is old

You will have to use a filter to rotate the video, and if any rotate metadata exists it will have to be removed as shown in the examples below:


Using ffmpeg you have a choice of three methods of using video filters to rotate 180°.

hflip and vflip

ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv


ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4


This filter can rotate to any arbitrary angle and uses radians as a unit instead of degrees. This example will rotate π/1 radians, or 180°:

ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

You can use degrees instead. One degree is equal to π/180 radians. So if you want to rotate 45°:

ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

When using the rotate filter, the bilinear interpolation should be turned off (by using bilinear=0) for angles divisible by 90, otherwise it may look blurry.


  • Filtering requires encoding. These examples make H.264 video outputs. See the FFmpeg H.264 Video Encoding Guide for guidance on getting the quality you want.

  • Chroma subsampling. I included format=yuv420p since ffmpeg will attempt to minimize or avoid chroma subsampling (depending on the encoder, input, ffmpeg version, etc). This is good behavior in a purely technical sense, but most players are incompatible with more "advanced" chroma subsampling schemes. This is the same as using -pix_fmt yuv420, but is conveniently located in the filterchain.

  • Copy the audio. The -codec:a copy option will stream copy (re-mux) instead of encode. There is no reason to re-encode the audio if you just want to manipulate the video only (unless you want to convert to a different audio format). This will save time since encoding is time consuming and it will preserve the quality of the audio.

Rotate upon playback

Alternatively you can rotate upon playback and avoid re-encoding. ffplay will automatically rotate:

ffplay input.mp4

If there is no displaymatrix side data or rotate metadata then you can use filters:

ffplay -vf "hflip,vflip" -i input.mp4

...or refer to your favorite player. Most players worth using, like VLC, have this capability.

Getting ffmpeg

Older builds of ffmpeg do not include filtering capabilities. See the FFmpeg download page for several options including convenient builds for Linux, OS X, and Windows, or refer to the FFmpeg Wiki for step-by-step ffmpeg compile guides.

share|improve this answer
Thanks, I just finished trying -vf vflip and it worked like a charm. But it was a re-encode. I'm not sure if I'm reading you right. Are you saying -vf hflip,vflip won't re-encode? – Louis Apr 5 '13 at 6:52
@Louis ffmpeg requires that you re-encode when using video and audio filters. However, ffplay can also utilize many of the filters during playback as shown in my second example. – LordNeckbeard Apr 5 '13 at 6:55
Ah, didn't notice it was a different program. – Louis Apr 5 '13 at 6:57
@Louis rotate uses radians as a unit instead of degrees. I think people are more familiar with degrees, so I attempted to show how to use degrees in the example. One degree is equal to π/180 radians. So if you want to rotate 45° simply use rotate="45*(PI/180)". – LordNeckbeard Dec 10 '13 at 18:27
@Albin. Thanks for the note. I was aware of this feature but have been traveling and will update this answer when I get back home. – LordNeckbeard Jun 18 at 1:28

Media players that use ffmpeg as a decoding backend can also utilize all of its filters. See this screenshot with "Offset & flip" filter. enter image description here

Alternatively, if you want to re-encode your video, check out Rotating videos with FFmpeg on Stackoverflow.

share|improve this answer
Unfortunately the transpose filter referenced in Rotating videos with FFmpeg will not rotate 180° as far as I can tell. – LordNeckbeard Apr 5 '13 at 7:06
@LordNeckbeard not directly, but you can chain two transpose filters together to achieve the effect. – evilsoup Apr 5 '13 at 8:56
@evilsoup Ah, yes, I didn't think of that. Spatial reasoning is hard; let's go shopping. Feel free to update my answer with an example. – LordNeckbeard Apr 7 '13 at 2:17

Following is a bash script which will output the files with the directory structure under "fixedFiles". It transforms and rotates iOS videos and transcodes AVIs. The script relies on having installed both exiftool and ffmpeg.


# 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
IFS=$(echo -en "\n\b")

#Bit Rate

#where to store fixed files

VLC_START="/Applications/ -I dummy -vvv"

# Processing of MOV in the wrong orientation
for f in `find . -regex '\./.*\.MOV'` 
  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\" )

#      $(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\" )



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

# Processing of AVI files for my Panasonic TV
# Use ffmpegX + QuickBatch. Bitrate at 16384. Camera res 640x424
for f in `find . -regex '\./.*\.AVI'` 
  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 ==================================================================


share|improve this answer

FFMPEG recently changed the default behavior to auto rotate input video sources with "rotate" meta data.

So a new solution to this problem would be to update FFMPEG to 2.7 or the git master branch.

However: If you have already implemented one of these solutions and update this is bad news. FFMPEG will rotate your video before your filters will rotate again, causing the original problem to reappear. If you don't want to upgrade to 2.7 but want to ensure you're future-proof there's an option to turn off autorotation with -noautorotate. Using LordNeckbeards first example this would be:

ffmpeg -noautorotate -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mkv

This will work in both old releases and 2.7, but for older versions you might still have to update to the latest "patch" version (see semver to learn what patch is) for this to work.

share|improve this answer

Here are the steps:

  1. First open your video file in QuickTime. You can either fire up QuickTime first, go to “File” and then down to “Open File”. Or you could right-click the file itself, choose “Open With” and then choose QuickTime.

  2. Once the video is open click “Edit” and you’ll then find the rotate and flip options straight below

  3. Once you’ve locked the orientation you want, you then have to export your video with the new changes you’ve added. You’ll find the “Export” option under the “File” menu in QuickTime.

Choose the file settings you want to export as and click “Ok”, to kick off the export.

When the export operation is complete, you’ll find your new file where ever you chose to save it with the correct orientation!

This whole fix took me less than 5 minutes to complete, but depending on the length of the video, it could take much longer (or shorter, again, it varies).

blog source

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.