Add old WordPress content
This commit is contained in:
@@ -14,7 +14,7 @@ tags: [Satisfactory, 'WordPress Archive']
|
||||
|
||||
<p class="block">In my entire play time, I've found a total of three Purple Power Slugs, and only two of them are within an Area that I can actually reach.</p>
|
||||
|
||||
<pre><ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00009.jpg" alt="" data-id="729" data-link="https://www.xaymar.com/?attachment_id=729" class="wp-image-729"/><figcaption>Green Power Slug</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00004-1.jpg" alt="" data-id="731" data-link="https://www.xaymar.com/?attachment_id=731" class="wp-image-731"/><figcaption>Purple Power Slug</figcaption></figure></li></ul></pre>
|
||||
<pre><ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item"><figure><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00009.jpg" alt="" data-id="729" data-link="https://www.xaymar.com/?attachment_id=729" class="wp-image-729"/><figcaption>Green Power Slug</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00004-1.jpg" alt="" data-id="731" data-link="https://www.xaymar.com/?attachment_id=731" class="wp-image-731"/><figcaption>Purple Power Slug</figcaption></figure></li></ul></pre>
|
||||
|
||||
<h2 class="block">Host and Client have different Mechanics</h2>
|
||||
|
||||
@@ -26,13 +26,13 @@ tags: [Satisfactory, 'WordPress Archive']
|
||||
|
||||
<p class="block">You may not initially want to do it, but once you reach Stackable Poles, vertical building becomes your friend. You can stuff a lot of things into a vertical block that wouldn't fit as a flat plane anywhere, and it makes things a ton easier if you actually do move things into a vertical layout. Just make sure you give yourself enough room to work.</p>
|
||||
|
||||
<pre><figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00011.jpg" alt="" class="wp-image-738"/><figcaption>One of the layers of my Iron production line</figcaption></figure></pre>
|
||||
<pre><figure class="wp-block-image"><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00011.jpg" alt="" class="wp-image-738"/><figcaption>One of the layers of my Iron production line</figcaption></figure></pre>
|
||||
|
||||
<h2 class="block">Dropped Items can be a Temporary Platform</h2>
|
||||
|
||||
<p class="block">If you just need to get there quickly, Leaves and other Items can be dropped in small stacks to create a platform that you can collide with and stand on. Use this to quickly get up somewhere without wasting a ton of cement in the process. This only works if there is no ground in range vertically.</p>
|
||||
|
||||
<pre><figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00012.jpg" alt="" class="wp-image-742"/><figcaption>Leaves used as a temporary wasteless bridge.</figcaption></figure></pre>
|
||||
<pre><figure class="wp-block-image"><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00012.jpg" alt="" class="wp-image-742"/><figcaption>Leaves used as a temporary wasteless bridge.</figcaption></figure></pre>
|
||||
|
||||
<h2 class="block"> Work-In-Progress Mercer Spheres</h2>
|
||||
|
||||
|
||||
@@ -18,13 +18,13 @@ tags: [Satisfactory, 'WordPress Archive']
|
||||
|
||||
<p class="block">Not exactly as groundbreaking as most things, but this allows lining up things to the actual resource node better.</p>
|
||||
|
||||
<pre><figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00000.jpg" alt="" class="wp-image-715"/><figcaption>Just mining my Foundation.</figcaption></figure></pre>
|
||||
<pre><figure class="wp-block-image"><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00000.jpg" alt="" class="wp-image-715"/><figcaption>Just mining my Foundation.</figcaption></figure></pre>
|
||||
|
||||
<h2 class="block">Balance your Conveyor Lines</h2>
|
||||
|
||||
<p class="block">If you have more than a single input conveyor, such as when you're mining ore and there's two, three or even four miners required, you should consider building a balancer. Balancers help distribute the input lines evenly to all output lines, such as balancing 3 inputs to feed all three outputs equally.</p>
|
||||
|
||||
<pre><figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00001.jpg" alt="" class="wp-image-716"/><figcaption>3 Input, 3 Output Ore Balancer</figcaption></figure></pre>
|
||||
<pre><figure class="wp-block-image"><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00001.jpg" alt="" class="wp-image-716"/><figcaption>3 Input, 3 Output Ore Balancer</figcaption></figure></pre>
|
||||
|
||||
<p class="block">Balancers can be built in any shape, size or configuration. I've personally only needed 3-In-3-Out balancers so far, but configurations like 2-In-6-Out, 6-In, 2-Out, 6-In-6-Out, 5-In-5-Out and so on should all be possible as the Splitters and Mergers are much more intelligent than the ones in Factorio.</p>
|
||||
|
||||
@@ -36,4 +36,4 @@ tags: [Satisfactory, 'WordPress Archive']
|
||||
|
||||
<p class="block">It's never too early to optimize your production lines, and it only gets easier the more materials you've saved up. Build Balancers, build huge production facilities for even more inputs, just really go all out and build for 10 times what you actually need right now.</p>
|
||||
|
||||
<pre><ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00003.jpg" alt="" data-id="721" data-link="https://www.xaymar.com/?attachment_id=721" class="wp-image-721"/><figcaption>3x3 Ore Balancer goes into Iron Production</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00002-2.jpg" alt="" data-id="722" data-link="https://www.xaymar.com/?attachment_id=722" class="wp-image-722"/><figcaption>3x6 Iron Production with Buffering</figcaption></figure></li></ul></pre>
|
||||
<pre><ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item"><figure><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00003.jpg" alt="" data-id="721" data-link="https://www.xaymar.com/?attachment_id=721" class="wp-image-721"/><figcaption>3x3 Ore Balancer goes into Iron Production</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://cdn.xaymar.com/blog/2019/03/ScreenShot00002-2.jpg" alt="" data-id="722" data-link="https://www.xaymar.com/?attachment_id=722" class="wp-image-722"/><figcaption>3x6 Iron Production with Buffering</figcaption></figure></li></ul></pre>
|
||||
|
||||
@@ -6,4 +6,4 @@ tags: ['WordPress Archive']
|
||||
|
||||
<p class="block">Started cleaning up my garden again as the ground isn't frozen anymore and I can actually do work on everything again. So I took my Camera with me, and made some close (really still 80cm away) shots of things. I'm looking forward to owning an actual Macro lens for this purpose.</p><!--more-->
|
||||
|
||||
<pre><figure class="wp-block-gallery columns-0 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1351.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1351.jpg" alt="" data-id="803" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1351.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1351/" class="wp-image-803"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1349.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1349.jpg" alt="" data-id="802" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1349.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1349/" class="wp-image-802"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1343.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1343.jpg" alt="" data-id="801" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1343.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1343/" class="wp-image-801"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1340.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1340.jpg" alt="" data-id="800" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1340.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1340/" class="wp-image-800"/></a></figure></li></ul></figure></pre>
|
||||
<pre><figure class="wp-block-gallery columns-0 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><a href="https://cdn.xaymar.com/blog/2019/04/DSC1351.jpg"><img src="https://cdn.xaymar.com/blog/2019/04/DSC1351.jpg" alt="" data-id="803" data-full-url="https://cdn.xaymar.com/blog/2019/04/DSC1351.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1351/" class="wp-image-803"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://cdn.xaymar.com/blog/2019/04/DSC1349.jpg"><img src="https://cdn.xaymar.com/blog/2019/04/DSC1349.jpg" alt="" data-id="802" data-full-url="https://cdn.xaymar.com/blog/2019/04/DSC1349.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1349/" class="wp-image-802"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://cdn.xaymar.com/blog/2019/04/DSC1343.jpg"><img src="https://cdn.xaymar.com/blog/2019/04/DSC1343.jpg" alt="" data-id="801" data-full-url="https://cdn.xaymar.com/blog/2019/04/DSC1343.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1343/" class="wp-image-801"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://cdn.xaymar.com/blog/2019/04/DSC1340.jpg"><img src="https://cdn.xaymar.com/blog/2019/04/DSC1340.jpg" alt="" data-id="800" data-full-url="https://cdn.xaymar.com/blog/2019/04/DSC1340.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1340/" class="wp-image-800"/></a></figure></li></ul></figure></pre>
|
||||
|
||||
@@ -11,7 +11,7 @@ tags: ['Re:Legend','Modding', 'WordPress Archive']
|
||||
<p class="block">As the game had no modding API that was visible, the only thing I could do is to figure out what tools I need for injecting new code. And as the game is made with Unity, the same engine that Risk of Rain 2 runs on, I figured I could reuse the toolset from there. </p>
|
||||
|
||||
<!-- wp:image {"id":869,"align":"right","width":311,"height":199,"linkDestination":"media"} -->
|
||||
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://www.xaymar.com/wp-content/uploads/2019/09/image.png" target="_blank" rel="noreferrer noopener"><img src="https://www.xaymar.com/wp-content/uploads/2019/09/image.png" alt="" class="wp-image-869" width="311" height="199"/></a><figcaption>Knowing which .Net SDK to use is half the battle.</figcaption></figure></div>
|
||||
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://cdn.xaymar.com/blog/2019/09/image.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.xaymar.com/blog/2019/09/image.png" alt="" class="wp-image-869" width="311" height="199"/></a><figcaption>Knowing which .Net SDK to use is half the battle.</figcaption></figure></div>
|
||||
|
||||
<p class="block">All I needed to figure out was which .Net version the game was compiled against, and there was a handy tool for it: <a href="http://ntinfo.biz/index.html#detect_it_easy">Detect It Easy</a>. Loading the Assembly-CSharp.dll into it revealed that the game was built against .Net 4.0, which means that I needed a BepInEx compatible with Unity 2017 and newer. </p>
|
||||
|
||||
@@ -22,7 +22,7 @@ tags: ['Re:Legend','Modding', 'WordPress Archive']
|
||||
<p class="block">If you aren't familiar with Unity, the binary Assembly-CSharp.dll holds compiled and usually optimized compiled game code written in C#, and also usually contains most dependendencies that don't have their own .dll file. So what we need is a disassembly tool that can deal with optimized compiled code and give back a reasonable representation of the actual code.</p>
|
||||
|
||||
<!-- wp:image {"id":870,"align":"right","width":304,"height":226,"linkDestination":"media"} -->
|
||||
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://www.xaymar.com/wp-content/uploads/2019/09/image-1.png" target="_blank" rel="noreferrer noopener"><img src="https://www.xaymar.com/wp-content/uploads/2019/09/image-1.png" alt="" class="wp-image-870" width="304" height="226"/></a><figcaption>ILSpy in action.</figcaption></figure></div>
|
||||
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://cdn.xaymar.com/blog/2019/09/image-1.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.xaymar.com/blog/2019/09/image-1.png" alt="" class="wp-image-870" width="304" height="226"/></a><figcaption>ILSpy in action.</figcaption></figure></div>
|
||||
|
||||
<p class="block">After a bit of searching for a C# disassembler I decided to use <a href="https://github.com/icsharpcode/ILSpy">ILSpy</a>, which performed the task better than most other tools and did not crash no matter what I threw at it. Loading Assembly-CSharp.dll into it gave me a near instant disassembled version of the game code, although mostly lacking comments since those get removed.</p>
|
||||
|
||||
@@ -35,7 +35,7 @@ tags: ['Re:Legend','Modding', 'WordPress Archive']
|
||||
<p class="block">A little while later after delving into the disassembled code, I found the place that I needed to modify: global::TutorialManager::StartDisplayTutorial. The functionality that it currently had was to enable the tutorial panel, disable quitting the game, stop all player interaction, search and initialize the tutorial, unlock the tutorial and then finally set up the UI and display it. We don't want it to do anything but unlock the tutorial.</p>
|
||||
|
||||
<!-- wp:image {"id":867,"align":"right","width":299,"height":128,"linkDestination":"media"} -->
|
||||
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://www.xaymar.com/wp-content/uploads/2019/09/2019-09-04T14-16-10_Code_QuickUnluckyRasbora.png" target="_blank" rel="noreferrer noopener"><img src="https://www.xaymar.com/wp-content/uploads/2019/09/2019-09-04T14-16-10_Code_QuickUnluckyRasbora.png" alt="" class="wp-image-867" width="299" height="128"/></a><figcaption>Skipping Tutorials made easy - they don't even show up now!</figcaption></figure></div>
|
||||
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://cdn.xaymar.com/blog/2019/09/2019-09-04T14-16-10_Code_QuickUnluckyRasbora.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.xaymar.com/blog/2019/09/2019-09-04T14-16-10_Code_QuickUnluckyRasbora.png" alt="" class="wp-image-867" width="299" height="128"/></a><figcaption>Skipping Tutorials made easy - they don't even show up now!</figcaption></figure></div>
|
||||
|
||||
<p class="block">As TutorialManagers UnlockTutorial was private, but the unlockTutorials List was not, the override was a simple as just calling SearchTutorial, then adding the tutorial to the unlockTutorials List, and finally just calling EndTutorial(). </p>
|
||||
|
||||
|
||||
@@ -65,13 +65,13 @@ tags: ['StreamFX', 'WordPress Archive']
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:image {"id":969,"sizeSlug":"full","linkDestination":"media"} -->
|
||||
<figure class="wp-block-image size-full"><a href="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-07_obs64_FruitfulStrangePapillon.jpg"><img src="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-07_obs64_FruitfulStrangePapillon.jpg" alt="" class="wp-image-969"/></a><figcaption>With Color Grading</figcaption></figure>
|
||||
<figure class="wp-block-image size-full"><a href="https://cdn.xaymar.com/blog/2019/12/2019-12-22T15-47-07_obs64_FruitfulStrangePapillon.jpg"><img src="https://cdn.xaymar.com/blog/2019/12/2019-12-22T15-47-07_obs64_FruitfulStrangePapillon.jpg" alt="" class="wp-image-969"/></a><figcaption>With Color Grading</figcaption></figure>
|
||||
<!-- /wp:image --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:image {"id":971,"sizeSlug":"full","linkDestination":"media"} -->
|
||||
<figure class="wp-block-image size-full"><a href="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-13_obs64_HauntingLightsteelblueStud.jpg"><img src="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-13_obs64_HauntingLightsteelblueStud.jpg" alt="" class="wp-image-971"/></a><figcaption>Without Color Grading</figcaption></figure>
|
||||
<figure class="wp-block-image size-full"><a href="https://cdn.xaymar.com/blog/2019/12/2019-12-22T15-47-13_obs64_HauntingLightsteelblueStud.jpg"><img src="https://cdn.xaymar.com/blog/2019/12/2019-12-22T15-47-13_obs64_HauntingLightsteelblueStud.jpg" alt="" class="wp-image-971"/></a><figcaption>Without Color Grading</figcaption></figure>
|
||||
<!-- /wp:image --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
+8
-26
@@ -1,36 +1,18 @@
|
||||
---
|
||||
title: 'Stepping Down as the Maintainer for the AMD Encoder Plugin'
|
||||
category: Blog
|
||||
tags: [AMD, AMF, OBS]
|
||||
unpublished: true
|
||||
tags: [AMD, AMF, OBS, OBS Studio]
|
||||
published: false
|
||||
---
|
||||
|
||||
<pre>
|
||||
<!-- wp:paragraph -->
|
||||
<p>I'm stepping down from the maintainer position for the AMD Encoder, and am removing myself from the OBS Project team <em>permanently</em>.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<p class="block">I'm stepping down from the maintainer position for the AMD Encoder, and am removing myself from the OBS Project team <em>permanently</em>.</p><!--more-->
|
||||
|
||||
<!-- wp:more -->
|
||||
<!--more-->
|
||||
<!-- /wp:more -->
|
||||
<p class="block">This is my official notice that I am stepping down from the maintainer position for the AMD Encoder, as I have had several disagreements with the (only?) maintainer Jim. I would also request to be removed from the OBS Project team immediately. The integrated AMD Encoder plugin is now lacking a maintainer, and good luck to whoever picks it up again.</p>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>This is my official notice that I am stepping down from the maintainer position for the AMD Encoder, as I have had several disagreements with the (only?) maintainer Jim. I would also request to be removed from the OBS Project team immediately. The integrated AMD Encoder plugin is now lacking a maintainer, and good luck to whoever picks it up again.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<p class="block">There are various reasons for this, but the biggest one is the repeated disagreements. In every disagreement i was not treated as an equal, but as someone who didn't know any better and should just be an obedient underling. This way of interacting with one another is simply not acceptable, and therefore I have no further interest in working together with the OBS Project team.</p>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>There are various reasons for this, but the biggest one is the repeated disagreements. In every disagreement i was not treated as an equal, but as someone who didn't know any better and should just be an obedient underling. This way of interacting with one another is simply not acceptable, and therefore I have no further interest in working together with the OBS Project team.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<p class="block">Furthermore there is the lack of clarity and transparency for the OBS project. As there is no roadmap, there is no way to tell what is necessary for a new version, and decisions feel arbitrary due to that. What gets in and what doesn't seems to be up to the preference of someone instead of being planned out from the start. And despite repeated claims to improve this, nothing has happened over the span of two years. Not only that, but several much requested features are just pushed away as niche instantly instead of actually considering them seriously and putting them in a roadmap.</p>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Furthermore there is the lack of clarity and transparency for the OBS project. As there is no roadmap, there is no way to tell what is necessary for a new version, and decisions feel arbitrary due to that. What gets in and what doesn't seems to be up to the preference of someone instead of being planned out from the start. And despite repeated claims to improve this, nothing has happened over the span of two years. Not only that, but several much requested features are just pushed away as niche instantly instead of actually considering them seriously and putting them in a roadmap.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<p class="block">Overall, the state of OBS Project does not sit well with me and I no longer wish to be associated with it. This does not mean that I will no longer develop things for OBS Studio/libobs, just that I no longer want to be associated with the OBS Project team at all. obs-StreamFX and other secret plugins I've developed for clients will stay around until I find another thing to work on.</p>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Overall, the state of OBS Project does not sit well with me and I no longer wish to be associated with it. This does not mean that I will no longer develop things for OBS Studio/libobs, just that I no longer want to be associated with the OBS Project team at all. obs-StreamFX and other secret plugins I've developed for clients will stay around until I find another thing to work on.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Read the original on <a href="https://github.com/obsproject/obs-studio/issues/2346">GitHub</a>. </p>
|
||||
<!-- /wp:paragraph -->
|
||||
</pre>
|
||||
<p class="block">Read the original on <a href="https://github.com/obsproject/obs-studio/issues/2346">GitHub</a>. </p>
|
||||
|
||||
@@ -4,19 +4,18 @@ category: Blog
|
||||
tags: [OBS, Last.FM, AIMP, Spotify, 'WordPress Archive']
|
||||
---
|
||||
|
||||
<p class="block">I wanted to upgrade my streaming setup slightly, and while watching other streamers, I noticed that some have added a "Now Playing" overlay. For the most part it's either embedded in a static overlay as text, or just free floating text. But that isn't enough for me.</p>
|
||||
|
||||
<!-- wp:image {"align":"center","id":1054,"sizeSlug":"full"} -->
|
||||
<div class="wp-block-image"><figure class="aligncenter size-full"><img src="https://www.xaymar.com/wp-content/uploads/2020/02/2020-02-04T01-42-11_obs64_MediumaquamarinePolishedAnkole.png" alt="Last.FM Now Playing Overlay" class="wp-image-1054"/><figcaption>Last.FM Now Playing Overlay</figcaption></figure></div>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!--more-->
|
||||
<p class="block">
|
||||
<figure class="block float-right" style="max-width: 384px; width: 50%;">
|
||||
<img src="https://cdn.xaymar.com/blog/2020/02/2020-02-04T01-42-11_obs64_MediumaquamarinePolishedAnkole.png" alt="Last.FM Now Playing Overlay" />
|
||||
<figcaption>Last.FM Now Playing Overlay</figcaption>
|
||||
</figure>I wanted to upgrade my streaming setup slightly, and while watching other streamers, I noticed that some have added a "Now Playing" overlay. For the most part it's either embedded in a static overlay as text, or just free floating text. But that isn't enough for me.</p><!--more-->
|
||||
|
||||
<p class="block">The biggest difference to the usual "Now Playing" overlays is that it is animated. Instead of simply changing text, it slides out when no song is playing, slides in when a song starts playing, and flips to reveal a track change. Not only that, but it also shows track art if there is any. Just take a look at it in action to see what it can do:</p>
|
||||
|
||||
<!-- wp:video {"id":1055} -->
|
||||
<figure class="wp-block-video"><video controls preload="auto" src="https://blog.xaymar.com/wp-content/uploads/2020/02/2020-02-04T01-47-26.yt1280x720.mp4" playsinline></video><figcaption>The "Now Playing" overlay in action.</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
<figure class="block">
|
||||
<video controls preload="auto" src="https://cdn.xaymar.com/blog/2020/02/2020-02-04T01-47-26.yt1280x720.mp4" playsinline></video>
|
||||
<figcaption>The "Now Playing" overlay in action.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">To support most streaming software (and drastically reduce the work I had to do), I compressed it to a single HTML file that contains the necessary CSS and JavaScript. This also enables you to just download it, but keep it mind that you will not receive any future updates if you do so. You can also customize the style completely by either using the CSS override function that your streaming software provides, or by editing the HTML file.</p>
|
||||
|
||||
@@ -36,7 +35,16 @@ tags: [OBS, Last.FM, AIMP, Spotify, 'WordPress Archive']
|
||||
|
||||
<p class="block">As the entire thing is a HTML page, you can easily change the design of the overlay. Here are the CSS classes you can modify to customize the style:</p>
|
||||
|
||||
<ul class="block"><li><strong>.info</strong> Container for the track information.</li><li><strong>.logo</strong> Logo or Album Art for the track.</li><li><strong>.artist</strong> Artist name for the track.</li><li><strong>.title</strong> Title of the track.</li><li><strong>.separator</strong> The en-dash separator.</li><li><strong>.slide_in</strong> Slide in animation.</li><li><strong>.slide_out</strong> Slide out animation.</li><li><strong>.flip</strong> The flip animation, must be 500ms, and data change happens at 200ms. Ideally also contains the slide_in animation data.</li></ul>
|
||||
<ul class="block">
|
||||
<li><strong>.info</strong> Container for the track information.</li>
|
||||
<li><strong>.logo</strong> Logo or Album Art for the track.</li>
|
||||
<li><strong>.artist</strong> Artist name for the track.</li>
|
||||
<li><strong>.title</strong> Title of the track.</li>
|
||||
<li><strong>.separator</strong> The en-dash separator.</li>
|
||||
<li><strong>.slide_in</strong> Slide in animation.</li>
|
||||
<li><strong>.slide_out</strong> Slide out animation.</li>
|
||||
<li><strong>.flip</strong> The flip animation, must be 500ms, and data change happens at 200ms. Ideally also contains the slide_in animation data.</li>
|
||||
</ul>
|
||||
|
||||
<p class="block">Note that the CSS modifying hooks that OBS Studio and Streamlabs OBS provide run after all other JavaScript code has run, so you can't override the zoom with that. In the case that you want to change the sizes of elements beyond what is already there, consider downloading it and modifying the source files.</p>
|
||||
|
||||
|
||||
@@ -18,9 +18,20 @@ tags: [StreamFX, 'WordPress Archive']
|
||||
|
||||
<p class="block">For example, in my livestream on 28th March 2020 I created various example shaders for filters and transitions, such as a <a href="https://clips.twitch.tv/BoxyBusyWaterPartyTime">retro pixelate transition</a>, a <a href="https://clips.twitch.tv/AveragePowerfulMonkeyGOWSkull">CRT curvature and scanline filter</a>, or a <a href="https://clips.twitch.tv/SparklingGrossCiderPoooound">simple luma based transition instead of the classic fade</a>. With HLSL any of these effects are no longer out of reach and easily done, <em>if </em>you have the skills and patience to pull it off.</p>
|
||||
|
||||
<!-- wp:gallery {"ids":[1124,1126],"sizeSlug":"full","align":"center"} -->
|
||||
<figure class="wp-block-gallery aligncenter columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-03T00-37-31_obs64_GrubbyRashLeopard.jpg" alt="" data-id="1124" class="wp-image-1124"/><figcaption class="blocks-gallery-item__caption">CRT Shaders without Bleeding</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-03T00-38-56_obs64_AliveTrainedIrishdraughthorse.jpg" alt="" data-id="1126" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-03T00-38-56_obs64_AliveTrainedIrishdraughthorse.jpg" data-link="https://blog.xaymar.com/?attachment_id=1126" class="wp-image-1126"/><figcaption class="blocks-gallery-item__caption">CRT Shaders with Bleeding</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="3">
|
||||
<column>
|
||||
<figure class="block">
|
||||
<a href="https://cdn.xaymar.com/blog/2020/04/2020-04-03T00-37-31_obs64_GrubbyRashLeopard.jpg" target="_blank"><picture><img src="https://cdn.xaymar.com/blog/2020/04/2020-04-03T00-37-31_obs64_GrubbyRashLeopard.jpg" /></picture></a>
|
||||
<figcaption>CRT Shaders without Bleeding</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block">
|
||||
<a href="https://cdn.xaymar.com/blog/2020/04/2020-04-03T00-38-56_obs64_AliveTrainedIrishdraughthorse.jpg" target="_blank"><picture><img src="https://cdn.xaymar.com/blog/2020/04/2020-04-03T00-38-56_obs64_AliveTrainedIrishdraughthorse.jpg" /></picture></a>
|
||||
<figcaption>CRT Shaders with Bleeding</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<p class="block">The current implementation allows you to do any effect that does not require extra textures, as these are not yet supported. A future update will hopefully be able add support for textures, including FFTs for source audio, so that you can create even more impressive shaders. What exactly is possible still remains to be seen, as I've hit various limitations of the OBS Studio effect parser, including undiscovered crashes in OBS.</p>
|
||||
|
||||
|
||||
+19
-3
@@ -10,7 +10,18 @@ tags: [Tutorial, StreamFX, 'WordPress Archive']
|
||||
|
||||
<p class="block">In simple terms it keeps the Region of Interest always close to the center of the frame, which is usually the face of a content creator. Cropping and zoom is handled automatically and adjusted live while you move around. Get closer to the camera and it zooms out, go further away and it zooms in. Just compare the images below to see what it can do automatically:</p>
|
||||
|
||||
<!-- wp:columns --><div class="wp-block-columns"><!-- wp:column --><div class="wp-block-column"><!-- wp:image {"id":1140,"sizeSlug":"large"} --><figure class="wp-block-image size-large"><img src="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-04T23-42-07_obs64_FoolhardyChocolateXinjiangovenator-1024x560.png" alt="" class="wp-image-1140"/><figcaption>Without Nvidia Face Tracking Filter</figcaption></figure><!-- /wp:image --></div><!-- /wp:column --><!-- wp:column --><div class="wp-block-column"><!-- wp:image {"id":1141,"sizeSlug":"large"} --><figure class="wp-block-image size-large"><img src="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-04T23-42-12_obs64_LiquidFlatBaleenwhale-1024x560.jpg" alt="" class="wp-image-1141"/><figcaption>With Nvidia Face Tracking Filter</figcaption></figure><!-- /wp:image --></div><!-- /wp:column --></div><!-- /wp:columns -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/04/2020-04-04T23-42-07_obs64_FoolhardyChocolateXinjiangovenator.png" />
|
||||
<figcaption>Without Nvidia Face Tracking Filter</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/04/2020-04-04T23-42-12_obs64_LiquidFlatBaleenwhale.jpg" />
|
||||
<figcaption>With Nvidia Face Tracking Filter</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<p class="block">Effectively this filter simulates what it's like to have a professional camera operator following you on stage, always following where the action currently is. And the best thing is: it's free, and available now!</p>
|
||||
|
||||
@@ -18,7 +29,9 @@ tags: [Tutorial, StreamFX, 'WordPress Archive']
|
||||
|
||||
<p class="block">If you like moving around a lot, a manually cropped area only gets you so far. It's very restrictive, as you have a predetermined region of interest, and adjusting it takes a while to do. And that's exactly where this filter comes in.</p>
|
||||
|
||||
<!-- wp:video {"id":1154} --><figure class="wp-block-video"><video controls muted preload="auto" src="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-05_00-14-09.web_.video_.mp4"></video><figcaption>Nvidia Face Tracking Filter at work on a Logitech Brio 4K</figcaption></figure><!-- /wp:video -->
|
||||
<figure class="block"><video controls muted preload="auto" src="https://cdn.xaymar.com/blog/2020/04/2020-04-05_00-14-09.web_.video_.mp4"></video>
|
||||
<figcaption>Nvidia Face Tracking Filter at work on a Logitech Brio 4K</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">In this video I've moved through the entire horizontal field of view, which I could not have done with a manually cropped region. Thanks to the new Filter the region of interest was almost always in the center. And of course, like with everything that I do, it can be fully customized to your personal needs. Whether you want it fully zoomed in to something or just slightly further away is entirely up to you. If you wanted you could even create <a rel="noreferrer noopener" href="https://youtu.be/OGAu_DeKckI" target="_blank">this meme on the press of a button</a>.</p>
|
||||
|
||||
@@ -32,7 +45,10 @@ tags: [Tutorial, StreamFX, 'WordPress Archive']
|
||||
|
||||
<p class="block">The options are very simple: <strong>Stability</strong> controls how fast it should respond to changes (lower values respond faster but are more unstable), <strong>Zoom</strong> controls the maximum zoom relative to the "full frame" zoom level, and <strong>Offset</strong> controls the relative offset to the detected region of interest. The default values are targeted at the Logitech Brio 4k with the Field of View set to 90°, so you should adjust the values for your needs and camera of choice.</p>
|
||||
|
||||
<!-- wp:image {"id":1151,"sizeSlug":"full"} --><figure class="wp-block-image size-full"><img src="https://blog.xaymar.com/wp-content/uploads/2020/04/2020-04-05T01-05-40_obs64_MotionlessWaterloggedStud.png" alt="" class="wp-image-1151"/><figcaption>Settings for the Nvidia Face Tracking Filter</figcaption></figure><!-- /wp:image -->
|
||||
<!-- wp:image {"id":1151,"sizeSlug":"full"} -->
|
||||
<figure class="block" style="max-width: 768px; width: 50%;"><img src="https://cdn.xaymar.com/blog/2020/04/2020-04-05T01-05-40_obs64_MotionlessWaterloggedStud.png" />
|
||||
<figcaption>Settings for the Nvidia Face Tracking Filter</figcaption>
|
||||
</figure><!-- /wp:image -->
|
||||
|
||||
<h2 class="block">Anything else?</h2>
|
||||
|
||||
|
||||
@@ -30,7 +30,35 @@ tags: [Tutorial, StreamFX, 'WordPress Archive']
|
||||
|
||||
<p class="block">For example you can completely replace a Gaussian Area Blur with a Dual-Filtering Blur and the latter will be significantly faster. Just look at this table to see replacements that work up to 5 times faster on any hardware:</p>
|
||||
|
||||
<figure class="block block-table"><table><thead><tr><th>Original Blur</th><th class="has-text-align-left" data-align="left"><strong>Replacement Blur</strong></th><th class="has-text-align-right" data-align="right">Up to x% faster</th></tr></thead><tbody><tr><td>Box Area Blur<br>Box Directional Blur</td><td class="has-text-align-left" data-align="left">Box Linear Area Blur<br>Box Linear Directional Blur</td><td class="has-text-align-right" data-align="right">~200%</td></tr><tr><td>Gaussian Area Blur</td><td class="has-text-align-left" data-align="left">Dual-Filtering Blur</td><td class="has-text-align-right" data-align="right">~500%</td></tr><tr><td>Gaussian Area Blur<br>Gaussian Directional Blur</td><td class="has-text-align-left" data-align="left">Gaussian Linear Area Blur<br>Gaussian Linear Directional Blur<br><em>(Not identical to Gaussian Blur)</em></td><td class="has-text-align-right" data-align="right">~200%</td></tr></tbody></table><figcaption>Possible replacement blurs that take siginificantly less CPU and GPU time.</figcaption></figure>
|
||||
<figure class="block">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Original Blur</th>
|
||||
<th class="has-text-align-left" data-align="left"><strong>Replacement Blur</strong></th>
|
||||
<th style="text-align: right;">Up to x% faster</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Box Area Blur<br>Box Directional Blur</td>
|
||||
<td class="has-text-align-left" data-align="left">Box Linear Area Blur<br>Box Linear Directional Blur</td>
|
||||
<td style="text-align: right;">~200%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gaussian Area Blur</td>
|
||||
<td class="has-text-align-left" data-align="left">Dual-Filtering Blur</td>
|
||||
<td style="text-align: right;">~500%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gaussian Area Blur<br>Gaussian Directional Blur</td>
|
||||
<td class="has-text-align-left" data-align="left">Gaussian Linear Area Blur<br>Gaussian Linear Directional Blur<br><em>(Not identical to Gaussian Blur)</em></td>
|
||||
<td style="text-align: right;">~200%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<figcaption>Possible replacement blurs that take siginificantly less CPU and GPU time.</figcaption>
|
||||
</figure>
|
||||
|
||||
<h3 class="block">Full Resolution Blurring is Wasteful</h3>
|
||||
|
||||
@@ -44,7 +72,15 @@ tags: [Tutorial, StreamFX, 'WordPress Archive']
|
||||
|
||||
<p class="block">Shaders are one of the features in StreamFX that allow you to do so much cool stuff - and at the same time mess everything up. The following is a list of things you should do:</p>
|
||||
|
||||
<ul class="block"><li><strong>Avoid the use of integers unless absolutely necessary.</strong> Integers have a significant overhead in pixel and vertex shaders, and you should always opt for floats instead. While the math might end up slightly more complicated, it will run faster than integer math.</li><li><strong>Prefer unsigned integers over signed integers.</strong> Unsigned integers have a smaller overhead than signed integers, but they are still on the list of things to avoid using. If you don't need an integer value to be less than zero, use uint!</li><li><strong>Manually unroll loops.</strong> Automatic unrolling often produces functional but inefficient code, which can be avoided by manually unrolling. In the ideal case put the content of the loop into an <code>inline bool myfunction(...params...) {...code...}</code> function which returns true if the loop should be interrupted - allows for easy unrolling.</li><li><strong>Render at a lower resolution.</strong> Not many shaders actually need to be rendering at 100% of the parents resolution - many actually look perfectly fine at 75% or even 50%. Some can even look nearly identical at 25% - experiment with this to see what works for you.</li><li><strong>Group mathematical operations by what they do.</strong> Multiply next to multiply operations, additions next to additions, subtractions next to subtractions. This helps the shader transpiler generate more efficient code, and can bring performance boosts of up to 10%. </li><li><strong>Avoid excessive use of if, for and while.</strong> Ideally you want your arguments to be known at the time of compiling, but that is not always possible. So in those cases you should keep your branching to the minimum possible - either by manually unrolling loops or by adding techniques to select features.</li><li><strong>Don't calculate everything in the pixel shader.</strong> Not all calculations need to be done in the pixel shader, for example calculating UVs in the vertex shader and directly using that value as an input to a texture sampling command allows the compiler to optimize the sample to a better location. This can get you around 20% extra performance.</li></ul>
|
||||
<ul class="block">
|
||||
<li><strong>Avoid the use of integers unless absolutely necessary.</strong> Integers have a significant overhead in pixel and vertex shaders, and you should always opt for floats instead. While the math might end up slightly more complicated, it will run faster than integer math.</li>
|
||||
<li><strong>Prefer unsigned integers over signed integers.</strong> Unsigned integers have a smaller overhead than signed integers, but they are still on the list of things to avoid using. If you don't need an integer value to be less than zero, use uint!</li>
|
||||
<li><strong>Manually unroll loops.</strong> Automatic unrolling often produces functional but inefficient code, which can be avoided by manually unrolling. In the ideal case put the content of the loop into an <code>inline bool myfunction(...params...) {...code...}</code> function which returns true if the loop should be interrupted - allows for easy unrolling.</li>
|
||||
<li><strong>Render at a lower resolution.</strong> Not many shaders actually need to be rendering at 100% of the parents resolution - many actually look perfectly fine at 75% or even 50%. Some can even look nearly identical at 25% - experiment with this to see what works for you.</li>
|
||||
<li><strong>Group mathematical operations by what they do.</strong> Multiply next to multiply operations, additions next to additions, subtractions next to subtractions. This helps the shader transpiler generate more efficient code, and can bring performance boosts of up to 10%. </li>
|
||||
<li><strong>Avoid excessive use of if, for and while.</strong> Ideally you want your arguments to be known at the time of compiling, but that is not always possible. So in those cases you should keep your branching to the minimum possible - either by manually unrolling loops or by adding techniques to select features.</li>
|
||||
<li><strong>Don't calculate everything in the pixel shader.</strong> Not all calculations need to be done in the pixel shader, for example calculating UVs in the vertex shader and directly using that value as an input to a texture sampling command allows the compiler to optimize the sample to a better location. This can get you around 20% extra performance.</li>
|
||||
</ul>
|
||||
|
||||
<h1 class="block">Other Improvements</h1>
|
||||
|
||||
|
||||
@@ -2,185 +2,203 @@
|
||||
title: Is a 48kHz sample rate truly enough for Audio?
|
||||
category: Blog
|
||||
tags: ["Audio", "DAC", "ADC", 'WordPress Archive']
|
||||
unpublished: true
|
||||
published: false
|
||||
---
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Ever since the day that we've been able to push sample rate higher than 44.1kHz, this question has appeared: What is the best sample rate for Audio, and can you actually hear the difference between 48kHz and 96kHz (or higher) sample rates?</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Before we get into this, note that I am not an audio engineer, or a scientist. I am a software developer, who is often too curious for his own good, resulting in weird new projects - like StreamFX. So take this with a grain of salt, and if you know better, do feel free to <a rel="noreferrer noopener" href="mailto:info@xaymar.com?subject=48kHz Sample Rate" target="_blank">contact me</a>!</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<p class="block">Before we get into this, note that I am not an audio engineer, or a scientist. I am a software developer, who is often too curious for his own good, resulting in weird new projects - like StreamFX. So take this with a grain of salt, and if you know better, do feel free to <a rel="noreferrer noopener" href="#" target="_blank">contact me</a>!</p><!--more-->
|
||||
|
||||
<!-- wp:more -->
|
||||
<!--more-->
|
||||
<!-- /wp:more -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">This test is based on my own frequency visualizer tool available <a rel="noreferrer noopener" href="https://tools.xaymar.com/samplerate.html" target="_blank">here</a>. All tests are based on the humanly audible range of 20 Hz to 20kHz (for a healthy young adult). These tests do not take into account inaccuracies caused by the physical properties of the D/A or A/D converters, speakers and microphones.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block"><strong>Update: </strong>Information for supersampling D/A and A/D converters has been added to the entry. Please see the conclusion page for more information.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="block">When does 48kHz run into problems?</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">The most common case is the conversion from Digital to Analog - without it we would not be able to hear any audio at all. Let's take a look at a few common frequencies: 32 Hz, 64 Hz, 128 Hz, 256 Hz, 512 Hz, 1024 Hz, 2048 Hz, 4096 Hz, 8192 Hz, and finally 16384 Hz. </p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:gallery {"ids":[1264,1265,1266,1267],"columns":2} -->
|
||||
<figure class="wp-block-gallery columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-32-64-128-300x168.png" alt="" data-id="1264" data-link="https://blog.xaymar.com/?attachment_id=1264" class="wp-image-1264"/><figcaption class="blocks-gallery-item__caption">32, 64 and 128 Hz on 48kHz DAC</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-256-512-1024-300x168.png" alt="" data-id="1265" data-link="https://blog.xaymar.com/?attachment_id=1265" class="wp-image-1265"/><figcaption class="blocks-gallery-item__caption">256, 512 and 1024 Hz on 48kHz DAC</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-2048-4096-8192-300x168.png" alt="" data-id="1266" data-link="https://blog.xaymar.com/?attachment_id=1266" class="wp-image-1266"/><figcaption class="blocks-gallery-item__caption">2048, 4096 and 8192 Hz on 48kHz DAC</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-4096-8192-16384-300x168.png" alt="" data-id="1267" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-4096-8192-16384.png" data-link="https://blog.xaymar.com/?attachment_id=1267" class="wp-image-1267"/><figcaption class="blocks-gallery-item__caption">4096, 8192 and 16384 Hz on 48kHz DAC</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-32-64-128.png" alt="" data-id="1264" data-link="https://blog.xaymar.com/?attachment_id=1264" class="wp-image-1264" />
|
||||
<figcaption class="blocks-gallery-item__caption">32, 64 and 128 Hz on 48kHz DAC</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-256-512-1024.png" alt="" data-id="1265" data-link="https://blog.xaymar.com/?attachment_id=1265" class="wp-image-1265" />
|
||||
<figcaption class="blocks-gallery-item__caption">256, 512 and 1024 Hz on 48kHz DAC</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-2048-4096-8192.png" alt="" data-id="1266" data-link="https://blog.xaymar.com/?attachment_id=1266" class="wp-image-1266" />
|
||||
<figcaption class="blocks-gallery-item__caption">2048, 4096 and 8192 Hz on 48kHz DAC</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-4096-8192-16384.png" alt="" data-id="1267" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-4096-8192-16384.png" data-link="https://blog.xaymar.com/?attachment_id=1267" class="wp-image-1267" />
|
||||
<figcaption class="blocks-gallery-item__caption">4096, 8192 and 16384 Hz on 48kHz DAC</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Looking at the generated graphs, we can immediately tell that anything equal to or below 2048 Hz will be perfectly fine on 48kHz. We can also tell that somewhere between 2048 and 4096 Hz we will start seeing slight artifacts, and that everything above that unknown value will have ever stronger artifacts - In fact we can see the strong artifacts appear on 8192 Hz already.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">And at 16384 Hz we might as well just throw in the towel as there is basically no way to create the original wave with current hardware. Even the most accurate DAC will struggle to recreate the wave properly, and overshoot and undershoot constantly, corrupting the wave past recovery. While it is possible to work around the issue, it won't be gone.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Knowing this we can tell that for the majority of audible frequencies, we'll be safe with 48kHz. But so far we've only looked at 2^n frequencies - what about other frequencies that end up in a pretty bad shape at this sample rate?</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="block">The Broken Frequencies in 48kHz</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Since we can safely say that any frequency up to 4096 kHz works "fine", let's take a look at the frequencies above them. For example, how about we look at integer divisions of 48 kHz and variations of them, such as 19.2 kHz, 16 kHz, 12 kHz, 9.6 kHz, 8 kHz, 6 kHz and 4.8 kHz.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:gallery {"ids":[1270,1271,1272,1273],"columns":2,"sizeSlug":"medium"} -->
|
||||
<figure class="wp-block-gallery columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-19.2-1-300x168.png" alt="" data-id="1270" data-link="https://blog.xaymar.com/?attachment_id=1270" class="wp-image-1270"/><figcaption class="blocks-gallery-item__caption">19.2 kHz (Sample #1)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-19.2-2-300x168.png" alt="" data-id="1271" data-link="https://blog.xaymar.com/?attachment_id=1271" class="wp-image-1271"/><figcaption class="blocks-gallery-item__caption">19.2 kHz (Sample #2)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-16kHz-1-300x168.png" alt="" data-id="1272" data-link="https://blog.xaymar.com/?attachment_id=1272" class="wp-image-1272"/><figcaption class="blocks-gallery-item__caption">16 kHz (Sample #1)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-16kHz-2-300x168.png" alt="" data-id="1273" data-link="https://blog.xaymar.com/?attachment_id=1273" class="wp-image-1273"/><figcaption class="blocks-gallery-item__caption">16 kHz (Sample #2)</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-19.2-1.png" alt="" data-id="1270" data-link="https://blog.xaymar.com/?attachment_id=1270" class="wp-image-1270" />
|
||||
<figcaption class="blocks-gallery-item__caption">19.2 kHz (Sample #1)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-19.2-2.png" alt="" data-id="1271" data-link="https://blog.xaymar.com/?attachment_id=1271" class="wp-image-1271" />
|
||||
<figcaption class="blocks-gallery-item__caption">19.2 kHz (Sample #2)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-16kHz-1.png" alt="" data-id="1272" data-link="https://blog.xaymar.com/?attachment_id=1272" class="wp-image-1272" />
|
||||
<figcaption class="blocks-gallery-item__caption">16 kHz (Sample #1)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-16kHz-2.png" alt="" data-id="1273" data-link="https://blog.xaymar.com/?attachment_id=1273" class="wp-image-1273" />
|
||||
<figcaption class="blocks-gallery-item__caption">16 kHz (Sample #2)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">At 19.2 kHz and 16 kHz, we have by far the worst artifacts. It's not even possible to call these waves anymore, they are just random noise now. Not much of the original wave is left, but we can still guess that it used to be a wave of some type. In the second sample which is slightly offset by time, we can see even worse effects for both frequencies.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:gallery {"ids":[1274,1275,1276,1277],"columns":2} -->
|
||||
<figure class="wp-block-gallery columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-12kHz-1-1024x573.png" alt="" data-id="1274" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-12kHz-1.png" data-link="https://blog.xaymar.com/?attachment_id=1274" class="wp-image-1274"/><figcaption class="blocks-gallery-item__caption">12kHz (Sample #1)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-12kHz-2-1024x573.png" alt="" data-id="1275" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-12kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1275" class="wp-image-1275"/><figcaption class="blocks-gallery-item__caption">12kHz (Sample #2)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-9.6-1-1024x573.png" alt="" data-id="1276" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-9.6-1.png" data-link="https://blog.xaymar.com/?attachment_id=1276" class="wp-image-1276"/><figcaption class="blocks-gallery-item__caption">9.6kHz (Sample #1)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-9.6-2-1024x573.png" alt="" data-id="1277" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-9.6-2.png" data-link="https://blog.xaymar.com/?attachment_id=1277" class="wp-image-1277"/><figcaption class="blocks-gallery-item__caption">9.6kHz (Sample #2)</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-12kHz-1.png" alt="" data-id="1274" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-12kHz-1.png" data-link="https://blog.xaymar.com/?attachment_id=1274" class="wp-image-1274" />
|
||||
<figcaption class="blocks-gallery-item__caption">12kHz (Sample #1)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-12kHz-2.png" alt="" data-id="1275" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-12kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1275" class="wp-image-1275" />
|
||||
<figcaption class="blocks-gallery-item__caption">12kHz (Sample #2)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-9.6-1.png" alt="" data-id="1276" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-9.6-1.png" data-link="https://blog.xaymar.com/?attachment_id=1276" class="wp-image-1276" />
|
||||
<figcaption class="blocks-gallery-item__caption">9.6kHz (Sample #1)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-9.6-2.png" alt="" data-id="1277" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-9.6-2.png" data-link="https://blog.xaymar.com/?attachment_id=1277" class="wp-image-1277" />
|
||||
<figcaption class="blocks-gallery-item__caption">9.6kHz (Sample #2)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Continuing on with 12kHz and 9.6kHz, we can see similar results depending on just how the time offset is adjusted. However good filtering algorithms might be able to still make out that these used to be waves - the velocity of the waveform could be used to recreate a proper wave for the frequency that we are trying to reproduce.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:gallery {"ids":[1278,1279,1284,1285],"columns":2} -->
|
||||
<figure class="wp-block-gallery columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-8-1-1024x573.png" alt="" data-id="1278" data-link="https://blog.xaymar.com/?attachment_id=1278" class="wp-image-1278"/><figcaption class="blocks-gallery-item__caption">8kHz (Sample #1)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-8-2-1024x573.png" alt="" data-id="1279" data-link="https://blog.xaymar.com/?attachment_id=1279" class="wp-image-1279"/><figcaption class="blocks-gallery-item__caption">8kHz (Sample #2)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-6kHz-1024x573.png" alt="" data-id="1284" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-6kHz.png" data-link="https://blog.xaymar.com/?attachment_id=1284" class="wp-image-1284"/><figcaption class="blocks-gallery-item__caption">6kHz (Sample #1)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-6kHz-2-1024x573.png" alt="" data-id="1285" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/48kHz-6kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1285" class="wp-image-1285"/><figcaption class="blocks-gallery-item__caption">6kHz (Sample #2)</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-8-1.png" alt="" data-id="1278" data-link="https://blog.xaymar.com/?attachment_id=1278" class="wp-image-1278" />
|
||||
<figcaption class="blocks-gallery-item__caption">8kHz (Sample #1)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-8-2.png" alt="" data-id="1279" data-link="https://blog.xaymar.com/?attachment_id=1279" class="wp-image-1279" />
|
||||
<figcaption class="blocks-gallery-item__caption">8kHz (Sample #2)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-6kHz.png" alt="" data-id="1284" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-6kHz.png" data-link="https://blog.xaymar.com/?attachment_id=1284" class="wp-image-1284" />
|
||||
<figcaption class="blocks-gallery-item__caption">6kHz (Sample #1)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/48kHz-6kHz-2.png" alt="" data-id="1285" data-full-url="https://cdn.xaymar.com/blog/2020/06/48kHz-6kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1285" class="wp-image-1285" />
|
||||
<figcaption class="blocks-gallery-item__caption">6kHz (Sample #2)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">With 8kHz and all frequencies below that, we've approached the area where the artifacts become so small that we can filter them out at minimal loss. Knowing this we can infer that all smaller frequencies that this will perform fine, given good filtering.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">So the question then is, what sample rate is enough to fix the majority of artifacts?</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="block">Which Samplerate avoids the artifacts?</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">In the best case possible, we would want to accurately reproduce every frequency between 20 Hz and 20 kHz. This is however just not feasible with current technology at a reasonable price point. That means we'll have to do with what we already have: 96 kHz and 192 kHz. Let's look at both of them.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:gallery {"ids":[1288,1289]} -->
|
||||
<figure class="wp-block-gallery columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/96kHz-1-1024x573.png" alt="" data-id="1288" data-link="https://blog.xaymar.com/?attachment_id=1288" class="wp-image-1288"/><figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #1 at 96kHz)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/96kHz-2-1024x573.png" alt="" data-id="1289" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/96kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1289" class="wp-image-1289"/><figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #2 at 96kHz)</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/96kHz-1.png" alt="" data-id="1288" data-link="https://blog.xaymar.com/?attachment_id=1288" class="wp-image-1288" />
|
||||
<figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #1 at 96kHz)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/96kHz-2.png" alt="" data-id="1289" data-full-url="https://cdn.xaymar.com/blog/2020/06/96kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1289" class="wp-image-1289" />
|
||||
<figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #2 at 96kHz)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">In the graphs for 96 kHz we can clearly see an improvement compared to 48 kHz, as it almost eliminates all the artifacts for these frequencies. At 96 kHz we are safe when it comes to human speech and most instruments. Some artifacts are still left, but for the most common use cases, 96 kHz is enough.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:gallery {"ids":[1290,1291]} -->
|
||||
<figure class="wp-block-gallery columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/192kHz-1-1024x573.png" alt="" data-id="1290" data-link="https://blog.xaymar.com/?attachment_id=1290" class="wp-image-1290"/><figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #1 at 192kHz)</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://blog.xaymar.com/wp-content/uploads/2020/06/192kHz-2-1024x573.png" alt="" data-id="1291" data-full-url="https://blog.xaymar.com/wp-content/uploads/2020/06/192kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1291" class="wp-image-1291"/><figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #2 at 192kHz)</figcaption></figure></li></ul></figure>
|
||||
<!-- /wp:gallery -->
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/192kHz-1.png" alt="" data-id="1290" data-link="https://blog.xaymar.com/?attachment_id=1290" class="wp-image-1290" />
|
||||
<figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #1 at 192kHz)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/06/192kHz-2.png" alt="" data-id="1291" data-full-url="https://cdn.xaymar.com/blog/2020/06/192kHz-2.png" data-link="https://blog.xaymar.com/?attachment_id=1291" class="wp-image-1291" />
|
||||
<figcaption class="blocks-gallery-item__caption">19.2, 16 and 12 kHz (Sample #2 at 192kHz)</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">At 192 kHz we can see all the remaining artifacts effectively disappear completely. Even 19.2 kHz looks like a proper wave and likely will not need any complex filtering to be detected correctly. This would be the ideal sample rate for instruments such as cymbals and bells, but would be massively overkill for vocals.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="block">Solving the Question(s)</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">Is 48 kHz enough?</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">This depends, but the short answer is no. There is a significant audio processing overhead required to make 48 kHz be able to sound like what you would achieve with 96 kHz or higher. If you can confidently say that everything in your audio production pipeline is doing the necessary processing for 48 kHz playback, then you can set your playback frequency to 48 kHz.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">Will switching to 96 kHz (or higher) fix the problems?</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Yes, absolutely. While they won't be gone completely, they will be reduced to the point that they won't matter anymore, which is especially important for audio recording from real world instruments and vocals. A studio performance captured at 192 kHz sample rate will sound much different compared to one captured at 48 kHz.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">What sample rate should I pick?</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">This depends on what you actually want to do:</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:list -->
|
||||
<ul class="block"><li>If you only intend to capture game audio with nothing else, then 48 kHz will be perfectly fine, as most games mix their audio to 48 kHz or even 44.1 kHz.</li><li>For human voices, such as commentary and singing, you will want to switch to 96 kHz. This covers the majority of frequencies that humans can produce, and also covers a large amount of instruments as well.</li><li>Lastly there are some instruments that don't sound good at 96 kHz, for which 192 kHz is required, for example cymbals and bells. </li></ul>
|
||||
<!-- /wp:list -->
|
||||
<ul class="block">
|
||||
<li>If you only intend to capture game audio with nothing else, then 48 kHz will be perfectly fine, as most games mix their audio to 48 kHz or even 44.1 kHz.</li>
|
||||
<li>For human voices, such as commentary and singing, you will want to switch to 96 kHz. This covers the majority of frequencies that humans can produce, and also covers a large amount of instruments as well.</li>
|
||||
<li>Lastly there are some instruments that don't sound good at 96 kHz, for which 192 kHz is required, for example cymbals and bells. </li>
|
||||
</ul>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">However there is a problem with this. If your pipeline involves a naive downsampler, which is common in many popular media production software such as streaming apps, you actually gain none of the benefits of the higher sampling rate. In the worst case this can even cause new artifacts to appear.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">What is the correct way to downsample?</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">This is the hard part, and I have no real answer for it. A reduced sample rate simply cannot cover all the frequencies that higher sample rates can, and even the best downsampling and filtering and only do so much and will struggle with certain frequencies where artifacts are simply unavoidable.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">The majority of the frequencies above 9.6 kHz are problematic at 48 kHz, and simply can't be represented correctly. For example the 19.2 kHz frequency is just nearly impossible to accurately represent, but is fine at 96 kHz. </p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">What about supersampling D/A and A/D converters?</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Higher priced audio devices have started using supersampling D/A and A/D converters, which usually have a data resolution of 48, 96 or 192 kHz, and an internal resolution in the mHz area. Since these are usually not listed in the spec sheet, it is impossible to tell if you have one or not without an oscilloscope.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Their quality is defined by their resampling algorithm, and high quality resampling algorithms can make 48 kHz sound nearly indistinguishable compared to 96 kHz, at least for the majority of frequencies. If you can confidently say that you have one of these, then you will be "fine" at 48 kHz sampling rate - the majority of audio frequencies will be reproduced with only minor artifacts.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="block">The Conclusion</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">So there you have it, the answer to the age old question: "<em>Is 48 kHz enough?</em>" - and the answer to it is "No". The minimum necessary to accurately reproduce most real world audio is 96 kHz, and some things even need 192 kHz or higher to be correctly reproduced. </p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">And thanks to technological advances, we might in the future see 96 kHz become the new "X is enough". Chips have gotten smaller and more efficient, audio capture/playback devices have gotten better at audio, and even our mobile phones are starting to jump onto higher samplerates.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">With all that said, there isn't anything left to talk about. If you think I made a mistake, or just know better, do feel free to <a href="mailto:info@xaymar.com?subject=48kHz Sample Rate" target="_blank" rel="noreferrer noopener">contact me</a>.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<p class="block">With all that said, there isn't anything left to talk about. If you think I made a mistake, or just know better, do feel free to <a href="#" target="_blank" rel="noreferrer noopener">contact me</a>.</p>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: "Funding StreamFX: Where to go from here?"
|
||||
category: Blog
|
||||
tags: [StreamFX, "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p>StreamFX has grown into one of the most used plugins for OBS Studio, often being called essential for big and small creators alike. And yet, there is a massive problem facing StreamFX: A lack of funding. Like any project, StreamFX can't survive without it, so where do we go from here?</p>
|
||||
|
||||
<p>Currently the funding come from <a rel="noreferrer noopener" href="https://github.com/sponsors/xaymar" target="_blank">Github Sponsors</a>, <a rel="noreferrer noopener" href="https://twitch.tv/xaymar" target="_blank">Twitch Subscriptions</a>, <a rel="noreferrer noopener" href="https://www.patreon.com/Xaymar" target="_blank">Patreon</a>, and my own job. The first three make up around $110 in total (+- some amount), which I'm really thankful for. While $110 is not a lot, it does help a bit, and reduces my time spent at work ever so slightly. </p><!--more-->
|
||||
|
||||
<h2 class="block">The way Forward</h2>
|
||||
|
||||
<p class="block">If we look at the monthly download numbers for just the major stable releases, we can see close to 22k downloads. Assuming that around 75% of those downloads are redownloads from the same user, we arrive at around 5k unique users.</p>
|
||||
|
||||
<p class="block">If even half of these users were to support both OBS Studio and StreamFX with just $1 per month both projects would be in a much better place. I could hire a 2nd developer for MacOS or Vulkan, which would open up many new possibilities for StreamFX.</p>
|
||||
|
||||
<p class="block">However that's not what we're seeing at all, despite my attempts to get people to support the project more. That leaves just one question then: How can I make supporting StreamFX more attractive?</p>
|
||||
|
||||
<h3 class="block">Option 1: Removable Ads in the App</h3>
|
||||
|
||||
<p class="block">In the modern world, ads are the primary way to get paid for work without requiring a subscription. This option would add an ad to the OBS Studio app window that can only be removed by supporting the project in some way. I'm not a particular fan of this option, so this is my least favourite one - and very unlikely to happen.</p>
|
||||
|
||||
<h3 class="block">Option 2: Bundled Software in the Installer</h3>
|
||||
|
||||
<p class="block">Used by some software like Cheat Engine, FileZilla and others to pay for development cost, but often associated with bad press due to the software being installed despite clicking no or even trying to trick users into accepting by moving the accept button where the decline button would be. More likely than option 1, but still not my go-to option.</p>
|
||||
|
||||
<h3 class="block">Option 3: Locking new features behind a Paywall</h3>
|
||||
|
||||
<p class="block">This is the the option I've thought about the most. Every currently existing feature would stay free, while new features would require supporting the project. Unlocking the features would simply be signing in with your account and things would appear on the next OBS Studio launch. Even the $1/mo tiers would be enough to unlock the features. It is the least intrusive way I can think of, and the most likely to happen.</p>
|
||||
|
||||
<h3 class="block">Option 4: Removable Watermark</h3>
|
||||
|
||||
<p class="block">Watermarks are the easiest way to get people to support something. Those that don't care about the project will simply ignore them (or crop them off like art thieves), and those actually wanting to help the project will look for a way to remove them legally. Similar to Option 3, removing them requires actively supporting the project. Probably going to happen in combination with option 3 (for new features).</p>
|
||||
|
||||
<h2 class="block">The future</h2>
|
||||
|
||||
<p class="block">These four were the only options I could come up with. My current approach is not working out, and I see the plugin used in streams of bigger creators all the time with rarely even any mention of it - or any support from those creators. This saddens me as I see people benefiting from my work and choosing to ignore the struggles of the people actually making the work benefit them.</p>
|
||||
|
||||
<p class="block">What do you think about all this? Do you think I'm in the wrong and should just live on exposure bux, or should I implement one of the options mentioned above? Leave your thoughts in the comments below, or as a reply to the social media message you used to get here.</p>
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
title: StreamFX now has its own Discord!
|
||||
category: News
|
||||
tags: [StreamFX, "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">Due to an excessive amount of channels required for StreamFX, I've decided to split it off into its own Discord server. You can join it using <a href="https://s.xaymar.com/streamfx-dc" target="_blank" rel="noreferrer noopener">this link</a>, and enjoy all the new features in it. Make sure to read the rules and select your roles according to what you want to do!</p>
|
||||
|
||||
<p class="block">The Server features dedicated roles for each category of tasks, in order to better help users do things. Each role also has a dedicated releases channel for their own content in order to spread the content to other creators that are less skilled at the task.</p>
|
||||
|
||||
<p class="block">You can also now advertise your content in the dedicated channels for it, such as your stream or your YouTube channel.</p>
|
||||
@@ -0,0 +1,119 @@
|
||||
---
|
||||
title: StreamFX v0.8.1 is now available!
|
||||
category: News
|
||||
tags: [StreamFX, "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">In the two months since the release of Version 0.8.0, a lot of bugs have been discovered - which now have been fixed with Version 0.8.1! Let's take a closer look at the things that have been fixed.</p>
|
||||
|
||||
<p class="block"><strong>Update:</strong> Update 0.8.2 has been released fixing the newly discovered issues in 0.8.1. The links in the post have been updated.<br><strong>Update: </strong>0.8.3 is out, and the links have been updated.</p>
|
||||
|
||||
<h2 class="block">Improving the Installer experience on Windows</h2>
|
||||
|
||||
<p class="block">This had been on the table for a while, and finally made it in. Due to the excessive flood of people not reading the installation instructions and asking the same question - usually within seconds of the same question being answered - the installation process had to become a bit more automatic.With that in mind, I went to town on the installer.</p><!--more-->
|
||||
|
||||
<p class="block">The first thing I did was get rid of the Win98 feel by enabling the modern UI built into the setup tool. Next was hiding the upgrade process that happens automatically in the background, as it sometimes confused users. And finally, it received the ability to automatically install any missing MSVC Redistributable - a much needed feature as almost all support requests could be fixed with just that.</p>
|
||||
|
||||
<p class="block">With that all done, it was time to move on to other more important things.</p>
|
||||
|
||||
<h2 class="block">Invisible Source Mirrors</h2>
|
||||
|
||||
<p class="block">In version 0.8 a fix was applied to no longer freeze OBS Studio when opening the filter dialog on a Source Mirror, and this in turn caused Source Mirror to disappear as the source size was queried in the tick function. The tick function however is not called if the source has no size, which meant it was never set. Now the source size is acquired as soon as the source is acquired, which fixes it for most types of sources.</p>
|
||||
|
||||
<p class="block">A different fix has to be implemented for asynchronous sources, which usually get their size at a later point in time. This second fix will likely be released with 0.9, and not be backported to 0.8.</p>
|
||||
|
||||
<h2 class="block">Weird Shader filter Rendering</h2>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/05/obs64_gMKX7ZsqIL.png" />
|
||||
<figcaption>Shader filters used for glow effect.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">Shader filters sometimes turned invisible on load, which resulted in very weird graphics glitches. Fixing this was actually super easy, as the reason for the invisible glitch was actually that the size of the output was set to 0x0, and thus exceptions were being thrown. Catching those exceptions and then skipping the filter fixed the issue. </p>
|
||||
|
||||
<p class="block">But something else was still causing problems. Shader filters would look weird depending on how their output resolution was scaled. Turns out I had accidentally coded it to capture the input at the output resolution - fixing that made my effects crystal clear again. Now all shader filters should look crystal clear for you as well!</p>
|
||||
|
||||
<h2 class="block">New Memory Leaks?!</h2>
|
||||
|
||||
<p class="block">Through testing with one of my complex scenes, I discovered an abnormally high number of memory leaks. As it turns out, they actually came from three distinct sources, so fixing them wasn't easy, and I have no explanation for one of them. I've managed to fix all of them, but lets actually look at each one individually:</p>
|
||||
|
||||
<h3 class="block">Source Tracker</h3>
|
||||
|
||||
<p class="block">For a long time now, StreamFX has used its own source tracker implementation, which keeps track of existing sources and scenes, instead of obs_enum_sources and obs_enum_scenes. And this implementation was the source of not just one, but 83 memory leaks - and due to the nature of the code, all of them are critical bugs. </p>
|
||||
|
||||
<p class="block">So what caused them? A quick glance over the code didn't reveal any obvious causes, and did not reveal anything unusal - even hours later I still had no idea what caused them. Even now, nothing jumps out at me that could have caused the leaks. My only guess is that we somehow missed destruction events, which would imply that libOBS is broken, or that we corrupted the map in a thread somewhere.</p>
|
||||
|
||||
<p class="block">I could only gamble at a solution by replacing all the direct pointers with std::shared_ptr, and my gamble paid off. Replacing all the pointers to obs_source_t and obs_weak_source_t with std::shared_ptrs fixed them, as long as a custom deleter was being used. Hooray, on to the next memory leaks!</p>
|
||||
|
||||
<h3 class="block">Vertex Buffers</h3>
|
||||
|
||||
<p class="block">For those not familiar with the StreamFX code base, most of the internal libOBS objects have fitting C++ wrappers that handle all the reference counting things. The same is true for gs::vertex_buffer, yet it was the source of not just one memory leak, but 13. Looking at the source code didn't reveal much on the surface, everything looks like it should have worked as intended.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<p class="block">
|
||||
Closer inspection revealed the first bug: The gs_vbdata_t object was only deleted if the gs_vertbuffer_t object did not exist. This was obviously wrong, so I replaced the entire thing with an std::shared_ptr<gs_vbdata_t> and a custom deleter. One down, 12 to go - but where could they even be?
|
||||
</p>
|
||||
</column>
|
||||
<column>
|
||||
<code class="block">if (_data) {
|
||||
memset(_data, 0, sizeof(gs_vb_data));
|
||||
if (!_buffer) { // The problem.
|
||||
gs_vbdata_destroy(_data);
|
||||
_data = nullptr;
|
||||
}
|
||||
}</code>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<p class="block">Several hours of reading the code didn't reveal a single thing. There should have been no way for these memory leaks to occur after this, and yet they did - in total 12 memory leaks were unaccounted for. So I started debugging, and eventually found the culprit: libOBS sets the global obs object to NULL right before unloading all modules, which meant that all the GPU related code would not run.</p>
|
||||
|
||||
<p class="block">This is effectively unfixable from my end, so I've only been able to apply a work around which reduced the memory leaks to 5. Once the OBS Project releases a new OBS Studio version, they should instantly disappear as a fix for this behavior has already been applied to the main code branch of OBS Studio.</p>
|
||||
|
||||
<h3 class="block">Configuration</h3>
|
||||
|
||||
<p class="block">And with that, we are left with two more fixable memory leaks - and the largest difficulty curve I have ever encountered in my entire career in programming. One of the bugs was simply forgetting to free a memory block, but the other was straight up unexplainable behavior. No matter which documentation I looked at, it should not have occured - and yet it did. Try to spot the problem yourself:</p>
|
||||
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block"><code class="block">bool streamfx::ui::handler::have_shown_about_streamfx(bool shown)
|
||||
{
|
||||
if (shown) {
|
||||
obs_data_set_bool(streamfx::configuration::instance()->get().get(), _cfg_have_shown_about.data(), true);
|
||||
}
|
||||
if (streamfx::configuration::instance()->is_different_version()) {
|
||||
return false;
|
||||
} else {
|
||||
return obs_data_get_bool(streamfx::configuration::instance()->get().get(), _cfg_have_shown_about.data());
|
||||
}
|
||||
}</code>
|
||||
<figcaption>Before</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block"><code class="block">bool streamfx::ui::handler::have_shown_about_streamfx(bool shown)
|
||||
{
|
||||
auto config = streamfx::configuration::instance();
|
||||
auto data = config->get();
|
||||
if (shown) {
|
||||
obs_data_set_bool(data.get(), _cfg_have_shown_about.data(), true);
|
||||
}
|
||||
if (config->is_different_version()) {
|
||||
return false;
|
||||
} else {
|
||||
return obs_data_get_bool(data.get(), _cfg_have_shown_about.data());
|
||||
}
|
||||
}</code>
|
||||
<figcaption>After</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Looking at this, the only things that are different are how the std::shared_ptr<streamfx::configuration> and std::shared_ptr<obs_data_t> are stored. Both should have identical results, but they don't. If anyone knows what the actual reason behind this weird behavior is, please leave a comment below, because I couldn't figure it out with the C++ documentation that is available to me.</p>
|
||||
|
||||
<h2 class="block">Closing Words</h2>
|
||||
|
||||
<p class="block">And that is all that was included in the update for version 0.8.1, at least on the user facing side. There are additional changes to the developer facing side, but aside from that, there isn't much to talk about for this version. Go and grab the latest stable version from Github if you haven't already! You can find it <a href="https://github.com/Xaymar/obs-StreamFX/releases/tag/0.8.3" target="_blank" rel="noreferrer noopener">here on Github</a>.</p>
|
||||
|
||||
<p class="block">- Xaymar out.</p>
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: A preview of what's coming with StreamFX v0.9
|
||||
category: Blog
|
||||
tags: [StreamFX, "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">A lot of time has passed since the 0.8 release of StreamFX, and since then a lot of code has been submitted and tested. A ton of issues have been fixed internally, making everything work better, and a lot of new features are being worked on. Let's take a quick look at the already confirmed additions!</p>
|
||||
|
||||
<h2 class="block">The FFmpeg Encoders are now available on Linux!</h2>
|
||||
|
||||
<p class="block">You can now use the fancy NVENC UI/UX from StreamFX on your Linux machine! While zero-copy is not supported due to a limitation in OBS Studio itself, all the encoders should be available to you as long as you have the necessary system drivers. This limitation is not something I can work around, so if you need zero-copy you will have to stick with Windows, or find an alternative solution - or just <a rel="noreferrer noopener" href="https://www.codecademy.com/" target="_blank">learn coding</a> and <a rel="noreferrer noopener" href="https://github.com/obsproject/obs-studio/blob/master/CONTRIBUTING.rst" target="_blank">write the necessary code in OBS Studio</a>.</p><!--more-->
|
||||
|
||||
<h2 class="block">Cleaner UI and code improvements for NVENC!</h2>
|
||||
|
||||
<p class="block">NVENC has received a number of changes, mainly for UI/UX, but also in terms of bug fixes. All the rate limitation options are now under the same group, which slightly cleans up the UI and makes it easier to understand. Furthermore the "Each" mode that was listed for "B-Frame Reference Mode" has been removed, as well as Level 5.2 which wasn't actually supported by the FFmpeg version that OBS Studio uses. Lastly the log file now shows the actual configuration, instead of making one up out of thin air.</p>
|
||||
|
||||
<h2 class="block">Support for AMD AMF H.264 and H.265!</h2>
|
||||
|
||||
<p class="block">Even though I personally no longer own any AMD GPUs, and having no plans to get one in the near future, StreamFX will support encoding via AMD AMF in the upcoming release. Note that this uses FFmpeg to do the work, so any bugs with the encoding result are the result of work done by AMD and should be reported as a bug to AMD. I can't fix the things AMD broke in their own driver, so your contact for bugs there is AMD.</p>
|
||||
|
||||
<h2 class="block">New Shader Parameters: Random and RandomSeed</h2>
|
||||
|
||||
<p class="block">Custom shaders now have access to 16 randomly generated values, of which 4 are generated at creation, another 4 are generated for each activation, and the remaining 8 are generated each frame. These are all based on the user specified seed (accessible as RandomSeed), and as such won't differ from run to run unless the seed is changed. Shader developers can make use of these to implement transitions that look different each time they are used, for example the "Sliding Bars" shader has already been improved with this - it now has slightly different speeds and rotations each time the transition is invoked.</p>
|
||||
|
||||
<h2 class="block">Minor Changes</h2>
|
||||
|
||||
<ul class="block">
|
||||
<li>If an encoder is not supported on the system, it is now hidden from the user.</li>
|
||||
<li>Fixed various memory leaks that happened with more complex setups, causing sources to outlive their scene collection temporarily.</li>
|
||||
<li>Added a workaround for a certain memory leak caused by OBS Studio nulling the OBS object before deallocating plugins.</li>
|
||||
<li>Added proxy encoders to support older configurations, and added configuration migrating for forward compatibility.</li>
|
||||
<li>Shaders can now increase their resolution all the way to 16384² if the GPU supports it.</li>
|
||||
<li>Possibly fixed various "invisible source/filter" issues happening with Shaders.</li>
|
||||
<li>Shader filters now capture the input at the correct resolution.</li>
|
||||
<li>New example shaders to choose from, thanks to Charles 'Surn'/'Oncorporation' Fettinger. (<a rel="noreferrer noopener" href="https://github.com/Xaymar/obs-StreamFX/pull/270" target="_blank">1</a>, <a rel="noreferrer noopener" href="https://github.com/Xaymar/obs-StreamFX/pull/283" target="_blank">2</a>, <a rel="noreferrer noopener" href="https://github.com/Xaymar/obs-StreamFX/pull/284" target="_blank">3</a>)</li>
|
||||
<li>New example source shader thanks to <a rel="noreferrer noopener" href="https://github.com/Xaymar/obs-StreamFX/pull/310/" target="_blank">Robert Moggach</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="block">Conclusion</h2>
|
||||
|
||||
<p class="block">While there is still a lot to do and improve, the current changes already make a huge difference to before. I want to get features into a good state before teaming up with companies and integrating StreamFX officially into other software such as Streamlabs OBS, but it is slowly getting there.</p>
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
title: What happened to the Video Encoding Samples project?
|
||||
category: News
|
||||
tags: ["Video Encoding Samples", "VES", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">Due to the new GPU generations being released by the two major vendors (and soon three major vendors), I've currently put the project on indefinite hold. The current discoveries still hold for all existing encoders, which makes newer tests unnecessary for the time being. Even the early runs have not resulted in different settings compared to before.</p>
|
||||
|
||||
<p class="block">For the time being, I've left the old data online, while I quietly work on making a new, more user friendly version possible. Perhaps I will even allow user submissions in order to increase the number of tested GPUs, but that requires a lot of hosting storage.</p><!--more-->
|
||||
|
||||
<p class="block">For those that have not been around for a long time, the <a rel="noreferrer noopener" href="https://ves.xaymar.com/" target="_blank">Video Encoding Samples</a> project is a simple database of encoding results compared to the original footage with PSNR, SSIM and VMAF. It is the project that has resulted in the <a rel="noreferrer noopener" href="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" target="_blank">ultimate NVENC settings</a>, and also resulted in a lot of yelling at a certain vendor to finally stop dawdling around.</p>
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "NVIDIA RTX 30xx: How to make everything else obsolete in one generation"
|
||||
category: Blog
|
||||
tags: ["NVIDIA", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">NVIDIA certainly wasn't idle in the last two years, that much is clear. Their jump from 12nm to 8nm should set the average standard for what we should expect from moving nodes while also improving on the generation. This generational leap is what we should have seen from the 20xx series, which now seems like overpriced junk - so sorry for anyone who bought them in the last 6 months and can't return them. Let's go into a bit of history and detail.</p>
|
||||
|
||||
<h2 class="block">The AMD side: Shrinking 14nm to 7nm</h2>
|
||||
|
||||
<p class="block">Three years ago in 2017, AMD RTG tried to even the playing field by moving from 14nm to 7nm, and succeeded. Their new RX Vega generation, while extremely power hungry, did improve performance across the board by roughly 30-75%, depending on what you looked at. And in 2019 they improved on that, with the RX 5000 series - except this time we saw practically no (<5%) performance increase, but they did cut down on heat generation and power draw quite a lot.</p><!--more-->
|
||||
|
||||
<p class="block">Unfortunately AMD RTG forgot to improve all the other areas: drivers are still pretty bad, video encoding is even worse, and the feature set is still lacking at the price point. Their top of the line RX 5700 XT at ~350,- € is equal with a RTX 2070 at ~350,- €, while providing no raytracing (RTX), machine learning acceleration (Tensor), or good video encoding and decoding support. AMD RTG bet on the competition not moving forward much, which is their signature move at this point.</p>
|
||||
|
||||
<h2 class="block">The NVIDIA side: Shrinking 12nm to 8nm</h2>
|
||||
|
||||
<p class="block">And in comes NVIDIA and completely shatters that bet with their RTX 30xx launch, showing a nearly 100% improved performance across the board compared to the 20xx series - without actually increasing the TDP by much. Everything was upgraded, <a rel="noreferrer noopener" href="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" target="_blank">except for NVENC which is already pretty damn good</a>, so not only do you get double the performance for less money, you also get new features on top of that.</p>
|
||||
|
||||
<p class="block">One of the new features is AV1 decoding support for up to 8K60 HDR content, which paves the way for future content production and consumption. The other is RTX IO, a way to do on-GPU decoding and decompression of content, which offloads the decoding and decompression of textures from the CPU to the GPU - eliminating a transfer between nodes in the ideal case. We can only wait and see what the future has to offer, and if there's going to be Ti or Super models once again (though I highly doubt it this time).</p>
|
||||
|
||||
<h2 class="block">The Weird Parts: PAM4 memory signaling instead of NRZ</h2>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/09/NVIDIA-GeForce-RTX-3000-Launch-G6X-Memory-PAM4.jpg" alt="" class="wp-image-1456"/><figcaption>The new GDDR6X signaling.</figcaption></figure>
|
||||
|
||||
<p class="block">This slide actually doesn't make a lot of sense to the generic end-user, but it is one of the most important parts of everything. Basically NVIDIA doubled the data rate of their memory interface, without actually increasing the frequency. Instead of transmitting 1 bit per cycle, it's now transmitting 2 bits per cycle.</p>
|
||||
|
||||
<p class="block">In order to actually do this, the 30xx series actually needs to have good enough power isolation and needs to be unaffected by sudden power drops caused by other devices or even itself - a massive downside that increases the price and has its own limitations. It also likely means that the 30xx series will not overclock as high as the previous GPUs would, due to the memory being much more sensitive to voltage differences than before.</p>
|
||||
|
||||
<p class="block">To put it in terms everyone understands, the new way of accessing memory allows NVIDIA to literally do more with less. Increasing the amount of bits transferred per cycle from 1 to 2 is quite literally doubling the effective data rate, so not only can they transfer more data, it also takes half the amount of time to access data. A game with very large textures can be expected to suddenly run up to twice as fast, just with this change alone.</p>
|
||||
|
||||
<h2 class="block">My thoughs on the RTX 30xx Series</h2>
|
||||
|
||||
<p class="block">Raytracing has been really fun to play with, and even my 2080 Ti manages around 20-21 fps at 2560x1440, with all effects turned on. So I'm really excited to see a GPU that can do twice that and push the raytraced view to an actual playable amount of frames, without the need of DLSS - DLSS is nice and all, but it does have very obvious issues, even in DLSS 2.0.</p>
|
||||
|
||||
<p class="block">I'll be waiting for AIB partners to come up with their own designs, and then see real world performance from reviewers such as Linus Tech Tips, Gamers Nexus and similar. So until I see any of that, I'm sticking with my tuned RTX 2080 Ti.</p>
|
||||
@@ -0,0 +1,283 @@
|
||||
---
|
||||
title: "A Review: Gainward RTX 3090 Phantom"
|
||||
category: Review
|
||||
tags: ["NVIDIA", "WordPress Archive"]
|
||||
---
|
||||
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/11/MVIMG_20201115_103525.jpg" alt="" class="wp-image-1709" />
|
||||
<figcaption>Melted PCB</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">Around the end of last week, my Alphacool waterblock decided that it was time to kill the NVIDIA RTX 2080 Ti Founders Edition it was placed on. That was the day I learned that burning PCB and plastic smells the same as coal - and that I should probably replace my smoke detectors since they didn't go off at all.</p>
|
||||
|
||||
<p class="block">That meant I needed a new GPU, and after a bit of search for actually available GPUs, I ended up going for the 3090 cards - nobody apparently has 3080s, only 3070s and 3090s. The card I ended up with is the Gainward RTX 3090 Phantom, which has some limitations but otherwise works well. Let's get into the hard stuff.</p><!--more-->
|
||||
|
||||
<h2 class="block">The GPU</h2>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/11/MVIMG_20201121_144943.jpg" alt="" class="wp-image-1711" />
|
||||
<figcaption>Resting against the reservoir</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">The first thing that came to mind when unboxing this card is "What a monster, will that even fit?". And it barely does, if it were 1mm longer I would have had to return this card, and wait for another one to be available. This card is so long it blocks about 60% of my cable management, and sits directly against the EKWB reservoir+pump combination - longer than the previous 2080 Ti, which was already pretty long to begin with. </p>
|
||||
|
||||
<p class="block">The card requires three separate 8-pin rails, ships with a dual-IDE to 8-pin adapter and even has an acryl laser cut anti-sag part. This anti-sag part seems to have been made for a completely different GPU, as its default position - or any of the possible ones - would be inside of a fan. This also means that it needs 6 entire slots to keep itself in a reasonable position if mounted like in the picture to the right.</p>
|
||||
|
||||
<p class="block">The default BIOS on it disallows undervolting (but allows overvolting, surprisingly enough), comes with a power limit of 100/370/420 W (Min/Std/Max), and supports a weird number of memory chips that just seem to make no sense at all. At the time of purchase the card was sold for 1749,00€, which puts its <em>Price per Watt</em> at 17.49/4.72/4.37 €. <a href="https://www.techpowerup.com/vgabios/226667/226667" data-type="URL" data-id="https://www.techpowerup.com/vgabios/226667/226667" target="_blank" rel="noreferrer noopener">I've uploaded the BIOS to TechPowerUp for verification.</a></p>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2020/11/IMG_20201117_092523.jpg" alt="" class="wp-image-1713" />
|
||||
<figcaption>The Gainward RTX 3090 Phantom, in all its massive glory. To the left is the air cooler of the RTX 2080 Ti FE.</figcaption>
|
||||
</figure>
|
||||
|
||||
<h2 class="block">Testing</h2>
|
||||
|
||||
<p class="block">As usual, testing was performed on my main system, with the following configuration: AMD Ryzen 9 3950X (16/32, Stock, PBO Enabled, Watercooled), 4x G.Skill TridentZ Neo 16GB 3.6Ghz (3.2Ghz, 15-15-15-15-30-45), Gigabyte Aorus X570 Master, 2x1TB SAMSUNG 960 Pro, 2x2TB SanDisk Ultra 3D and a 1000W be Quiet! Pure Power 11. The Driver version used is 457.30, and the average room temperature was measured at 22°C +-1.5°C, which slightly varies from run to run.</p>
|
||||
|
||||
<p class="block">Tests were performed 10 times in sequence, with only the worst 3 results taken and averaged together to create a realistic experience. All games were run at the highest possible settings, which in some games means to actually deviate from the default profile. VSync, GSync and FreeSync were turned off during testing. FrameView was used where possible to measure performance accurately, and the power limit was left at 100%.</p>
|
||||
|
||||
<h3 class="block">Results at 1920x1080</h3>
|
||||
|
||||
<table class="block">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="background-color:#0693e3;color:#ffffff;border-style:none">Game</th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Min FPS</strong></th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Avg FPS</strong></th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>99%ile FPS</strong></th>
|
||||
<th style="background-color:#0693e3;color:#ffffff;text-align:center;border-style:none"><strong>€/Frame</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Anno 1800 (DirectX 12)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">0.57<sup>2</sup></td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">153.63</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">33.55</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">11.38</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Assassin's Creed Odyssey</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">7.27</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">98.37</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">66.94</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">17.78</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Borderlands 3 (DirectX 11)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">13.36</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">116.81</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">89.54</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">14.97</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Borderlands 3 (DirectX 12)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">23.16</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">150.97</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">130.62</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">11.59</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Far Cry 5 (DirectX 11)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">29.28</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">117.93</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">87.65</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">14.83</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Forza Horizon 4</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">160.40</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">186.30</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">N/A<sup>1</sup></td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">9.39</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Tom Clancy's Ghost Recon Breakpoint (Vulkan)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">52.11</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">160.67</td>
|
||||
<td style="text-align:right;background-color:#00264d;border-width:0;color:#ffffff;border-style:none">105.27</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">10.89</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Tom Clancy's Rainbow Six (Vulkan)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">34.30</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">193.07</td>
|
||||
<td style="text-align:right;background-color:#00264d;border-width:0;color:#ffffff;border-style:none">164.20</td>
|
||||
<td style="color:#ffffff;background-color:#00264d;border-style:none;text-align:right">9.06</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="background-color:#00264d;border-style:none;color:#ffffff">Tom Clancy's The Division 2 (DirectX 12)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">59.96</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">119.97</td>
|
||||
<td style="text-align:right;background-color:#00264d;border-width:0;color:#ffffff;border-style:none">99.94</td>
|
||||
<td style="border-top-color:#000;border-right-color:#000;border-bottom-color:#000;border-left-color:#000;color:#ffffff;background-color:#00264d;border-style:none;text-align:right">14.58</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 class="block">Results at 2560x1440</h3>
|
||||
|
||||
<table class="block">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Game</strong></th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Min FPS</strong></th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Avg FPS</strong></th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>99%ile FPS</strong></th>
|
||||
<th style="background-color:#0693e3;color:#ffffff;border-style:none;text-align:center"><strong>€/Frame</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Anno 1800 (DirectX 12)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">24.47</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">122.617</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">57.98</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">14.26</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Assassin's Creed Odyssey</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">7.54</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">88.79</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">62.48</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">19.70</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Borderlands 3 (DirectX 11)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">35.42</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">110.84</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">80.04</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">15.78</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Borderlands 3 (DirectX 12)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">26.33</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">122.19</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">101.67</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">14.31</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Far Cry 5 (DirectX 11)</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">48.97</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">112.80</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">86.63</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">15.51</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Forza Horizon 4</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">130.80</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">153.30</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">N/A<sup>1</sup></td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">11.41</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Tom Clancy's Ghost Recon Breakpoint (Vulkan)</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">48.33</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">132.71</td>
|
||||
<td style="text-align:right;background-color:#00264d;border-top-color:#000;border-width:0;color:#ffffff;border-style:none">99.35</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">13.18</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Tom Clancy's Rainbow Six (Vulkan)</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">32.90</td>
|
||||
<td style="text-align:right;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">115.80</td>
|
||||
<td style="text-align:right;background-color:#00264d;border-width:0;color:#ffffff;border-style:none">101.49</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">15.10</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Tom Clancy's The Division 2 (DirectX 12)</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">46.39</td>
|
||||
<td style="text-align:right;border-top-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">119.60</td>
|
||||
<td style="text-align:right;background-color:#00264d;border-top-color:#000;border-width:0;color:#ffffff;border-style:none">93.56</td>
|
||||
<td style="border-style:none;text-align:right;color:#ffffff;background-color:#00264d">14.62</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 class="block">Synthetic Benchmarks</h3>
|
||||
|
||||
<table class="block">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Game</strong></th>
|
||||
<th style="text-align:center;background-color:#0693e3;color:#ffffff;border-style:none" data-border-color="#8ed1fc"><strong>Score</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">3D Mark Fire Strike Ultra (DirectX 11) - Graphics Score</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">11910</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">3D Mark Port Royal (DirectX 12, DXR) - Graphics Score</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">12694</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">3D Mark Time Spy (DirectX 12) - Graphics Score</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">19596</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">3D Mark Time Spy Extreme (DirectX 12) - Graphics Score</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">9960</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Final Fantasy XIV (DirectX 11, 1920x1080, Maximum)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">20290</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Final Fantasy XIV (DirectX 11, 2560x1440, Maximum)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">18807</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Unigine Superposition (DirectX 11, 1080p Extreme)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">12296</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Unigine Superposition (DirectX 11, 4K Optimized)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">16055</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">Unigine Superposition (DirectX 11, 8K Optimized)</td>
|
||||
<td style="text-align:right;border-bottom-color:#000;border-width:0;color:#ffffff;background-color:#00264d;border-style:none">7174</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- /wp:advgb/table -->
|
||||
|
||||
<!-- wp:list {"ordered":true} -->
|
||||
<ol class="block">
|
||||
<li>Unable to hook with third party tools as the game crashes immediately.</li>
|
||||
<li>Indentical behavior across 10 runs, game runs extremely poorly.</li>
|
||||
</ol>
|
||||
<!-- /wp:list -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">Other Notes</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<ul class="block">
|
||||
<li><a rel="noreferrer noopener" href="https://www.techpowerup.com/reviewdb/Graphics-Cards/NVIDIA/RTX-3090/" target="_blank">List of Reviews by TechPowerUp</a></li>
|
||||
<li>At 1.5 meter distance with a closed case, the GPU still has an audible 65dB loud fan noise.</li>
|
||||
<li>Temperatures reach around 73°C and settle there due to throttling.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="block">Conclusion</h2>
|
||||
|
||||
<p class="block"><strong>Don't waste your money on the Gainward RTX 3090 Phantom</strong>. It performs poorly - often being beaten by a MSI/ASUS/EVGA/Gigabyte RTX 3080 - and constantly overheats, causing it to throttle to performance below a RTX 3080. Wait for stock for one of the well known and reputable brands to be available, as you will get a far better deal out of them.</p>
|
||||
|
||||
<p class="block">In short</p>
|
||||
|
||||
<ul class="block">
|
||||
<li>Available and in stock.</li>
|
||||
<li>BIOS ships with Power Limits of 100/370/420 (Min/Std/Max) Watt.</li>
|
||||
</ul>
|
||||
|
||||
<ul class="block">
|
||||
<li>Requires three 8-Pin PCI-E connectors and ships with a 2xIDE to 8-Pin adapter.</li>
|
||||
</ul>
|
||||
|
||||
<ul class="block">
|
||||
<li>Overheats easily due to poor cooling design.</li>
|
||||
<li>Fans are very loud and exceed 60dB during testing.</li>
|
||||
<li>Sag-prevention device covers an additional 3 PCI-E slots.</li>
|
||||
<li>Performs poorly compared to any other RTX 3090 or RTX 3080.</li>
|
||||
</ul>
|
||||
+260
@@ -0,0 +1,260 @@
|
||||
---
|
||||
title: "Convert Uint8Array to Hex quickly in JS"
|
||||
category: Blog
|
||||
tags: ["JavaScript", "TypedArray", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">As a Programmer I have to deal with a number of programming languages to write code, and one language that repeatedly appears is JavaScript. JavaScript is one of the <a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=et8xNAc2ic8" data-type="URL" data-id="https://www.youtube.com/watch?v=et8xNAc2ic8" target="_blank">weirder languages</a> - similar to PHP in weirdness - which makes it an interesting experience to say the least. Most of the time you're at the whim of a grey box compiler, due to the massive variance of Browsers and Devices that the users use. </p>
|
||||
|
||||
<p class="block">So in order to best approach reality, I have to figure out which APIs are available at any point in time, and also run performance benchmarks in current major browsers available to me. And that's what todays post is about, finding which of the various methods is fast enough for high performance use.</p><!--more-->
|
||||
|
||||
<h2 class="block">The different Methods</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p class="block">Like any other programming language, there are infinite ways to reach the same solution. Some slower, some unreadable and some look like magic. Here are all the unique ones that I could find or come up with, excluding those which did not even manage to convert more than 1000 buffers per second on current generation hardware:</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph {"align":"center","fontSize":"small"} -->
|
||||
<p class="block">All code below is under the <a rel="noreferrer noopener" href="https://opensource.org/licenses/BSD-3-Clause" target="_blank">BSD 3-Claus</a><a href="https://opensource.org/licenses/BSD-3-Clause" target="_blank" rel="noreferrer noopener">e</a><a rel="noreferrer noopener" href="https://opensource.org/licenses/BSD-3-Clause" target="_blank"> </a><a rel="noreferrer noopener" href="https://opensource.org/licenses/MIT" target="_blank">license</a>.<br>Copyright 2020 Michael Fabian 'Xaymar' Dirks <info@xaymar.com></p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3 class="block">Method #1: Array.map() with String.slice()</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:code -->
|
||||
<code class="block">function toHex(buffer) {
|
||||
return Array.prototype.map.call(buffer, x => ('00' + x.toString(16)).slice(-2)).join('');
|
||||
}</code>
|
||||
|
||||
<p class="block">While this one looks complex at first, it's actually just calling the <code>map</code> method of a different class on a different object, which just so happens to work. The rest is simple string modification and then joining the entire array to a string.</p>
|
||||
|
||||
<h3 class="block">Method #2: Array.map() with String.padStart()</h3>
|
||||
|
||||
<code class="block">function toHex(buffer) {
|
||||
return Array.prototype.map.call(buffer, x => x.toString(16).padStart(2, '0')).join('');
|
||||
}</code>
|
||||
|
||||
<p class="block">Same idea as #1, just optimizing the string operations slightly.</p>
|
||||
|
||||
<h3 class="block">Method #3: Array.map() with 4-bit LUT and StringBuilder</h3>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
return Array.prototype.map.call(buffer, x => `${LUT_HEX_4b[(x >>> 4) & 0xF]}${LUT_HEX_4b[x & 0xF]}`).join('');
|
||||
}</code>
|
||||
|
||||
<p class="block">This approach uses a precomputed look-up-table (LUT) to convert any 4-bit value to a hexadecimal symbol.</p>
|
||||
|
||||
<h4 class="block">Method #3.1: Array.map() with 4-bit LUT and String Concat</h4>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
return Array.prototype.map.call(buffer, x => (LUT_HEX_4b[(x >>> 4) & 0xF] + LUT_HEX_4b[x & 0xF])).join('');
|
||||
}</code>
|
||||
|
||||
<h3 class="block">Method #4: Array.map() with 8-bit LUT</h3>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
const LUT_HEX_8b = new Array(0x100);
|
||||
for (let n = 0; n < 0x100; n++) {
|
||||
LUT_HEX_8b[n] = `${LUT_HEX_4b[(n >>> 4) & 0xF]}${LUT_HEX_4b[n & 0xF]}`;
|
||||
}
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
return Array.prototype.map.call(buffer, x => LUT_HEX_8b[x]).join('');
|
||||
}</code>
|
||||
|
||||
<p class="block">Same idea as #3, but with a LUT to convert any 8-bit value to a hexadecimal symbol group.</p>
|
||||
|
||||
<h3 class="block">Method #5: Array.push() with 8-bit LUT</h3>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
const LUT_HEX_8b = new Array(0x100);
|
||||
for (let n = 0; n < 0x100; n++) {
|
||||
LUT_HEX_8b[n] = `${LUT_HEX_4b[(n >>> 4) & 0xF]}${LUT_HEX_4b[n & 0xF]}`;
|
||||
}
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
const out = new Array();
|
||||
for (let idx = 0; idx < buffer.length; idx++) {
|
||||
out.push(LUT_HEX_8b[buffer[idx]]);
|
||||
}
|
||||
return out.join('');
|
||||
}</code>
|
||||
|
||||
<p class="block">Breaking out from the same idea is #5, which builds an array manually instead of letting the JavaScript runtime handle it for us. This also uses the LUT approach.</p>
|
||||
|
||||
<h4 class="block">Method #5.1: Array.set() with 8-bit LUT</h4>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
const LUT_HEX_8b = new Array(0x100);
|
||||
for (let n = 0; n < 0x100; n++) {
|
||||
LUT_HEX_8b[n] = `${LUT_HEX_4b[(n >>> 4) & 0xF]}${LUT_HEX_4b[n & 0xF]}`;
|
||||
}
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
const out = new Array(buffer.length);
|
||||
for (let idx = 0; idx < buffer.length; ++idx) {
|
||||
out[idx] = (LUT_HEX_8b[buffer[idx]]);
|
||||
}
|
||||
return out.join('');
|
||||
}</code>
|
||||
|
||||
<h3 class="block">Method #6: String Concat with 4-bit LUT and StringBuilder</h3>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
let out = '';
|
||||
for (let idx = 0; idx < buffer.length; idx++) {
|
||||
let n = buffer[idx];
|
||||
out += `${LUT_HEX_4b[(n >>> 4) & 0xF]}${LUT_HEX_4b[n & 0xF]}`;
|
||||
}
|
||||
return out;
|
||||
}</code>
|
||||
|
||||
<p class="block">Similar to #5, but this time we directly build a string instead of building an array first.</p>
|
||||
|
||||
<h4 class="block">Method #6.1: String Concat with 4-bit LUT (String += String + String)</h4>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
let out = '';
|
||||
for (let idx = 0; idx < buffer.length; idx++) {
|
||||
let n = buffer[idx];
|
||||
out += LUT_HEX_4b[(n >>> 4) & 0xF] + LUT_HEX_4b[n & 0xF];
|
||||
}
|
||||
return out;
|
||||
}</code>
|
||||
|
||||
<h4 class="block">Method #6.2: String Concat with 4-bit LUT (2x String += String)</h4>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
let out = '';
|
||||
for (let idx = 0; idx < buffer.length; idx++) {
|
||||
let n = buffer[idx];
|
||||
out += LUT_HEX_4b[(n >>> 4) & 0xF];
|
||||
out += LUT_HEX_4b[n & 0xF];
|
||||
}
|
||||
return out;
|
||||
}</code>
|
||||
|
||||
<h3 class="block">Method #7: String Concat with 8-bit LUT</h3>
|
||||
|
||||
<p class="block">Similar to #6, but with an 8-bit LUT. This is effectively <a rel="noreferrer noopener" href="https://stackoverflow.com/a/62922523/1849151" target="_blank">this StackOverflow answer</a>, just much cleaner.</p>
|
||||
|
||||
<code class="block">// Pre-Init
|
||||
const LUT_HEX_4b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
|
||||
const LUT_HEX_8b = new Array(0x100);
|
||||
for (let n = 0; n < 0x100; n++) {
|
||||
LUT_HEX_8b[n] = `${LUT_HEX_4b[(n >>> 4) & 0xF]}${LUT_HEX_4b[n & 0xF]}`;
|
||||
}
|
||||
// End Pre-Init
|
||||
function toHex(buffer) {
|
||||
let out = '';
|
||||
for (let idx = 0, edx = buffer.length; idx < edx; idx++) {
|
||||
out += LUT_HEX_8b[buffer[idx]];
|
||||
}
|
||||
return out;
|
||||
}</code>
|
||||
|
||||
<h3 class="block">Omitted Methods</h3>
|
||||
|
||||
<ul class="block">
|
||||
<li>Native code programmers might have expected a version with a fixed size String, unfortunately that version performed so poorly that it would be ranked at 99.75% slower.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="block">The Results</h2>
|
||||
|
||||
<p class="block">As usual, tests were run on my daily available machines, mainly the 3950X gaming/development PC. These tests were run using JSBench.me, as JSBen.ch had wildly fluctuating results in both Chrome and Firefox. Without and further needless text, here are the result:</p>
|
||||
|
||||
<figure class="block">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="has-text-align-left" data-align="left">Method</th>
|
||||
<th style="text-align: right;">Ops/s</th>
|
||||
<th style="text-align: right;">% Slower</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#1: Array.map() with String.slice()</td>
|
||||
<td style="text-align: right;">15589.45 +- 1.03%</td>
|
||||
<td style="text-align: right;">94.16 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#2: Array.map() with String.padStart()</td>
|
||||
<td style="text-align: right;">17072.61 +- 0.81%</td>
|
||||
<td style="text-align: right;">93.60 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#3: Array.map() with 4-bit LUT and StringBuilder</td>
|
||||
<td style="text-align: right;">34887.21 +- 0.31%</td>
|
||||
<td style="text-align: right;">86.93 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#3.1: Array.map() with 4-bit LUT and String Concat</td>
|
||||
<td style="text-align: right;">35465.37 +- 0.37%</td>
|
||||
<td style="text-align: right;">86.71 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#4: Array.map() with 8-bit LUT</td>
|
||||
<td style="text-align: right;">48936.74 +- 0.70%</td>
|
||||
<td style="text-align: right;">81.66 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#5: Array.push() with 8-bit LUT</td>
|
||||
<td style="text-align: right;">46378.04 +- 0.55%</td>
|
||||
<td style="text-align: right;">82.62 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#5.1: Array.set() with 8-bit LUT</td>
|
||||
<td style="text-align: right;">59356.56 +- 0.59%</td>
|
||||
<td style="text-align: right;">77.76 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#6: String Concat with 4-bit LUT and StringBuilder</td>
|
||||
<td style="text-align: right;">71194.39 +- 0.44%</td>
|
||||
<td style="text-align: right;">73.32 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#6.1: String Concat with 4-bit LUT (String += String + String)</td>
|
||||
<td style="text-align: right;">106905.18 +- 0.62%</td>
|
||||
<td style="text-align: right;">59.94 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#6.2: String Concat with 4-bit LUT (2x String += String)</td>
|
||||
<td style="text-align: right;">135382.25 +- 0.58%</td>
|
||||
<td style="text-align: right;">49.27 %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">#7: String Concat with 8-bit LUT</td>
|
||||
<td style="text-align: right;">266856.91 +- 0.54%</td>
|
||||
<td style="text-align: right;">0.00 %</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<figcaption><a rel="noreferrer noopener" href="https://jsbench.me/vakifoolwu/1" target="_blank">Tests</a> performed in Mozilla Firefox 83.0 (64-bit) on an AMD Ryzen 3950X with 64GB memory. Similar results were observed in Google Chrome 87.0.4280.88.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">Much to my surprise, the String concatenation ones came out on top. Both ended up being roughly 400% faster than their Array based counterparts, which is totally unexpected in this situation. This seems to point at the Array.join() function being poorly implemented in every JavaScript engine, resulting in massive slow downs where barely any should be.</p>
|
||||
|
||||
<p class="block">The results slightly differed between Chrome and Firefox on Desktop, where Chrome performed much worse in tests #1, #2, #3, #3.1 and #4, and better in #5 and #5.1. The same relative performance numbers were observed on mobile in both browsers, which most likely also extend to the Apple platforms. Anyway, with all that text out of the way, it's safe to say that method #7 won the contest, by a large margin - even on mobile.</p>
|
||||
|
||||
<p class="block">- Xaymar</p>
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
title: Accidental NVENC Discoveries
|
||||
category: Blog
|
||||
tags: ["NVIDIA", "NVENC", "H264", "H265", 'WordPress Archive']
|
||||
---
|
||||
|
||||
<p class="block">While testing new updates to the VES testing suite, I discovered some weird behavior in NVENC. Here's a list of them, maybe NVIDIA can shed some light on it:</p><!--more-->
|
||||
|
||||
<h2 class="block">G-Sync affects NVENC Encoding Speed</h2>
|
||||
|
||||
<p class="block">For unknown reasons G-Sync affects the rate of encoding provided by NVENC, no matter how you submit frames to it. So in case you're hitting "Encoding Overloaded" in OBS Studio for no actual reason, try disabling G-Sync globally.</p>
|
||||
|
||||
<h2 class="block">Constant Quality is a lie?</h2>
|
||||
|
||||
<p class="block">The "Constant Quality" encoding method often used for archival and also often mistaken for an alternative to x264 CRF has a default bitrate limit. For H.264/AVC the maximum bitrate it will pick is 135mbit/s, while for H.265/HEVC it will pick is 25mbit/s. You can affect these limits by explicitly setting the maxBitRate ("-maxrate" in FFmpeg) and vbvBufferSize ("-bufsize" in FFmpeg) to a higher value.</p>
|
||||
|
||||
<ul class="block">
|
||||
<li>H.264/AVC<ul>
|
||||
<li>6.2: <code>-maxrate 800000k -bufsize 800000k</code></li>
|
||||
<li>6.1: <code>-maxrate 480000k -bufsize 480000k</code></li>
|
||||
<li>6.0/5.2: <code>-maxrate 240000k -bufsize 240000k</code></li>
|
||||
<li>5.0: <code>-maxrate 135000k -bufsize 135000k</code> (Driver Default)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>H.265/HEVC <ul>
|
||||
<li>6.2: <ul>
|
||||
<li>High: <code>-tier high -maxrate 800000k -bufsize 800000k</code></li>
|
||||
<li>Main: <code>-tier main -maxrate 240000k -bufsize 240000k</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>6.1:<ul>
|
||||
<li>High: <code>-tier high -maxrate 480000k -bufsize 480000k</code></li>
|
||||
<li>Main: <code>-tier main -maxrate 120000k -bufsize 120000k</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>6.0/5.2:<ul>
|
||||
<li>High: <code>-tier high -maxrate 240000k -bufsize 240000k</code></li>
|
||||
<li>Main: <code>-tier main -maxrate 60000k -bufsize 60000k</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>5.1:<ul>
|
||||
<li>High: <code>-tier high -maxrate 160000k -bufsize 160000k</code></li>
|
||||
<li>Main: <code>-tier main -maxrate 40000k -bufsize 40000k</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>5.0:<ul>
|
||||
<li>High: <code>-tier high -maxrate 100000k -bufsize 100000k</code></li>
|
||||
<li>Main: <code>-tier main -maxrate 25000k -bufsize 25000k</code> (Driver Default)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p class="block">Please note that doing this means that you will need a more modern decoder to view or edit the footage. I still recommend to go with the highest possible maximum bitrate in order to get the best out of your footage.</p>
|
||||
|
||||
<h2 class="block">H.265/HEVC struggles representing Foliage</h2>
|
||||
|
||||
<p class="block">Even with the above maximum bitrate fix applied, the HEVC NVENC encoder has a weird affinity to just murder foliage for no actual reason. It seems that there is a noise pattern detection method that freaks out once the foliage gets too large, and fails to adapt to the fact that the foliage now has even more detail than before.</p>
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
title: A guide to achieving high quality Recordings
|
||||
category: Blog
|
||||
tags: ["Tutorial", "NVENC", "OBS Studio", 'WordPress Archive']
|
||||
---
|
||||
|
||||
<p class="block">Every since publishing the guide on how to achieve the <a rel="noreferrer noopener" href="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" data-type="URL" data-id="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" target="_blank">best possible NVIDIA NVENC quality with FFmpeg 4.3.x and below</a>, people repeatedly ask me what the best possible recording settings are. So today, as a Christmas present, let me answer this question to the best of my knowledge and help all of you achieve a quality you've never seen before. Read the full guide <a href="https://blog.xaymar.com/high-quality-recordings/" data-type="URL" data-id="https://blog.xaymar.com/high-quality-recordings/" target="_blank" rel="noreferrer noopener">here</a>.</p>
|
||||
@@ -0,0 +1,927 @@
|
||||
---
|
||||
title: "AV1: The current future of Video"
|
||||
category: Blog
|
||||
tags: ["AV1", "H264", "H265", "x265", "NVENC", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">It has been a while since I last checked out AV1, but even then AV1 was still dominating in quality and compression. Now it's time to revisit the tests I've done back then, so grab a coffee, take a seat, cause this is going to be one long ride.</p><!--more-->
|
||||
|
||||
<h1 class="block">Setup</h1>
|
||||
|
||||
<p class="block">Today we'll test H264 via x264 veryslow as well as NVENC, HEVC via NVENC, and AV1 via libsvtav1. x265 was excluded due to unclear licensing and patent situation, and VP9 was excluded because none of the current encoders reach any reasonable encoding performance. The settings used for each encoder are:</p>
|
||||
|
||||
<ul class="block"><li>x264: <code>-preset veryslow</code></li><li>NVENC H264 uses <a rel="noreferrer noopener" href="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" data-type="URL" data-id="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" target="_blank">these</a> plus: <code>-preset p7 -tune hq -refs 32 -rc vbr</code></li><li>NVENC HEVC is similar to H264, except that -refs is only set to 4 (driver/hardware limitation).</li><li>libsvtav1: <code>-rc vbr -preset 8</code></li></ul>
|
||||
|
||||
<p class="block">Settings were intentionally set up for VBR encodes instead of CBR, as CBR streaming should no longer be used in the modern day - VBR is superior with a proper streaming protocol.</p>
|
||||
|
||||
<p class="block"><strong>Note:</strong> If your browser does not use hardware decoders and the developers have refused to do so, you might have to opt for the classic right click and download method. If you don't know how to do that, perhaps now is the time to experiment a little - or use Google.</p>
|
||||
|
||||
<h3 class="block">Videos</h3>
|
||||
|
||||
<p class="block">If you're not yet familiar with my Video Encoding Samples, it is my attempt at making a reproducable video encoding and testing environment, producing results in a few hours with as many tests performed as possible. For this test, I'm using footage from the sample videos provided <a rel="noreferrer noopener" href="https://github.com/Xaymar/video-encoding-samples/wiki/Sample-Videos" data-type="URL" data-id="https://github.com/Xaymar/video-encoding-samples/wiki/Sample-Videos" target="_blank">here</a>.</p>
|
||||
|
||||
<h3 class="block">Bitrates</h3>
|
||||
|
||||
<p class="block">Of interest to me are how well each codec handles extremes, whether it is the content being extremely difficult to encode, or the bitrate being extremely low. Multiple examples will be provided at different bitrates, each annotated to show which bitrate it is. The bitrates used are: 1mbit, 2mbit, 3.5mbit, 6.0mbit. </p>
|
||||
|
||||
<p class="block">To noones surprise, AV1 is on top in every single test. The distance between H.264, HEVC and AV1 only increases with reduced bitrates, but don't let me tell you what to think, instead look at the results themselves:</p>
|
||||
|
||||
<h1 class="block">ARMA 3 002: "Short walking section through heavy foliage"</h1>
|
||||
|
||||
<h4 class="block">6mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1900} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1901} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1903} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1902} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>H.264 is fighting with all it's got, but it's not enough. HEVC and AV1 dominate here in quality, with AV1 having the advantage of being a software encoder.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1907} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1908} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1910} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.3500k-0-3500k-7000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1909} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>H.264 is already waving the white flag, but HEVC is still holding up. AV1 is ready for us to actually begin the fight, as it has yet to actually give it 10% of what it's capable of.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1917} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.2000k-0-2000k-4000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1918} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.2000k-0-2000k-4000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1919} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.2000k-0-2000k-4000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1921} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.2000k-0-2000k-4000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>H264 has been reduced to nothing more than its bones, but HEVC is still fighting but struggling to maintain composure. AV1 however is now sweating, regretting its earlier to decision to ask us to turn up the heat.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1912} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1913} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1915} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1914} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/arma_3-002.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Every encoder is now waving the white flag. I wouldn't want to watch this.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1>Black Mesa 001: "Fighting Section in Labs"</h1>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>6.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1933} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1934} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1935} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1936} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>H.264 manages to be watchable here, only lacking in detail and sharpness, and occasionally becoming noisy/blocky. HEVC is much sharper and detailed, but has issues in combat. AV1 is apparently unfazed by what's going on.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1937} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1938} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1940} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.3500k-0-3500k-7000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1939} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>It is clear that this is taxing on H.264 encodes already, but they still remain watchable despite the obvious lack of quality. HEVC is also now struggling to maintain overall quality, having dropped in detail and sharpness. AV1 is laughing at us.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1929} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.2000k-0-2000k-4000k-x264.mp4"></video></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1930} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.2000k-0-2000k-4000k-h264_nvenc.mp4"></video></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1932} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.2000k-0-2000k-4000k-libsvtav1.mp4"></video></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1931} -->
|
||||
<figure class="block"><video controls src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.2000k-0-2000k-4000k-h265_nvenc.mp4"></video></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Both H.264 encoders are now unable to maintain watchable quality, and even HEVC is barely making ends meet. AV1 still has stopped laughing.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1925} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1926} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1928} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1927} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/black_mesa-001.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>HEVC and H.264 are giving up, waving the white flag. AV1 is now taunting us with the classic "Is that all you got? Pathetic." line, while visibly sweating.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1>Final Fantasy XIV 002: "The Singularity Reactor - King Thordan Phase Transition"</h1>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>6.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1956} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1959} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1960} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1958} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Both H.264 and HEVC struggle to maintain quality, while AV1 is still really watchable.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1951} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1950} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1952} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.3500k-0-3500k-7000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1949} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>The trend continues, with AV1 being the only really watchable one.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1947} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.2000k-0-2000k-4000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1945} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.2000k-0-2000k-4000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1948} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.2000k-0-2000k-4000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1946} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.2000k-0-2000k-4000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>NVENC H.264 has given up, and is encoding at 3.1mbit, x264 is unwatchable and HEVC is getting close to its limit. AV1 is still watchable, but definitely would not meet my quality standards.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1942} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1941} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1943} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1944} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/final_fantasy_xiv-002.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Every encode is practically trash now, AV1 is watchable, but not by a lot.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1>Forza 4 Horizon 001: "Racing at Dusk"</h1>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>6.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1961} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1963} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1965} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1964} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Straight from the start, HEVC and AV1 set themselves apart from H.264 with sharpness and detail. AV1 one ups HEVC here even.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1967} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1966} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1969} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.3500k-0-3500k-7000k-libsvtav1-1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1968} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>The ancient H.264 codec is now bordering on unwatchable, with much blocking and noise. HEVC is starting to come apart at the seams, but still maintaining reasonable quality. AV1 is still flexing on the other codecs here.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1970} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.2000k-0-2000k-4000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1971} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.2000k-0-2000k-4000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1972} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.2000k-0-2000k-4000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1973} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.2000k-0-2000k-4000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>The heap of bones you can see here is called H.264, which has reverted to its most basic form - the bitstream. H265 is also struggling hard with this bitrate, with nearly all of the foliage having lost any detail and visible blocking all over the place. AV1 maintains smoothness, but also starts to have issues with foliage.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1975} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1977} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1976} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1978} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/forza_4_horizon-002.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>There's still a pile of bones called H264, and H265 is currently burning at the stake. AV1 is avoiding most of the fire, but is still hurting and not in perfect condition anymore.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1>GRIP 001: "Racing on Space Station"</h1>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>6.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1980} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1981} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1982} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1983} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Only HEVC and AV1 manage to encode this at a reasonable quality, due to the post-processing grain this game adds by default. HEVC is definitely struggling with motion however, and AV1 is visibly better than HEVC</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1984} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1986} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1987} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.3500k-0-3500k-7000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1985} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>The white flag has been raised by both H264 encoders, and HEVC is fighting with all its got. AV1 is not impressed so far.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1988} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.2000k-0-2000k-4000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1990} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.2000k-0-2000k-4000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2002} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.2000k-0-2000k-4000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1989} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.2000k-0-2000k-4000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Again both H264 encoders are waving the white flag (🏳), and HEVC is no longer watchable. AV1 is still strong, but definitely hitting its limits as well.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1992} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1993} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1994} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1995} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-001.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Once again, NVENC H264 is cheating and using more bitrate than allowed, but even then it's still not enough for anything watchable. HEVC has given up and even AV1 is having issues - but they might be resolved at higher presets, as this preset doesn't enable grain synthesis.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1>GRIP 002: "Race through orange desert"</h1>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>6.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1996} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1997} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":1999} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":1998} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>HEVC is visibly better than H264 already, with increased detail and clarity. AV1 doesn't differ much from HEVC at this bitrate.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2004} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2005} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2007} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.3500k-0-3500k-7000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2006} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>HEVC and AV1 are the only codecs I'd consider watchable here, with AV1 keeping slightly more clarity in the image than HEVC.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2008} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.2000k-0-2000k-4000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2009} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.2000k-0-2000k-4000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2011} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.2000k-0-2000k-4000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2010} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.2000k-0-2000k-4000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>You already know the deal, H264 is not capable of anything at this bitrate. AV1 and HEVC are definitely struggling here, but AV1 wins in pure clarity again.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2012} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2013} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2015} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2014} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/grip-002.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Everything is pretty much just a mess of blocks at this point. HEVC and AV1 maintain some level of clarity, enough to see what's going on at least. AV1 is better than HEVC only in some areas, falling behind or equalling it in others.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1>Satisfactory 001: "Exploration at Night"</h1>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>6.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2035} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.6000k-0-6000k-12000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2017} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.6000k-0-6000k-12000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2019} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.6000k-0-6000k-12000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2018} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.6000k-0-6000k-12000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Pretty much all encoders are having issues, with HEVC and AV1 still maintaining watchable quality.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>3.5mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2020} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.3500k-0-3500k-7000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2021} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.3500k-0-3500k-7000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2022} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.3500k-0-3500k-7000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2023} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.3500k-0-3500k-7000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Still a similar situation with only HEVC and AV1 maintaining watchable quality. AV1 seems to be slightly faster in recovery, but that's most likely due to software encoding being used.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>2.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2024} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.2000k-0-2000k-4000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2025} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.2000k-0-2000k-4000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2027} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.2000k-0-2000k-4000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2026} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.2000k-0-2000k-4000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>AV1 is starting to show its strengths again, with significantly reduced blocking in motion. H264 and H265 here is not that great anymore.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":4} -->
|
||||
<h4>1.0mbit</h4>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:columns -->
|
||||
<div class="wp-block-columns"><!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2028} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.1000k-0-1000k-2000k-x264.mp4"></video><figcaption>x264</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2029} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.1000k-0-1000k-2000k-h264_nvenc.mp4"></video><figcaption>h264_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column -->
|
||||
|
||||
<!-- wp:column -->
|
||||
<div class="wp-block-column"><!-- wp:video {"id":2031} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.1000k-0-1000k-2000k-libsvtav1.mp4"></video><figcaption>libsvtav1</figcaption></figure>
|
||||
<!-- /wp:video -->
|
||||
|
||||
<!-- wp:video {"id":2030} -->
|
||||
<figure class="block"><video controls preload="none" src="https://cdn.xaymar.com/blog/2020/12/satisfactory-001.1000k-0-1000k-2000k-h265_nvenc.mp4"></video><figcaption>hevc_nvenc</figcaption></figure>
|
||||
<!-- /wp:video --></div>
|
||||
<!-- /wp:column --></div>
|
||||
<!-- /wp:columns -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>At 1mbit, none of the codecs are reasonable quality. Though I'd still call AV1 much better than any of the other ones.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:nextpage -->
|
||||
<!--nextpage-->
|
||||
<!-- /wp:nextpage -->
|
||||
|
||||
<!-- wp:heading {"level":1} -->
|
||||
<h1 class="block">Ending Words</h1>
|
||||
|
||||
<p class="block">From the results here, it seems like AV1 will take over as the one codec to rule them all. While we do not yet have real-time capable encoding at high resolution and framerates on consumer-grade computers yet, this will most likely change with one GPU generation. Hardware decoding for AV1 is already confirmed to be available in the NVIDIA 30xx Series, AMD 6xxx Series, and seemingly the new Intel iGPUs</p>
|
||||
|
||||
<p class="block">That's all for now.</p>
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: "A Look Back: Creating a VST 2.x Plug-In from Nothing (Part 1)"
|
||||
category: Blog
|
||||
tags: ["VoiceFX", "VST", "VST 2.x", "WordPress Archive"]
|
||||
---
|
||||
|
||||
|
||||
<p class="block">When I started with <a href="https://blog.xaymar.com/projects/voicefx/" data-type="URL" data-id="https://blog.xaymar.com/projects/voicefx/" target="_blank" rel="noreferrer noopener">VoiceFX</a>, my original goal was to only support VST 3.x, as it was the most modern version of the SDK, and surely by now every important software had moved to it. Unfortunately I didn't account for the occasional big shot releasing a modern product with a relatively ancient version of the SDK - an SDK that no longer officially exists. So what do you do in this situation?</p>
|
||||
|
||||
<p class="block">You do what every other totally sane developer does and start a clean-room reverse engineering project for the now abandoned VST 2.x SDK, staying faithful to the law. And finally, after roughly 5 months of development, I managed to make it work. So how did I get there?</p><!--more-->
|
||||
|
||||
<h2 class="block">Establishing the Boundaries</h2>
|
||||
|
||||
<p class="block">When trying to stay within the law, you have to establish clear boundaries. Especially for clean-room reverse engineering, I had to go into quite a few lawsuits about it to figure out what is and is not allowed. In the end, I had to actually ask a lawyer for advice, which ended up with some costs, and the advice I got boiled down to this:</p>
|
||||
|
||||
<ol class="block">
|
||||
<li>Any work performed must be for the purpose of interoperability.</li>
|
||||
<li>Don't use any original material or third-party source material that is not clearly set apart from the original.</li>
|
||||
<li>Avoid the use of reverse engineering tools where possible.</li>
|
||||
</ol>
|
||||
|
||||
<p class="block">These rules sound simple, but they ended up making the project a living hell. I had to rely only on information that was clearly detached from the applications used, or not at all rely on these applications. A single misstep and you end up with a huge amount of legal issues. But what other option do I have when the actual SDK is now intentionally hidden by the creators, but still in use by commercial applications released today?</p>
|
||||
|
||||
<h2 class="block">Where is the Entry?</h2>
|
||||
|
||||
<p class="block">I have to begin somewhere, and for VST 2.x Plug-Ins and Hosts, it is the interface to the Plug-In itself. I needed to figure out the "entry point" from which everything starts, and what that entry point actually does, which meant I had to look into what existing VST 2.x Plug-Ins export. On Windows, I could hook into <code>GetProcAddress</code>, while on Linux, I could hook into <code>dlsym</code>.</p>
|
||||
|
||||
<p class="block">I ended up using the Windows function for the initial steps and after filtering out several thousand unrelated strings, I finally found something that looked relevant: a string with the content "<em>VSTPluginMain</em>". This string was often accompanied by "<em>MAIN</em>" and "<em>main_macho</em>", which I assume are for Windows and MacOS exclusive VST 2.x plugins only.</p>
|
||||
|
||||
<p class="block">I had the name of the entry point, but none of it's details - in common terms, I knew where the door was, but not where the knob was, what the key looked like, and how it would even open. But I had a start, a which is more than nothing, and gave me the necessary push required to move on after almost giving up from the mass of data.</p>
|
||||
|
||||
<h2 class="block">Lockpicking the Entry</h2>
|
||||
|
||||
<p class="block">While having an entry point is great, it still being locked is a problem - it needs to be unlocked for us to actually do anything. I could not rely on anything but the most basic tools at this point, as every information other tools may give me could be wrong. The only tool that I had available to unlock the entry point are the CPU registers, so the work began.</p>
|
||||
|
||||
<p class="block">On AMD64, you have the registers (R)AX, (R)BX, (R)CX, (R)DX, (R)SI, (R)DI, (R)BP, (R)SP, R8, R9, R10, R11, R12, R13, R14, R15, (R)IP, and (R)FLAGS. All of these have the potential to hold critical information, but some of these will actually contain useful information. I won't bore you with the details about x86/amd64 Assembly here, there's plenty of other resources out there that are easily found if you're actually into that.</p>
|
||||
|
||||
<figure class="block"><a href="https://cdn.xaymar.com/blog/2021/03/devenv_1Jn50r0LKs.png"><img src="https://cdn.xaymar.com/blog/2021/03/devenv_1Jn50r0LKs.png" alt="" class="wp-image-2162" /></a>
|
||||
<figcaption>Register debugging is not fun.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">The short form of testing is that I found two clear patterns that repeated every single time: (R)CX would point into some kind of <em>read-only executable</em> memory, while the value in (R)AX when returning would result in different crashes - except if the value is zero. So most likely I was looking at two pointers of some kind, one as the argument, one as the return value.</p>
|
||||
|
||||
<p class="block">That left the calling convention, which is where it got a bit difficult. I've never had a clear resource on what each calling convention actually does, but it seems that 64-bit has somewhat unified the world to stop creating additional standards for something so critical. I have no idea what the 32-bit calling convention would be, but my assumption is that it is either <code>stdcall</code> or <code>cdecl</code>, with the latter sounding more sane - time will tell.</p>
|
||||
|
||||
<h2 class="block">Magic Space</h2>
|
||||
|
||||
<p class="block">With the entry point unlocked, but without a clear idea of what it does, questions flooded into my mind. <em>Clearly the value I'm returning has some sort of meaning, so can I affect the behavior in other ways that just returning 0?</em> <em>What if I have a bunch of memory which is all filled with 0, but I return the pointer to that memory?</em> <em>How large does that memory have to be if that works?</em></p>
|
||||
|
||||
<p class="block">While it seemed simple to test, of course the reality turned out to be much harder. My initial idea of simply returning memory that shrinks every time it succeeds resulted in a size of 4 bytes - nowhere enough to store anything. There was clearly something going on with the first four bytes, but what? It had to be a magic number of some kind to clearly identify the structure.</p>
|
||||
|
||||
<p class="block">And so I wrote a script which would repeatedly launch a VST 2.x host application with a crafted plug-in, which on every iteration would try a new number to insert into the first four bytes. And lo and behold, after 1450406992 iterations, I found the exact string: <em>VstP</em>.</p>
|
||||
|
||||
<p class="block">I assume that this is short for Vst Plug-In, and it should have occured to me - before I wasted several kWh on this problem - to attempt to limit the possible values of each byte. But I now had the magic number, and thanks to it I had a rough estimate of the size of the memory to return: roughly 128 bytes or more.</p>
|
||||
|
||||
<h2 class="block">Structural Inspection</h2>
|
||||
|
||||
<p class="block">With the magic number in place, it was time to delve into what the structure actually contains aside from the first four bytes clearly being a magic number. The easiest way to check data integrity is by poisioning it intentionally, and that's exactly what I did: I started inserting 1 bit changes at random locations to figure out what does and does not cause problems.</p>
|
||||
|
||||
<p class="block">I didn't have to wait long to hit something. Precisely when I chose the bytes 8 though 15 I was hitting something critical that seems to be used right after loading the VST 2.x Plug-In. The length of this looked suspiciously like a pointer, so my first attempt was to place a function at this point, and my guess was right. I was now hitting a breakpoint in my newly created function.</p>
|
||||
|
||||
<p class="block">After more register investigation, I figured out that the function in total has 6 arguments, of which two are pointers (one pointing at the memory i returned from the entry point), one is at least 8 bits, another is at least 24 bits (most likely 32), another is either 16, 32 or 64, and one is a 32 bit float. Going by the <a rel="noreferrer noopener" href="https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160" target="_blank">MSVC x64 calling convention</a>, I guessed at the rough order of parameters, which seems to be correct so far. Time will tell if I messed up.</p>
|
||||
|
||||
<h2 class="block">Difficulty Spike</h2>
|
||||
|
||||
<p class="block">At this point, the difficulty went from <em>Easy</em> to <em>Dark Souls but you only have the X button</em>. It was time to start logging the calls to the function which I dubbed "control", every single one that would happen. It did not take long for patterns to emerge on most VST 2.x Hosts, with the most common calls having the second parameter be 0x2D, 0x2F, 0x30, 0x31, 0x3A, 0x23, 0x0A, 0x0B, and finally 0x00 - I called this parameter the "opcode".</p>
|
||||
|
||||
<p class="block">Unfortunately after this much time I can't remember the exact details anymore. Some of them are extremely obvious, like 0x0A which sets the sample rate. Others were more complex and I only just recently figured out what they mean and how to use them correctly through the development of VoiceFX. </p>
|
||||
|
||||
<p class="block">However this part is already long enough, so I'll continue with this in the 2nd part in the future.</p>
|
||||
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: "High Quality Streaming (with OBS Studio)"
|
||||
published: false
|
||||
---
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Creating entertaining, educational or otherwise useful content while live is a tough job, but it is a rewarding job if you make it. And I'm here to help you get started producing high quality content the moment you set foot into the world of streaming, at least in terms of Audio and Video - I can't help you if your content itself is unwatchable.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:more -->
|
||||
<!--more-->
|
||||
<!-- /wp:more -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2>Setting up the Basics</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Everyone has to go back to the basics sometimes, some more than others, some less. It is important to sometimes take a step back and get a proper look at what you are actually doing, and if it is actually working as it should. Sometimes it doesn't, sometimes it does, and sometimes it's based on luck entirely. So let's try to strip out the "doesn't work" and "luck" part entirely, and ensure that you get high quality right from the basics.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3>Good Audio on a Budget</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Audio is what you and your viewers hear, or what is converted into words on screen if you happen to have a subtitling software running for disabled viewers. It is one of three critical parts of streaming, and messing it up can drive away interested viewers the moment things go out of control. As a Creator you want to sound better than the masses that don't know how to do it right, not the same.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>One thing many people get wrong is that they assume that every piece of Hardware is the same, which has resulted in the annoying "48 kHz is enough!" argument that went way out of control. Not only does it not apply universally, it also requires good Hardware or Software resampling - and the former is not very common in cheap or integrated Hardware. So the next best thing that we can use is Software resampling, which will often sound better.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"align":"right","id":2183,"sizeSlug":"thumbnail","linkDestination":"media"} -->
|
||||
<div class="wp-block-image"><figure class="alignright size-thumbnail"><a href="https://cdn.xaymar.com/blog/2021/04/rundll32_lK2mC1aylX.png"><img src="https://cdn.xaymar.com/blog/2021/04/rundll32_lK2mC1aylX.png" alt="" class="wp-image-2183"/></a><figcaption>96 kHz Sample Rate</figcaption></figure></div>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>If your Hardware doesn't have a good resampling chip, you should set it to it's native Sample Rate. For many devices this is either 96 kHz or 192 kHz, but often 96 kHz should already sound better than 48 kHz to a trained ear. On the flip side, stacking a good hardware resampling chip with a mediocre software resampling implementation actually degrades audio quality - watch out for that when you have good audio hardware.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Finally in order to complete the basic Audio set up, all that's left is setting up OBS Studio accordingly. That means setting the Sample Rate to 48 kHz or 44.1 kHz (depending on the streaming platform), and setting the correct number of channels - which is almost always Stereo now. If you used a higher Hardware Sample Rate, you will now have OBS Studio resampling your Audio single to the correct Sample Rate with a mediocre but not awful resampling algorithm. </p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"align":"center","id":2184,"sizeSlug":"full","linkDestination":"media"} -->
|
||||
<figure class="block"><picture><a href="https://cdn.xaymar.com/blog/2021/04/obs64_WQLZxOUwrI.png"><img src="https://cdn.xaymar.com/blog/2021/04/obs64_WQLZxOUwrI.png" alt="" class="wp-image-2184"/></a><figcaption>OBS Studio should be set to 48 kHz Stereo</figcaption></figure></div>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!-- wp:heading {"level":3} -->
|
||||
<h3>Video for Everyone</h3>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p></p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p></p>
|
||||
<!-- /wp:paragraph -->
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: "Low Latency Streaming to Twitch"
|
||||
category: Blog
|
||||
tags: ["Tutorial", "Twitch", "OBS Studio", "StreamFX", "x264", "NVENC", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">If you've been following my social media for the past few years, or have read my <a rel="noreferrer noopener" href="https://blog.xaymar.com/guides/high-quality-recordings/" target="_blank">Recording</a> or <a rel="noreferrer noopener" href="https://blog.xaymar.com/2020/06/24/the-art-of-encoding-with-nvidia-turing-nvenc/" target="_blank">Streaming on NVIDIA Turing/Ampere</a> guides, I'm always chasing the next higher level of "perfection". And this time I was chasing the lowest possible latency on Twitch - and it appears that I have finally found it, after days of trying.</p><!--more-->
|
||||
|
||||
|
||||
<p class="block">My search began as usual, with a manual investigation into the problem - I didn't have infinite resources to throw at the problem, and I didn't want to increase Twitch's hosting costs either. Therefore I was stuck with manual testing, which worked out well enough in the end for me, and didn't take much time either. I started my testing with the Key-Frame Interval, going down from 5 Seconds to 1 Second in 1 Second interval. </p>
|
||||
|
||||
<p class="block">Oddly enough, I noticed that certain Intervals would end up "grouped together" into a higher latency. For example, 1 Second and 2 Seconds would end up being 3 Seconds of latency, while 3 Seconds and 4 Seconds would end up being 5 Seconds of latency, and 5 Seconds ended up being 7 Seconds of latency. Unable to make sense of it, I moved on to other settings. </p>
|
||||
|
||||
<p class="block">Look-Ahead was the first one to recieve the axe, and it made no difference - 30 Frames or 0 Frames, both had the same latency. Similar to this was Zero-Latency and B-Frames, neither made a difference. But one option did, and it is what every RTMP+HLS based service recommends against: Adaptive I-Frames, or Scene Cut in x264 terms.</p>
|
||||
|
||||
<p class="block">Both x264 and NVENC use this option to insert complete Key-Frames if they happen to be a better option, for example with a fade to black, or a complete cut to new content. Unfortunately this option results in a measurable and visible increase in latency between a 250 and 500ms - half a Second gone to unfortunate Key-Frame placement.</p>
|
||||
|
||||
<p class="block">This brought the latency ladder down to ~2.4 Seconds for a Key-Frame Interval of 1 and 2 Seconds, ~4.2 Seconds for an Interval of 3 and 4, and ~5.6 Seconds for an Interval of 5. Careful observers may have just noticed the same thing I did, which is that the latency appears to climb in ~1.5 Second intervals - and that's what I tested next. </p>
|
||||
|
||||
<p class="block">I set up the Key-Frame Interval to 1.5 Seconds, and then I watched the Video Stats...</p>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2021/04/msedge_dRkkOGANII.png" alt="" class="wp-image-2197" width="425" height="409" />
|
||||
<figcaption>One Second Transport Latency</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block"><strong>I finally had it.</strong> Almost a perfectly flat 1 Second latency for the stream itself, though with all the Rendering, Encoding and Muxing buffering, it still ended up being roughly 2 Seconds. Which is still less than the lowest total latency I managed with Adaptive I-Frames being Enabled, and any other Key-Frame Interval. I repeated this test several times, and was able to achieve the same latency over several hours in Firefox, Chrome and Edge. I am a happy Twitch streamer now.</p>
|
||||
|
||||
<p class="block"><strong>Disclaimer:</strong> This discovery is not guaranteed to work everywhere, and may be unique to the Ingest server I used. It may even be different due to changing which GPU is used, which CPU is used, which RAM is used, how your network looks like, etc. <em>It is provided at no guarantee or warranty.</em></p>
|
||||
@@ -0,0 +1,100 @@
|
||||
---
|
||||
title: "AMD and the Curse of Conflicting Information"
|
||||
category: Blog
|
||||
tags: ["AMD", "Ryzen", "Overclocking", "Undervolting", "Curve Optimizer", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">Against better judgement to just wait, back in December 2020, I ordered a AMD Ryzen 9 5950X - and received possible one of the worst chips to be on the market. In Cinebench R23, it achieved a Single Core score of ca. 1550, with a Multi Core score of ca. 24040. This by itself doesn't look too bad, until you open Cinebench R20 and get ca. 580 in Single Core, with Multi Core just barely hitting the 9800 barrier.</p>
|
||||
|
||||
<p class="block">So I did what any person with this hardware would do, and searched for overclocking options.</p><!--more-->
|
||||
|
||||
<h2 class="block">Overclocking on AMD Ryzen</h2>
|
||||
|
||||
<p class="block">With Zen3, AMD has granted us overclockers more than enough options to edge out every possible point of performance we can possibly need at the current time. Some of them are exclusive to any other method, while other methods can stack to some degree. I'll only look at the main three here:</p>
|
||||
|
||||
<ol class="block">
|
||||
<li><strong>VCore:</strong> This is your classic undervolting option which can be used to offset the Voltage the CPU Cores actually get.</li>
|
||||
<li><strong>PBO:</strong> Automatically increases the Boost clock speed and voltage according to a built in Voltage/Multiplier curve, up to the limits specified by you or the Motherboard. Not exclusive with VCore.</li>
|
||||
<li><strong>Curve Optimizer:</strong> An offset applied to the indexing of the Voltage/Multiplier curve, with each step being 3-5mV according to AMD. Not exclusive with VCore, but appears to do the same.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="block">VCore vs Curve Optimizer</h2>
|
||||
|
||||
<p class="block">A fair number of resources out there state that VCore offsets and Curve Optimizer are exclusive. In a perfect ideal CPU sample, they are, but in reality, it's not that simple. In order to understand why, it is necessary to understand the basics of how PBO figures out what Multiplier it can actually run at. Most likely, AMD uses a Look-Up-Table (LUT) to figure out what Multiplier to use. Below is an example of such a LUT:</p>
|
||||
|
||||
<figure class="block">
|
||||
<table class="has-fixed-layout">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>mV</th>
|
||||
<th style="text-align: center;">300</th>
|
||||
<th style="text-align: center;">305</th>
|
||||
<th style="text-align: center;">310</th>
|
||||
<th style="text-align: center;">315</th>
|
||||
<th style="text-align: center;">320</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><strong>Multiplier</strong></td>
|
||||
<td style="text-align: center;">37.500</td>
|
||||
<td style="text-align: center;">37.625</td>
|
||||
<td style="text-align: center;">37.750</td>
|
||||
<td style="text-align: center;">37.875</td>
|
||||
<td style="text-align: center;">38.000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<figcaption>Example PBO Look-Up-Table</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">For now, let's ignore the additional calculations for the allowed maximum mV and Multiplier, and just assume it is a perfect world. If the user has Curve Optimizer disabled, a lookup for which Multiplier would apply at +310mV would return 37.750. But if the Curve Optimizer is set to -10mV (-2 in the options), the Multiplier returned would be 38.000 - we offset the Multiplier lookup up by 2 in the table.</p>
|
||||
|
||||
<p class="block">And then there is VCore offsets, which sound like they should do the same, but in reality they don't. Unlike PBO and Curve Optimizer, VCore offset does not modify which multiplier we end up with, it only modifies the effective Voltage. So in the above example with PBO and Curve Optimizer at -2 with an offset of -25mV, we'd still have lookup for +320mV a Multiplier of 38.000, but now our Voltage offset is only +295mV.</p>
|
||||
|
||||
<p class="block">So now I hope you understand the difference between the two options and why they are not exclusive to each other. It is true that a fixed VCore will break PBO and Curve Optimizer, but offsets are perfectly fine. In fact, I wrote this blog post with PBO On, Curve Optimizer at -10, and a VCore offset of -37.5mV.</p>
|
||||
|
||||
<h2 class="block">Benchmarks</h2>
|
||||
|
||||
<p class="block">As usual, to verify my findings I ran a number of benchmarks. Tests were ran for 20 minutes each, so plenty of heat was available to reduce the score.</p>
|
||||
|
||||
<figure class="block">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="has-text-align-left" data-align="left">Settings</th>
|
||||
<th style="text-align: right;">CBR23 MC</th>
|
||||
<th style="text-align: right;">CBR23 SC</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">PBO Off, CO 0, VCoreD 0</td>
|
||||
<td style="text-align: right;">~24040</td>
|
||||
<td style="text-align: right;">~1550</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">PBO On, CO 0, VCoreD 0</td>
|
||||
<td style="text-align: right;">~26530</td>
|
||||
<td style="text-align: right;">~1542</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">PBO MB, CO 0, VCoreD 0</td>
|
||||
<td style="text-align: right;">~26670</td>
|
||||
<td style="text-align: right;">~1550</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">PBO MB, CO -10, VCoreD 0</td>
|
||||
<td style="text-align: right;">~27211</td>
|
||||
<td style="text-align: right;">~1555</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="has-text-align-left" data-align="left">PBO MB, CO -10, VCoreD -25mV</td>
|
||||
<td style="text-align: right;">~27400</td>
|
||||
<td style="text-align: right;">~1560</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
|
||||
<p class="block">While I'm still far away from what other people manage, this is already very promising. Maybe I'll find a golden egg while searching for settings and can bring this bad bin to a decent state.</p>
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: "What's coming in VoiceFX v0.3.0?"
|
||||
category: Blog
|
||||
tags: ["VoiceFX", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">With what is most likely the final beta version of <a rel="noreferrer noopener" href="https://blog.xaymar.com/projects/voicefx/" target="_blank">VoiceFX</a> 0.3.0 being released, it's time to talk about all the improvements and changes that VoiceFX had to go through to get here. Let's take a look at all the new and upgraded things in it.</p><!--more-->
|
||||
|
||||
<h3 class="block">The Plug-In has been renamed to VoiceFX</h3>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2021/05/Adobe_Audition_SBVeGbfxzy.png" />
|
||||
<figcaption>Adobe Audition detecting VoiceFX</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">This may come as a surprise to some, but the VST 3.x version was never actually called VoiceFX. It has now been renamed - along with an identifier change - to match the actual project name. This will break existing configurations/setups, so you will have to update accordingly, and no further renames are planned. This was mainly done to integrate other effects later down the line, and no longer potentially infringe on trademarks and branding guidelines.</p>
|
||||
|
||||
<h3 class="block">Drastically reduced the Load/Reset Times</h3>
|
||||
|
||||
<p class="block">If you have used VoiceFX before, you've probably noticed and complained about the extremely long time required to load and/or reset the plugin. I wasn't able to remove it entirely - still waiting on NVIDIA to answer my questions - but I was able to significantly reduce it. As an example, instead of having to wait close to 18 seconds for Stereo playback with VoiceFX on in Adobe Audition, it is now only 3.8 seconds - almost 5 times faster!</p>
|
||||
|
||||
<h3 class="block">Improved Buffering and Latency Detection</h3>
|
||||
|
||||
<p class="block">Due to the mixed bag that VST hosts are, I had to invest quite some time into a solution that was not just efficient, but also covered most of the possible bad situations. This led to a much more stable plugin with far better buffering (fixing Adobe Premiere Pro exporting), better latency detection and various other things. Many VST hosts are also now 100% compatible with this.</p>
|
||||
|
||||
<h3 class="block">Text File Logs for improved end-user Support</h3>
|
||||
|
||||
<figure class="block"><img src="https://cdn.xaymar.com/blog/2021/05/explorer_ldYlKjIW8I.png" />
|
||||
<figcaption>Generated Log Files</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">With the mixed bag of VST Hosts that we have, I could no longer rely on the VST 3 and VST 2 standard as my only resource for problems users experienced. So I did what any Software does, and now write log files to a pre-defined location. You can find these at <code>%LOCALAPPDATA%\VoiceFX\logs</code>, and sending the last 2-3 <em>files</em> along with any request for support will drastically improve the chances of fixing the problem.</p>
|
||||
|
||||
<h3 class="block">Support for VST 2.x Hosts</h3>
|
||||
|
||||
<p class="block">With 0.3.0 comes the promised integration into many VST 2.x only hosts, available to any Tier 2 or higher Supporter of mine on Github and Patreon. This integration took quite a while as the VST 2.x API is practically undefined if you want to stay on the legal side, so quite a bit of time was spent reverse engineering an API I had no actual information about, other than it exists.</p>
|
||||
|
||||
<h3 class="block">Improved support for non-standard-compliant VST Hosts</h3>
|
||||
|
||||
<p class="block">As with any standard, there are always pseudo-implementations of it in Software and Hardware - and VST is no different. I've applied many safe-guards now to either make these VST Hosts work fine, or prevent them from crashing entirely, but there may still be a VST Host out there that does yet another thing differently from the actual standard. </p>
|
||||
|
||||
<h2 class="block">With every update comes...</h2>
|
||||
|
||||
<p class="block">... a lot of testing. I'm currently running a public beta test of the new VST 3.x version, as well as a Supporter-exclusive beta test of the VST 2.x version - both are available <a rel="noreferrer noopener" href="https://s.xaymar.com/discord" target="_blank">in Discord</a>. If you're less chatty you can still try out the new version linked on the <a href="https://s.xaymar.com/voicefx">official website</a> (automatically updated short link) for it. If you have an NVIDIA Tensor capable GPU (RTX 2060 or better), why not try it out?</p>
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: "StreamFX 0.11: What's (going to be) in it?"
|
||||
category: "News"
|
||||
tags: [ "StreamFX", "WordPress Archive" ]
|
||||
published: false
|
||||
---
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p></p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2>Video Super Resolution</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p></p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2>Video Denoising</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2>Custom Kernel Blur</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2>Reference-accurate Gaussian Blur</h2>
|
||||
<!-- /wp:heading -->
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: "Testing NVIDIA Maxine's Super Resolution Beta"
|
||||
category: Blog
|
||||
tags: ["NVIDIA", "Maxine", "Super Resolution", "Upscaling", "WordPress Archive"]
|
||||
---
|
||||
|
||||
<p class="block">With the release of NVIDIA Maxine, a number of exciting new Video, Audio and AR effects were shown. I wanted to try these out much earlier, but an unexpected problem prevented me from doing so. However thanks to NVIDIAs help, I've managed to get some of the examples running <em>most of the time</em>. Please note that the effect I'm testing is still considered Beta by NVIDIA, so final quality will likely differ from what I show here.</p><!--more-->
|
||||
|
||||
<p class="block">Since I only had gaming footage at hand for testing, and the Super Resolution effect seems to have been designed for real world content, I went to my balcony to record a quick video. The video was downscaled to 720p as well as 540p, then fed into the effect to upscale to two different resolution targets. Below is the result of this (may need an external player):</p>
|
||||
|
||||
<figure class="block">
|
||||
<video controls muted preload="none">
|
||||
<source src="https://cdn.xaymar.com/blog/2021/06/nvvfx-test-2.web_.mp4" title="1080p Original">
|
||||
<source src="https://cdn.xaymar.com/blog/2021/06/nvvfx-test-2.1440-strong.web_.mp4" title="1080p -> 1440p (1.333x)">
|
||||
<source src="https://cdn.xaymar.com/blog/2021/06/nvvfx-test-2.720p.1080-strong.web_.mp4" title="720p -> 1080p (1.333x)">
|
||||
<source src="https://cdn.xaymar.com/blog/2021/06/nvvfx-test-2.720p.1440-strong.web_.mp4" title="720p -> 1440p (2.0x)">
|
||||
<source src="https://cdn.xaymar.com/blog/2021/06/nvvfx-test-2.540p.1080-strong.web_.mp4" title="540p -> 1080p (2.0x)">
|
||||
<source src="https://cdn.xaymar.com/blog/2021/06/nvvfx-test-2.540p.1620-strong.web_.mp4" title="540p -> 1620p (3.0x)">
|
||||
</video>
|
||||
</figure>
|
||||
|
||||
<p class="block">The video was taken with a Logitech Brio 4K on a long USB extension, set up for 1920x1080x60 capture as close to real world as possible. The results are quite clear, and show both the strengths and weaknesses of the effect clearly. At the current level, it seems to be missing any and all temporal capabilities, relying completely on spatial upscaling. This works well as long as you don't exceed an upscale of ~1.5x, above that you end up with significant artifacts.</p>
|
||||
|
||||
<p class="block">I'm excited to see what the future will bring for this.</p>
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: "A look into VoiceFX v0.3.0"
|
||||
category: "News"
|
||||
tags: [ "VoiceFX", "WordPress Archive" ]
|
||||
---
|
||||
|
||||
<p class="block">This release was plagued with odd bugs, reappearing problems, and delays from real life events happening to me. But now, after several months of nothing, VoiceFX v0.3.0 is available! Why not delve into what exactly was changed, with some visual examples?</p><!--more-->
|
||||
|
||||
<h2 class="block">Loading the effect should now be much faster!</h2>
|
||||
|
||||
<p class="block">Earlier VoiceFX versions had a bug that would cause VoiceFX to re-initialize everything every time the VST host sent <em>any</em> command to it, until the moment it was supposed to start processing. On some VST hosts, this was so bad that users reported VoiceFX freezing their system for minutes as the VST host was spamming a lot of commands. This is now a thing of the past, and initialization is only done once, resulting in a load time reduction of up to 75%!</p>
|
||||
|
||||
<h2 class="block">Significant reduction in Reset times!</h2>
|
||||
|
||||
<p class="block">If you've used VoiceFX, you may already have experienced in how slow VoiceFX can be when restarting playback, or seeking within a file. In the worst cases, you could end up spending more than a minute for multi-channel audio, or much longer with multiple instances of VoiceFX. In rare cases, it might have even led to a frozen system that needed to be restarted.</p>
|
||||
|
||||
<p class="block">This is now a thing of the past! Thanks to help from NVIDIA, resetting VoiceFX by seeking or restarting playback is now super fast. So fast that it was difficult to measure how much faster it was on a NVIDIA RTX 3090 unless I put some stressful load on the GPU. And the best of it all? This has no impact on quality!</p>
|
||||
|
||||
<columns class="block" count="2">
|
||||
<column>
|
||||
<figure class="block" lazyload>
|
||||
<video controls>
|
||||
<source src="https://cdn.xaymar.com/blog/2021/09/j2kUvHVIEd.mp4">
|
||||
</video>
|
||||
<figcaption>v0.3.0b3 and earlier</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
<column>
|
||||
<figure class="block" lazyload>
|
||||
<video controls>
|
||||
<source src="https://cdn.xaymar.com/blog/2021/09/nNgazrnM7h.mp4">
|
||||
</video>
|
||||
<figcaption>v0.3.0 and beyond</figcaption>
|
||||
</figure>
|
||||
</column>
|
||||
</columns>
|
||||
|
||||
<h2 class="block">Split VST3.x and 2.x Installers</h2>
|
||||
|
||||
<p class="block">Since users often had a mixed bag of VST hosts, some 3.x and 2.x, I originally created a binary that had both APIs supported. This turned out to be extremely user unfriendly, as users had to choose which VST host could see it, and which couldn't. With the new separate installers for either VST 3.x or 2.x version, users can now choose which VST host should be able to see it, or if it should just be available for both!</p>
|
||||
|
||||
<h2 class="block">Other Changes</h2>
|
||||
|
||||
<figure class="block float-right align-right" style="max-width: 256px;" lazyload>
|
||||
<img src="https://cdn.xaymar.com/blog/2021/09/explorer_lGEUp9cFB7.png">
|
||||
<figcaption>Log files!</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="block">There is of course some smaller changes, which don't really need a whole section, but still need to be mentioned:</p>
|
||||
|
||||
<ul class="block">
|
||||
<li>Non-specification-compliant VST 3.x hosts should now have less issues with the effect, but are still not ideal for using the effect.</li>
|
||||
<li>VoiceFX now generates log files at <code>%LOCALAPPDATA%\VoiceFX\logs</code>, which will be used to help users with issues. At the moment these log files are not automatically deleted, so it may be necessary to occasionally clear that directory, but this will eventually be automated.</li>
|
||||
<li>The identifier of the VSTs were changed to match the actual plugin name and author, so existing setups may break.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="block">Some final Words</h2>
|
||||
|
||||
<p class="block">I've released <a rel="noreferrer noopener" href="https://xaymar.itch.io/voicefx" target="_blank">VoiceFX on itch.io</a> where you can now buy the paid version, without going through Patreon or GitHub. While I can't promise an actual release cycle - I'm just a single person working on many things <em>plus</em> my actual job - I can promise that you won't miss out on actual updates. Some testing version may however not be uploaded to itch.io when they are immediately nuked due to a critical bug.</p>
|
||||
|
||||
<p class="block">Anyway, that was all I had to say. Go grab the lastest versions from <a rel="noreferrer noopener" href="https://blog.xaymar.com/projects/voicefx/" target="_blank">my Website</a>, <a rel="noreferrer noopener" href="https://xaymar.itch.io/voicefx" target="_blank">itch.io</a> or <a rel="noreferrer noopener" href="https://discord.com/channels/144178479322234881/821129721907118142/886456588267835433" target="_blank">from my Discord</a>!</p>
|
||||
Reference in New Issue
Block a user