

When I tried -lossless 1 on a low-quality mp4, the resulting webm was 100× larger, which was not accceptable to me. The -lossless 1 option of ffmpeg’s VP9 encoder enables lossless quality mode, but with a potentially enormous increase in filesize.Īll you need is this: ffmpeg -i input.mp4 -lossless 1 output.webm If you mean “without quality loss” literally A word about transcodingīy the way, in general, transcoding formats (taking a compressed video and recompressing it with a different codec) is a bad idea as you’ll not only add the normal errors from lossy video encoding, but you’ll waste bits in the new format trying to preserve the artifacts from the old. Please see the ffmpeg VP9 documentation if you’d like to learn more. The first pass compiles statistics about the video which is then used in the second pass to make a smaller and higher quality video. While that can be useful for streaming, it reduces quality significantly as frames with a lot of motion will not have the bandwidth needed to look good.Īnother part of the reason you’re losing quality is that webm (VP9) prefers to encode in two passes for best results. If you do not specify a video bitrate, it defaults to something low which gets you Constrained Quality mode, where each frame has a maximum bitrate. It is important to set the video bitrate to zero. For VP9, the CRF can range from 0 (best quality) to 63 (smallest file size). Setting the video bitrate to zero while also specifying the CRF (Constant Rate Factor) enables Constant Quality mode which targets a certain perceptual quality level. Use two-pass Constant Quality mode:¹ ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm -y /dev/nullįfmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm
