ffmpeg - how to apply filters without losing quality
ffmpeg
Solution
You must re-encode to perform any filtering
Therefore any attempt at stream copying while filtering will be ignored. This is why `-codec copy` does nothing for you.
Lossy, but looks lossless
Alternatively you can use proper encoding settings that look "visually lossless", but technically are not truly lossless. Example for H.264:
ffmpeg -i input -codec:v libx264 -crf 18 -preset slow -vf format=yuv420p out.mp4
`-crf` controls quality: range is a log scale of 0-51, 0 is lossless, ~18 is often considered visually lossless, and 23 is default.
`-preset` controls encoding speed and therefore compression efficiency: ultrafast, superfast, veryfast, faster, fast, medium (the default), slow, slower, veryslow.
`-vf format=yuv420p` uses a compatible chroma subsampling required by most players.
Using a lossless format
Although you must re-encode for filtering it does not mean that you have to lose quality. You can use a lossless encoder, such as:
- `-codec:v libx264 -crf 0 -preset veryslow`
- `-codec:v ffv1`
The output file size can be huge–generally much bigger than your input file.
Use CSS or your player to add the watermark
Avoid encoding completely and just deal with the watermark with CSS or with your HTML5 video player.
Also see
- FFmpeg Wiki: H.264
Problem
Here is a simple request, it has an input, output, and two watermarks. From what I gathered I can't apply `-codec copy` because I'm using a filter. ``` ffmpeg -i input.mp4 -i wm-bl.png -i wm-br.png -filter_complex "overlay=x=0:y=H-h,overlay=x=W-w:y=H-h" output.mp4 ``` This does the trick, as far as watermarking is concerned, but the output is compressed into half the original file size. Is it possible to watermark without losing video quality?