I recently got it into my head to compare the various popular video codecs in an effort to better understand how av1 works and looks compared to x264 and x265. I also had ideas of using a intel video card to compress a home video security setup, and what levels of compression I would need to get good results.
The Setup
I used the 4k 6.3gb blender project, tears of steel as a source. I downscaled the video to 1080p using all three codecs, and then attempted to compare the results using various crf levels.
To compare results I used imgsli, FFMetrics, and my own picture viewer to try and see what the differences are.
The Results
crf | av1 KB | x265 KB | x264 KB |
---|---|---|---|
18 | 419,261 | 632,079 | 685,217 – x246 visually lossless |
21 | 352,337 | 390,358 – x265 visually lossless | 411,439 |
24 | 301,517 – av1 VAMF visually lossless | 250,426 | 263,524 – x264 good enough |
27 | 245,685 | 165,079 – x265 good enough | 176,919 |
30 | 205,008 | 110,062 | 122,458 |
33 | 168,192 | 73,528 | 86,899 |
36 | 139,379 – av1 My visually lossless | 48,516 | 63,214 |
39 | 116,096 | 31,670 | 47,161 |
42 | 97,365 – av1 my good enough | 20,636 | 35,801 |
45 | 81,805 | 13,598 | 27,484 |
48 | 69,044 | 9,726 | 20,823 |
51 | 58,316 | 8,586 – worst possible | 16,120 – worst possible |
54 | 48,681 | - | - |
57 | 39,113 | - | - |
60 | 29,062 | - | - |
63 | 16,533 – worst possible | - | - |
I go into more detail with the hows and whys of my choices, in my journal-style blog post, as well as how i came to these conclusions, But in essence, if you want to lose practically no visual information, crf24 through 36 for av1, crf 21 for x265, and crf 18 for x264 will do the job.
If you are low on space, using my ‘good enough’ choices will get you practically the same visual results while using less space, depending on the codec.
A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don’t control.
Rules:
Be civil: we’re here to support and learn from one another. Insults won’t be tolerated. Flame wars are frowned upon.
No spam posting.
Posts have to be centered around self-hosting. There are other communities for discussing hardware or home computing. If it’s not obvious why your post topic revolves around selfhosting, please include details to make it clear.
Don’t duplicate the full text of your blog or github here. Just post the link for folks to click.
Submission headline should match the article title (don’t cherry-pick information from the title to fit your agenda).
No trolling.
Resources:
Any issues on the community? Report it using the report flag.
Questions? DM the mods!
The issue is, you can optimize a software encoders continually, you can use tricks for better quality etc.
A hardware encoder is just that - hardware. As soon as it’s burned to the silicon, you’re not making any (at least substantial) changes to it. You might also be limited by what you can actually do directly in hardware without using too much die space.
Tldr.: no, you won’t get the same result
What I’m saying is, shouldn’t you?
What you describe is true for many file formats, but for most lossy compression systems the “standard” basically only strictly explains how to decode the data and any encoder that produces output that successfully decodes that way is fine.
And the standard defines a collection of “tools” that the encoders can use and how exactly to use, combine and tweak those tools is up to the encoder.
And over time new/better combinations of these tools are found for specific scenarios. That’s how different encoders of the same codec can produce very different output.
As a simple example, almost all video codecs by default describe each frame relative to the previous one (I.e. it describes which parts moved and what new content appeared). There is of course also the option to send a completely new frame, which usually takes up more space. But when one scene cuts to another, then sending a new frame can be much better. A “bad” codec might not have “new scene” detection and still try to “explain the difference” to the previous scene, which can easily take up more space than just sending the entire new frame.
Ah, okay, this explains the whole aspect of it then, for me. :-) If this is how a certain format is described, then it makes sense that encoders can produce different data, which then will be decoded as different output as well, all while all parties are compliant with the specification. That makes much more sense. Thanks for taking the time to explain everything, including I-frames and P-frames! ;-)