FFMPEG: crop a video without losing the quality

2019-03-24 10:54发布

问题:

I have mp4 video of 1920x1080. I would like to crop the video to 480x270 without quality loss.

I am using the following command:

ffmpeg -i input.mp4 -filter:v "crop=480:270:200:200" -crf 23 output.mp4

I also tried:

ffmpeg -i input.mp4 -filter:v "crop=480:270:200:100" -c:a copy -qp 0 output.mp4

I used -crf 23 and -qp 0 for loseless video cropping, but after cropping video has lost quality.

Does anyone know how I can crop the video without losing the quality?

回答1:

You can't perform any filtering without losing quality when encoding to a lossy format, but you have some options.

Crop with your player

A possible solution would be to crop during playback, so you don't even need to re-encode. It is also useful to preview a crop.

With ffplay and crop filter:

ffplay -vf "crop=480:270:200:100" input.mp4

With vlc (or cvlc):

vlc input.mp4 --crop=480x270+200+100

Or you could crop with the VLC GUI: Tools > Effects & Filters > Video Effects > Crop.

This method will not create an output file. This will use your video player to crop while it is playing. See one of the other methods if you want an output file.

Use a lossless format

ffmpeg can encode with several lossless encoders: ffv1, huffyuv, ffvhuff, utvideo, libx264 (using -crf 0 or -qp 0). The output will be lossless but the output file will be huge.

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v ffv1 -c:a copy output.mkv

or

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v libx264 -crf 0 -c:a copy output.mp4

Accept some quality loss

Give it enough bits and you may not be able to tell there is a quality difference:

ffmpeg -i input -vf "crop=480:270:200:100" -c:v libx264 -crf 17 -c:a copy ouput.mp4

See FFmpeg Wiki: H.264 Video Encoding Guide for more info.

If your input is MJPEG

Stream copy the individual images with ffmpeg, crop them losslessly with jpegtran, then remux them with ffmpeg. This will result in no loss, but you will be restricted to the ancient MJPEG format.



回答2:

At a basic level you cannot make use of a lossy encoding and then expect it to not lose quality when you decode and then encode again. The only way that works is to make use of a lossless codec, for example Quicktime with the Animation codec. This is just a basic truth of digital video production that you cannot work around by just passing command line options to ffmpeg.



回答3:

This is not possible using ffmpeg.

As alternative you can embed your video in a Matroska (.mkv) container and set a cropping tag in the file header, but it must be supported by your player.

Reportedly, for H264-encoded videos H264info can also be used, but i still need to figure out how to use it...



标签: video ffmpeg