Convert a video to a fixed screen size by cropping and resizing

23,017

Something like this should work with the proper parameters for each case:

Note: The original answer was posted in this link: How can I crop a video with ffmpeg? which originally posted by me and edited several times in order to update it to the newest options in the most recent versions of ffmpeg. Many thanks to slhck, Jonathan., Anton Rudeshko, LordNeckbeard and future maintainers.


In recent versions of FFmpeg, use the crop filter:

ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4

Where the options are as follows:

  • out_w is the width of the output rectangle
  • out_h is the height of the output rectangle
  • x and y specify the top left corner of the output rectangle

Original image

original image
Original 320x240 image

Example 1

80x60

To crop a 80×60 section, starting from position (200, 100):

ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4
  • The audio is stream copied in this example, so re-encoding is avoided.

Example 2

bottom right quarter

To crop the bottom right quarter:

ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4

This is the same as:

ffmpeg -i in.mp4 -filter:v "crop=320/2:240/2:320/2:240/2" -c:a copy out.mp4

Which is the same as:

ffmpeg -i in.mp4 -filter:v "crop=240:120:240:120" -c:a copy out.mp4
  • You can refer to the input image size with in_w and in_h as shown in this first example. The output width and height can also be used with out_w and out_h.

Example 3

20 pixels from the top, and 20 from the bottom

Crop 20 pixels from the top, and 20 from the bottom:

 ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4
  • The filter will automatically center the crop if x and y are omitted such as in this example.

Previewing

You can take a crop (heh heh) and preview it live with ffplay:

ffplay -i input -vf "crop=in_w:in_h-40"

This way you can experiment and adjust your cropping without the need to encode, view, repeat.

Notes

  • crop filter documentation

  • Default encoder for MP4 is libx264 (H.264 video) or mpeg4 (MPEG-4 Part 2 video) depending on your ffmpeg build. See FFmpeg Wiki: H.264 Video Encoding Guide for more info.

  • Instead of cropping and re-encoding, consider cropping upon playback. This is possible with any player worth using.

  • Ancient ffmpeg builds used -croptop, -cropbottom, -cropleft, -cropright options instead of the crop filter. If this is the case for you then get a modern ffmpeg. Development is very active and there is no reason to use an antique.

Share:
23,017

Related videos on Youtube

Admin
Author by

Admin

Updated on September 18, 2022

Comments

  • Admin
    Admin almost 2 years

    I've tried to figure this out myself, but the myriad of options just baffles me.

    I want to use ideally either ffmpeg or mencoder (or something else, but those two I know I have working) to convert any incoming video to a fixed screen size.

    If the video is wider or too short for it, then centre crop the video. If it's then not the right size, the resize up or down to make it exactly the fixed screen size.

    The exact final thing I need is 720x480 in a XVid AVI with an MP3 audio track.

    I've found lots of pages showing how to resize to a maximum resolution, but I need the video to be exactly that resolution (with extra parts cropped off, no black bars).

    Can anyone tell me the command line to run - or at least get me some/most of the way there? If it needs to be multiple command lines (run X to get the resolution, do this calculation and then run Y with the output of that calculation) I can script that.

  • SpeedCoder5
    SpeedCoder5 over 5 years
    Extra points for Previewing with ffplay which makes using ffmpeg to crop video screen size workable in practice.