<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog Feed</title>
    <link>https://obsproject.com/blog</link>
    <lastBuildDate>Fri, 07 Nov 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://obsproject.com/blog/rss" rel="self" type="application/rss+xml" />
            <item>
      <title>OBS Studio Gets A New Renderer</title>
      <link>https://obsproject.com/blog/obs-studio-gets-a-new-renderer</link>
      <guid>https://obsproject.com/blog/obs-studio-gets-a-new-renderer</guid>
      <pubDate>Fri, 07 Nov 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<p>Starting with OBS Studio 32.0.0 a new renderer backend based on Apple's <strong>Metal</strong> graphics API is available for users to test as an experimental alternative to the existing OpenGL backend on macOS. This marks an important step in OBS Studio's development to adapt one of the modern APIs that deliberately broke with the past to unlock better performance and efficiency gains for end users, but also require fundamental changes to how an application interacts with a GPU.</p>
<figure><img alt="Screenshot of OBS Studio with experimental Metal renderer selected." src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/97eeb60bb5-1762495292/obs_studio_with_metal.jpg"></figure>
<p>These fundamental changes were necessary to achieve the goals of lower overhead, faster performance, and to better represent the way that modern GPUs actually work, particularly when the GPU is used for more than just 3D rendering. Yet other changes were also necessary due to the way Metal was specifically designed to fit into Apple's operating systems.</p>
<p>Due to the sheer amount of information around this topic, it made sense to split it into separate posts:</p>
<ul>
<li><strong>The first post (this one)</strong> will go into specific challenges and insights from writing the Metal backend for OBS Studio.</li>
<li>The second post will look at the history of 3D graphics APIs, their core differences, and how the design of the new generation creates challenges for existing renderers like the one in OBS Studio.</li>
</ul>
<p>The Metal backend is explicitly marked as <strong>"Experimental"</strong> in the application because it has some known quirks (for which no good solutions have been found yet, more about that below) but also because it has not yet been tested by a larger user audience. The OpenGL renderer is still <em>the default choice</em> offered to users and will be available for the foreseeable future, but we still would like to invite users to try out the Metal backend for themselves, and report any critical bugs they might encounter.</p>
<p>Better yet, if you happen to have prior experience working with Metal on Apple Silicon platforms (including iPhones), we'd be happy to hear feedback about specific aspects of the current implementation or even review pull-requests with improvements to it.</p>
<h2>Part 1.1: The Why Of Metal</h2>
<figure><img alt="Craig Federighi announcing Metal during WWDC 2014, jokingly making a 'fork' hand gesture." src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/9ccb2af8a6-1762495292/craig_federighi_metal_wwdc_2014.jpg"></figure>
<p>In June 2014 Apple announced (and - more importantly - also <em>released to developers</em>) the first version of Metal for iPhones with Apple's A7 SOC, extending its support to current Macs of the time in 2015. Thus Metal was not only available on what became later known as "Apple Silicon" GPUs, but also Intel, AMD, and NVIDIA GPUs, being the first "next generation" graphics API to support all mainstream GPUs of the time.</p>
<p>Metal combined many benefits to Apple specifically: The API was based on concepts and ideas that not only already found their way into AMD's "Mantle" API (which was announced in September 2013) but had also been discussed for and adopted to some degree in the existing graphics APIs (OpenGL and Direct3D) at the time. But as a new API written from scratch it had the chance to omit all the <em>legacy aspects of existing APIs</em> and fully lean into these new concepts. It was able to provide the performance gains unlocked by this different approach and as it was originally designed for iOS and macOS, an entirely new API implemented in <em>Objective-C and Swift</em> (the latter of which was also introduced in 2014).</p>
<figure><a href="https://gdcvault.com/play/1020791/Approaching-Zero-Driver-Overhead-in" rel="noreferrer" target="_blank"><img alt="Opening slide of GDC 2014 presentation by NVIDIA, AMD, and Intel, about approaching zero driver overhead in OpenGL" src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/a43e5c868f-1762495292/gdc_2014_approaching_zero_driver_overhead.jpg"></a></figure>
<p>While OpenGL did (and still does) provide a well-established C-based API, it incorporates a binding model that is considered inelegant by many. Direct3D to this day uses a C++-based object-oriented API design (primarily via the COM binary interface), making it easier for developers to keep track of state and objects in their application code. Notably existing APIs in COM-based systems are not allowed to change, instead new variants have to be introduced, providing a decent amount of backwards-compatibility for applications originally written for older versions of Direct3D.</p>
<p>Metal takes Direct3D's object-oriented approach one step further by combining it with the more "verbal" API design common in Objective-C and Swift in an attempt to provide a <em>more intuitive and easier API</em> for app developers to use (and not just game developers) and to further motivate those to integrate more 3D and general GPU functionality into their apps. This lower barrier of entry was very much the point of earlier Metal versions, which combined the comparatively easier API with extensive graphics debugging capabilities built right into Xcode, providing developers with in-depth insights into every detail of their GPU processing (including built-in debugging of shader code) in the same IDE used for the rest of their application development.</p>
<h2>Part 1.2: Differences In API Design</h2>
<p>All modern APIs share the same concepts and approaches in their designs, which attempt to solve a major design issue of OpenGL and Direct3D:</p>
<ul>
<li>The old APIs took care of a lot of resource management and synchronization for the developer, "hiding" much of the actual complexity involved in preparing the GPU for workloads.</li>
<li>The old APIs presented the GPU as a big state machine (particularly OpenGL) where the developer can change bits and pieces between issuing draw calls.</li>
<li>Due to the possibility to change bits and pieces of a pipeline at will, the old APIs had to check if the current "state" of the API is valid before issuing any work to the GPU, adding considerable overhead to the API "driver".</li>
</ul>
<figure><a href="https://developer.apple.com/videos/play/wwdc2019/611" rel="noreferrer" target="_blank"><img alt="Slide from WWDC 2019 presentation about moving from OpenGL to Metal - example of validation requirements of typical OpenGL state approach" src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/8b15f513d0-1762495292/wwdc_2018_opengl_state.jpg"></a></figure>
<ul>
<li>The new APIs removed most of that and now require developers to manage their resources and synchronization themselves, only providing methods to communicate their intent to the API and thus the GPU.</li>
<li>The new APIs present the GPU as a highly parallelized processing unit that can be issued a list of commands that will be added to a queue and are then picked up by the GPU, "drawing" just being one of many operations.</li>
<li>To avoid having to re-validate the pipeline state before each draw call, pipelines have become immutable objects, whose validity is checked once during their creation, removing the overhead from draw commands using the pipeline, leaving some overhead whenever the pipelines themselves are switched.</li>
</ul>
<figure><a href="https://developer.apple.com/videos/play/wwdc2019/611" rel="noreferrer" target="_blank"><img alt="Slide from WWDC 2019 presentation about moving from OpenGL to Metal - example of Metal variant of the same OpenGL state approach" src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/d7299064a1-1762495292/wwdc_2018_metal_state.jpg"></a></figure>
<p>Of course there are many other differences (large and small) but those are the ones that had the most impact on the attempt to write a "next generation" graphics API backend for OBS Studio. The current renderer is obviously built around the way the old APIs work (particularly Direct3D) and thus makes certain assumptions about the state the APIs will be in at any given point in time. The issue is that those assumptions are not correct as soon as any of those new APIs are used and a lot of the work that the APIs used to do for OBS Studio now <em>has to be taken care of by the application itself</em>.</p>
<p>So a decision had to be made: Either the core renderer can be updated or even rewritten to take care of the responsibilities expected by the modern APIs, adapting more modern "indirect drawing" techniques in Direct3D and OpenGL to make them more compatible with that approach (making <em>those</em> renderers potentially more performant as well), or put this additional work entirely into the backend for one of the new APIs, leaving the core renderer as-is. At least for the Metal backend, the second path was chosen.</p>
<h2>Part 1.3: The Expectations Of OBS Studio's Renderer</h2>
<p>Before the new release, OBS Studio shipped with two graphics APIs: <strong>Direct3D</strong> on Windows and <strong>OpenGL</strong> on Linux and macOS. This is achieved by having a core rendering subsystem that is (for the most part) API-independent and requires an API-specific backend to be loaded at runtime. This backend then implements a generic set of render commands issued by the core renderer and translates those into the actual commands and operations required by its API. That said, the core renderer has <em>some quirks</em> that become apparent once one tries to add support for an API that works <em>slightly</em> different than it might expect:</p>
<ul>
<li>As OBS Studio's shader files are effectively written in an older dialect of Microsoft's <strong>High Level Shader Language (HLSL)</strong>, every shader needs to be analyzed and translated into a valid variant for the modern API at runtime.</li>
<li>Shaders are expected to use the <strong>same data structure as input and output type</strong>, as well as support <strong>global variables</strong>.</li>
<li>The application expects all operations made by the graphics API to be strictly sequential, and to always <strong>execute</strong> operations involving the same resources strictly <strong>in order</strong> of submission to the API.</li>
<li>OBS Studio's texture operations (creating textures from data loaded by the application, updating textures, reading from textures, and more) are directly modelled after Direct3D's API design. Any other API needs to work around this expectation and do housekeeping "behind the scenes" to meet it.</li>
<li>OBS Studio also expects to be able to <strong>render previews</strong> (such as the program view, the main preview, the multi-view, and others) <strong>directly at its own pace</strong> (and framerate), expecting every platform to effectively behave like Windows and provide "swapchains" with the "discard model" used by DXGI, and thus is not decoupled from the render loop for the video output.</li>
</ul>
<figure><img alt="Flowchart presenting the logical relationship between effects files and their shaders." src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/c1114cefbf-1767490551/obs_shader_overview.png"></figure>
<p>Most of these issues either fall into the realm of shaders or the API design itself, all of which had to be overcome by the Metal backend.</p>
<h3>Part 1.3.1: Transpiling Shaders</h3>
<p>OBS Studio makes extensive use of <em>shader programs</em> that run on the GPU to do efficient image processing. Both <code>libobs</code> (OBS Studio's main library that includes the core renderer) as well as plugins like the first-party <code>obs-filters</code> plugin provide their own "effect" files, which are implemented using the HLSL dialect mentioned above.</p>
<p>These effects files contain "techniques", each potentially made of up of a number of render passes (although all current OBS Studio effect files use a single pass) that provide a vertex and fragment shader pair. The vertex shader is the little program a GPU runs for every vertex (a "point" of a triangle) to calculate its actual position in a scene relative to a camera looking at it. The fragment shader (also called "pixel shader" in Direct3D) calculates the actual color value for each fragment (a visible pixel in the output image).</p>
<figure><img alt="Flowchart presenting the steps required to generate a Metal shader string from an OBS effects file." src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/d3a73d1fa7-1767490586/obs_shader_transpile.png"></figure>
<p>To make these files work with OpenGL and Direct3D, they need to be converted into bespoke shader source code for each "technique" first, which OBS Studio achieves through multiple steps:</p>
<ul>
<li>Each effect file is parsed in its entirety and converted <strong>into a data structure</strong> representing each "part" of the effect file:<ul>
<li>The "<em>uniforms</em>", that is data (or a data structure) that is updated by application code at every rendered frame.</li>
<li>The "<em>vertex</em>" or "<em>fragment</em>" data (usually a data struct) that is kept in GPU memory.</li>
<li><em>Texture descriptions</em> (textures can be 1-, 2-, or 3-dimensional) and <em>sampler descriptions</em> (samplers describe how a color value is read from a texture for use in a shader).</li>
<li>The <em>shader functions</em>, including their return type and argument types.</li>
</ul>
</li>
<li>Additionally each technique (and pass(es) within) are parsed into a <strong>nested data structure</strong>:<ul>
<li>OBS Studio will then iterate over every technique and its passes to pick up the names of the vertex and fragment shader functions mentioned in each.</li>
<li>The uniforms, shader data, as well as the texture and sampler descriptions, are shared among each technique within the same file. The created data structures are used to <em>re-create the (partial) HLSL source code</em> that was parsed originally.</li>
<li>The shader functions and their content are then copied and a "main" function is generated (as the entry-point for the shader) calling the actual shader function. The generated <em>final HLSL string</em> is kept as the shader representation of each "technique".</li>
</ul>
</li>
<li>Each technique is sent in its HLSL form to each graphics API and is then <strong>transpiled into its API-specific form</strong>:<ul>
<li>For Direct3D this means replacing text tokens with their more current variants.</li>
<li>For GLSL this means parsing the HLSL string back into structured data <em>again</em>, before iterating over this data and composing a <em>GLSL shader string</em> from it. As shader function code is not analyzed, it needs to be parsed <em>word-for-word</em> and translated into GLSL-specific variants if necessary.</li>
</ul>
</li>
</ul>
<hr />
<p><strong>UPDATE (January 2026):</strong> After this article was posted, we were informed that global variables were supported in the Metal Shading Language (MSL), starting with version 3.1.</p>
<p>While the workarounds documented below might still be necessary when using an older version of MSL, the <code>UniformData</code> in GPU buffer <code>30</code> can be assigned directly:</p>
<p><code>constant UniformData&amp; constant uniforms [[buffer(30)]];</code></p>
<p>The view projection matrix could then be accessed in any scope via <code>uniforms.ViewProj</code> and would not need to be explicitly passed as a function argument through the different layers of the shader. The usual caveats of global variables apply, but in this case the global variable is strictly read-only by being a <code>constant</code> reference to data in the <code>constant</code> address space.</p>
<hr />
<p>Adapting this process for Metal led to a few challenges, born out of the stricter shader language used by the API:</p>
<ul>
<li>MSL is <strong>stricter</strong> around types and semantics:<ul>
<li>Direct3D uses "semantics" to mark parts of shader data structs and give them meaning, like <code>TEXCOORD0</code>, <code>COLOR0</code>, or <code>SV_VertexID</code>, while OpenGL uses global variables that shader code instead reads from or writes into.</li>
<li>Metal uses a <em>similar semantics-based model as Direct3D</em> via attributes, but their use is more strict. Some attributes are allowed for input data, but not for output data.</li>
<li>Thus the same struct definition <em>cannot</em> be used as input and output type definition, instead the single struct type used by HLSL <strong>needs to be split into two separate structs</strong> for MSL.</li>
<li>Every function's content then needs to be scanned for <em>any</em> use of the struct type and needs to be replaced with the appropriate input or output variant.</li>
</ul>
</li>
<li>MSL has <strong>no support for global variables</strong>:<ul>
<li>This means that "<em>uniforms</em>" as used by Direct3D (and set up by OBS Studio's renderer) cannot be used by Metal - uniform data needs to be provided <strong>as a buffer of data in GPU memory</strong>.</li>
<li>This buffer of data can be referenced as an input parameter to a shader function, thus any use of the global variable (used by HLSL and GLSL) needs to be replaced with a use of the function argument.</li>
<li>However any other function called by the "main" shader function also accessing a global variable needs this local variable passed explicitly to it, thus - once again - <em>every function's code needs to be parsed and analyzed</em>.</li>
<li>Any time a function uses a global, it needs to have a new function argument added to its signature to accept the "global" data as an explicit function parameter.</li>
<li>Any time a function <em>calls</em> a function that uses a global, it <em>also</em> needs to have its signature changed to accept the data explicitly and also change the call signature to pass the data along.</li>
</ul>
</li>
</ul>
<p>And these are just two examples of major differences in the shader language that require the transpiler to <strong>almost rewrite every effect file</strong> used by <code>libobs</code>.</p>
<p>Here's a trivial example, OBS Studio's most basic vertex shader that simply multiplies each vertex position with a matrix to calculate the actual coordinates in "clip space" (coordinates that describe the position as a percentage of the width and height of the camera's view):</p>
<pre><code>uniform float4x4 ViewProj;

struct VertInOut {
    float4 pos : POSITION;
    float2 uv : TEXCOORD0;
};

VertInOut VSDefault(VertInOut vert_in)
{
    VertInOut vert_out;
    vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj);
    vert_out.uv  = vert_in.uv;
    return vert_out;
}

VertInOut main(VertInOut vert_in)
{
    return VSDefault(vert_in);
}</code></pre>
<p>In this shader the view projection matrix is provided as a global variable called <code>ViewProj</code> and it's used by the <code>VSDefault</code> shader function. The Metal Shader variant needs to be a bit more explicit about the flow of data:</p>
<pre><code>#include &lt;metal_stdlib&gt;
using namespace metal;

typedef struct {
    float4x4 ViewProj;
} UniformData;

typedef struct {
    float4 pos [[attribute(0)]];
    float2 uv [[attribute(1)]];
} VertInOut_In;

typedef struct {
    float4 pos [[position]];
    float2 uv;
} VertInOut_Out;

VertInOut_Out VSDefault(VertInOut_In vert_in, constant UniformData &amp;uniforms) {
    VertInOut_Out vert_out;
    vert_out.pos = (float4(vert_in.pos.xyz, 1.0)) * (uniforms.ViewProj);
    vert_out.uv  = vert_in.uv;
    return vert_out;
}

[[vertex]] VertInOut_Out _main(VertInOut_In vert_in [[stage_in]], constant UniformData &amp;uniforms [[buffer(30)]]) {
    return VSDefault(vert_in, uniforms);
}</code></pre>
<p>As explained above, the single <code>VertInOut</code> struct had to be split into <em>two separate variants for input and output</em>, as the <code>attribute(n)</code> mapping is only valid for <em>input</em> data. It uses a pattern more common in modern APIs where memory is typically organized in <em>larger heaps</em> into which all other data (buffers, textures, etc.) is placed and referenced. In this case the <code>stage_in</code> decoration allows the developer to access vertex or fragment data for which a vertex descriptor had been set up and is used for convenience. Otherwise the variable would just represent a buffer of GPU memory.</p>
<p>To tell Metal which part of the <em>output</em> structure contains the calculated vertex positions, the corresponding field has to be decorated with <code>[[position]]</code> or return a <code>float4</code> explicitly. Every vertex shader <strong>has</strong> to do one or the other, as it would otherwise fail shader compilation.</p>
<p>The <code>uniform</code> global used by HLSL is transformed into a <em>buffer variable</em>: The uniform data is uploaded into the buffer in slot 30 and referenced by the <code>[[buffer(30)]]</code> decorator and uses the ampersand (<code>&amp;</code>) to make it a C++ reference using the <code>constant</code> address space attribute, which marks this reference to be read-only. The <code>uniforms</code> reference is also passed into the <code>VSDefault</code> function, as the transpiler detected that the function accesses <code>ViewProj</code> within its function body, and thus adds it as an argument to the function signature and converts the reference of <code>ViewProj</code> into the correct form <code>uniforms.ViewProj</code>.</p>
<p>Similar work has to be done for all those cases where GLSL or HLSL will opportunistically accept data with the "wrong" types and alias or convert them into the correct one. Metal does not allow this, the developer <em>has</em> to put any such conversion into code explicitly and also requires any function call to match the function signature. Here is one such example:</p>
<pre><code>float PS_Y(FragPos frag_in)
{
    float3 rgb = image.Load(int3(frag_in.pos.xy, 0)).rgb;
    float y = dot(color_vec0.xyz, rgb) + color_vec0.w;
    return y;
}</code></pre>
<p>In this example the HLSL shader uses the <code>Load</code> function to load color values from a texture and passes in a vector of 3 signed integer values. A valid Metal Shader variant would look like this:</p>
<pre><code>float PS_Y(FragPos frag_in, constant UniformData &amp;uniforms, texture2d&lt;float&gt; image) {
    float3 rgb = image.read(uint2(int2(frag_in.pos.xy)), uint( int( 0))).rgb;
    float y = dot(uniforms.color_vec0.xyz, rgb) + uniforms.color_vec0.w;
    return y;
}</code></pre>
<p>The signature of the corresponding <code>read</code> function in MSL requires a vector of 2 unsigned integer values and a single unsigned integer. Thus the transpiler needs to <strong>detect any (known) invocation of a function that uses type aliasing</strong> or other kinds of type punning and explicitly convert the provided function arguments into the types required by the MSL shader function, in this case converting a single <code>int3</code> into a pair of <code>uint2</code> and <code>uint</code> and ensuring that the data passed into the <code>uint</code> constructor is actually of a specific type that <em>can</em> be converted.</p>
<p>These and many other changes are necessary because MSL is effectively C++14 code and thus requires the same adherence to type safety and function signatures as any other application code written in C++. This allows <strong>sharing header files of data type and structure definitions between application and shader code</strong>, but also requires shader code to be more correct than it had to be for HLSL or GLSL in the past. And in the case of OBS Studio, the transpiler has to partially "rewrite" the HLSL shader code into more compliant MSL code at runtime.</p>
<h3>Part 1.3.2: Pretending To Be Direct3D</h3>
<p>The next hurdle was to simulate the behavior of Direct3D inside the Metal API implementation. As it was deemed infeasible to rewrite the core renderer itself, it must be "kept in the dark" about what actually happens behind the scenes.</p>
<p>One of the main jobs OBS Studio has to do for every video frame is convert images (or "frames") provided by the CPU into textures on the GPU, and - depending on the video encoder used - convert the final output texture back into a frame in CPU memory that can be sent to the encoder. In Direct3D this involves the "mapping" and "unmapping" of a texture:</p>
<ul>
<li>When a texture is "mapped" it is made available for the application code in CPU memory.</li>
<li>When the texture is mapped for writing, Direct3D will provide a pointer to some CPU memory that it has either allocated directly or had been "lying around" from an earlier map operation. OBS Studio can then copy its frame data into the location.</li>
<li>When the texture is mapped for reading, Direct3D will provide a pointer to CPU memory that contains a copy of the texture data from GPU memory. OBS Studio can copy this data into its own "cache" of frames.</li>
<li>When OBS Studio is done with either operation, it has to "unmap" the texture. The provided pointer is then invalidated and any data pointed to it can and will be changed randomly.</li>
</ul>
<p>By itself a naïve implementation of this operation can have severe consequences: When a texture is mapped for writing, any pending GPU operation (e.g., a shader's sampler reading color data from it) might be blocked from being executed as the texture is still being written to. Likewise when a texture is mapped for reading, any pending CPU operation (e.g., copying the frame data into a cache for the video encoder) might have to wait for any GPU operation that currently uses that texture.</p>
<p>As part of its resource tracking behind the scenes, Direct3D 11 <strong>keeps track of texture access operations</strong> and will try to keep any such interruptions to a minimum, which leads specifically to the kind of overhead the modern APIs try to avoid:</p>
<ul>
<li>When a texture is mapped for writing, Direct3D will keep track of the mapping request and provide a pointer to get the data copied into, even while the texture is in use, and schedule a synchronization of the texture data.</li>
<li>Once the texture is <em>unmapped</em>, Direct3D will upload the data to GPU memory and once this has taken place, schedule an update of the texture with the new image data.</li>
<li>If any consecutive draw call that uses the same texture was issued by the application code <em>after</em> the unmapping, Direct3D will implicitly ensure that all pending GPU commands are scheduled and thus the texture update will take place before any consecutive GPU command might access the same texture.</li>
<li>When a texture is mapped for reading, Direct3D will also ensure that all pending GPU commands writing to that texture are executed first to ensure that the copy it will provide will represent the result of any draw commands issued by the application before that.</li>
<li>These are just examples of what <em>might</em> happen, as the specifics are highly dependent on the current state of the pipelines, the internal caches of the API's "driver" and other heuristics.</li>
</ul>
<figure><img alt="Two flowcharts presenting the differences between Direct3D and Metal when updating a texture with new image data." src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/d9fda4f34b-1767490550/obs_texture_update_direct3d_vs_metal.png"></figure>
<p>OBS Studio's entire render pipeline is designed around the characteristics of the <code>map</code> and <code>unmap</code> commands in Direct3D 11 and expect any other graphics API to behave in a similar way. Metal (as other modern APIs) <strong>does not do all of this work</strong> (Metal 3 will indeed still do hazard tracking of resources, but developers can opt-out of this behavior, and Metal 4 removed it entirely) and thus the API-specific backend has to simulate the behavior of Direct3D 11 in its own implementation:</p>
<ul>
<li>When a texture is mapped for writing, a GPU buffer is opportunistically <em>set up to hold the image data</em>.</li>
<li>As the Metal backend is only supported on Apple Silicon devices, GPU and CPU share the same memory. This means that a pointer to the buffer's memory can be <em>directly shared with the renderer</em>,</li>
<li>When the texture is "unmapped", a simple block transfer (or blit) operation is scheduled on the GPU to copy the contents of the GPU buffer into the GPU texture. The unmap operation will "wait" until the blit operation has been scheduled on the GPU to prohibit the renderer from issuing any new render commands which would potentially run in parallel.</li>
<li>When a texture is mapped for reading, the same pointer to the GPU buffer is shared with application code. As the buffers are never used by any render command directly, <em>no hazard tracking is necessary</em>. An "unmapping" thus does nothing.</li>
<li>"Staging" a texture for reading thus only requires scheduling a blit from the source texture into its associated staging buffer (as buffers and textures are effectively the same thing and differ only by their API). To ensure that no further render commands are issued by the application, the copy operation is made to wait until it is completed by the GPU, but also has to ensure that if the source texture has any pending render commands, that those are scheduled to be run on the GPU explicitly.</li>
</ul>
<p>The same applies to other operations closely following Direct3D's design: To ensure that the Metal backend reacts in a way that meets the way OBS Studio's renderer expects, it had the <strong>"hidden" functionality of Direct3D implemented explicitly</strong>, particularly the tracking of texture use by prior render commands before any staging takes place.</p>
<h2>Part 1.4: But Wait, There's More (Issues)</h2>
<p>One major reason why the backend is considered "experimental" is due to the way its preview rendering had to be implemented for now. To understand the core reason for those issues, it is important to first understand how OBS Studio expects preview rendering to work, which closely shaped by the way <strong>DXGI (DirectX Graphics Infrastructure)</strong> allows applications to present 3D content on Windows. DXGI swapchains hold a number of buffers with image data created by the application, one of which the application can ask to be <em>"presented" by the operating system</em>.</p>
<p>To avoid an application potentially generating too many frames than can be presented (and thus potentially blocking the application), DXGI swapchains can be set to have a "<em>discard</em>" mode and a <em>synchronization interval of <code>0</code></em>, which effectively allows an application to force the presentation of a back buffer immediately (without waiting for the operating system's own screen refresh interval) and because the contents of the buffer are discarded, it becomes available to be overwritten by the application with the the next frame's data.</p>
<figure><a href="https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/dxgi-flip-model" rel="noreferrer" target="_blank"><img alt="Microsoft info graphic presenting differences between blt mode and flip mode presentation in DXGI" src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/0ebf73b16b-1767490535/dxgi_swap_chain.png"></a></figure>
<p>Unfortunately this is the <strong>opposite</strong> of how Metal (or more precisely Metal Layers) allows one to render 3D contents into application windows: With the introduction of <em>ProMotion on iPhones and Macbooks</em>, macOS controls the effective frame rates used by devices to provide fluid motion during interaction, but potentially throttle the desktop rendering to single digit framerates when no interaction or updates happen. This allows iOS and macOS to <strong>limit the operating system framerate</strong> (and the framerate of all applications within it) when the device is set to "low power" mode and is thus not designed to be "overruled" by an application (as it would allow such an application to violate the "low power" decision made by the user).</p>
<p>Thus applications cannot just render frames to be presented by the OS at their own pace, instead they <strong>have to ask for a surface to render to</strong> and the number of surfaces an application can be provided with is <strong>limited</strong>. This means that if OBS Studio is running at twice the frame rate of the operating system, it would <em>exhaust its allowance of surfaces to render into</em>. And because OBS Studio renders previews as part of its single render loop, any delay introduced by a preview render operation also stalls or delays the generation of new frames for video encoders.</p>
<p>The solution (at least for this first experimental release) was for OBS Studio to always render into a texture that "pretends" to be the window surface to allow the renderer to finish all its work in its required frame time. Then a different thread (running globally for the entire app with a fixed screen refresh interval) will pick up this texture, request a window surface to render into, and then schedule a block transfer (blit) to copy the contents into the surface. This also requires explicit synchronization of the textures' use on the GPU to ensure that the "pretender" texture is fully rendered to by OBS before the copy to the surface is executed.</p>
<p><strong>In a nutshell:</strong> Whenever the operating system compositor requires a refresh, a <em>separate thread</em> will wait for OBS Studio to render a new frame of the associated preview texture and only once that has happened, the texture data is copied into the surface provided by the compositor. But as the preview rendering is now decoupled from the main render loop, framerate inconsistencies are inevitable. The kernel-level timer provided by the operating system will not align with OBS Studio's render loop (which requires the render thread to be woken up when it's calculated "time for the next frame" has been reached) and thus either a new frame might have been rendered in time or an old frame could not be copied in time.</p>
<p>Starting with macOS 14, the approach suggested by Apple would require OBS Studio to <strong>decouple these intervals even further</strong>, as every window (and thus potentially every preview) will have its own independent timer at which the application will receive a call from the operating system with a surface ready to be rendered into, which would bring a whole new set of potential challenges as it's even further removed from how OBS Studio expects to be able to render previews in the application.</p>
<h2>Part 1.5: The Hidden Costs Of Modern Graphics APIs</h2>
<p>The complexity of the endeavor was high and took <em>several months of research</em>, trial and error, bugfixing, multiple redesigns of specific aspects, and many long weekends. During the course of development it also became clear why some applications that simply switched from OpenGL to Vulkan or Direct3D 11 to Direct3D 12 might have potentially faced <em>worse</em> performance than before, seemingly <em>contradicting those API's promise</em> of improved performance.</p>
<p>Part of the reason is that a lot of the work that had been taken care of the by API's drivers are <strong>now application responsibilities</strong> and thus need to be taken care of by developers themselves. This however requires a more intimate understanding of "how the GPU works" and familiarization with those parts of Direct3D or OpenGL that were purposefully hidden from developers up to this point. And it also requires a more in-depth understanding of how the render commands interact with each other, what their dependencies are, and similarly how to encode and communicate these dependencies to the GPU to ensure that render commands are executed in the right order.</p>
<p>In the case of the Metal backend, this means that a certain amount of overhead that was removed from the API itself had to be <em>reintroduced into the backend again</em>, as even though it would be in a far better position for adoption, the core renderer was not available for a rewrite. Nevertheless even with this overhead, the Metal backend provides multiple benefits:</p>
<ul>
<li>In Release configuration and even in its non-optimized current form, it performs <em>as well or even better</em> as the OpenGL renderer.</li>
<li>In Debug configuration it provides <em>an amazing set of capabilities to analyze render passes</em> in all their detail, including shader debugging, texture lookups, and so much more.</li>
<li>As it's written in Swift, it uses a <em>safer programming language</em> than the OpenGL renderer, one that is at the same time easier and less time consuming to work with.</li>
<li>Because preview rendering is effectively handled separately from the main render loop, <strong>the Metal renderer enables EDR previews on macOS</strong> for high-bitrate video setups.</li>
</ul>
<figure><img alt="Screenshot of Xcode profiling rendered frames by OBS Studio with bound resources view open." src="https://obsproject.com/media/pages/blog/obs-studio-gets-a-new-renderer/9aa3db96cb-1762495292/xcode_metal_profiling.jpg"></figure>
<p>As far as maintenance of the macOS version of OBS Studio is concerned, the Metal backend brings considerable benefits as Xcode can now provide insights that haven't been available to developers since the deprecation of OpenGL on all Apple platforms in 2018. But it is due to these complexities that the project would like to extend an invitation to all developers (and users that might be so inclined) to <strong>provide feedback and suggestions for changes to improve the design and implementation</strong> of the Metal backend to first move it out of the "experimental" stage and later make it the default graphics backend on macOS.</p>]]></description>
    </item>
        <item>
      <title>OBS Studio 32.0 Release Notes</title>
      <link>https://obsproject.com/blog/obs-studio-32-0-release-notes</link>
      <guid>https://obsproject.com/blog/obs-studio-32-0-release-notes</guid>
      <pubDate>Mon, 22 Sep 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<h3>New Features</h3>
<hr />
<ul>
<li>Added a basic plugin manager [FiniteSingularity/PatTheMav/Warchamp7]</li>
<li>Added opt-in automatic crash log upload for Windows and macOS [PatTheMav/Warchamp7]</li>
<li>Added Voice Activity Detection (VAD) to NVIDIA RTX Audio Effects, which improves noise suppression for speech, as well as several optimizations to NVIDIA Effects [pkviet]</li>
<li>Added chair removal option for NVIDIA RTX Background Removal, allowing removal of chairs [pkviet]</li>
<li>Added experimental Metal renderer for Apple Silicon Macs [PatTheMav]</li>
<li>Added Hybrid MOV support [derrod]<ul>
<li>Brings ProRes support on macOS and a more widely supported HEVC/H.264 + PCM audio option to all platforms</li>
</ul>
</li>
</ul>
<h3>General Changes</h3>
<hr />
<ul>
<li>OBS Studio will no longer load plugins built for a newer release of OBS to prevent future compatibility issues [norihiro]</li>
<li>Added custom OBS widgets in preparation for larger UI updates [derrod/gxalpha/Warchamp7]</li>
<li>Added preparations for Metal renderer (stay tuned!) [PatTheMav]</li>
<li>Changed default bitrate from 2500 to 6000 Kbps [notr1ch]</li>
<li>Changed Hybrid MP4/MOV to be the default containers [derrod]</li>
<li>Changed the crash sentinel file location to its own subdirectory [PatTheMav]</li>
<li>Improved audio deduplication logic to cover more cases of nested scenes, groups, and multiple canvases [pkviet]</li>
<li>Prevent audio duplication when sources are set to "Monitor and Output" while the monitoring device is also being captured [pkviet]</li>
<li>Updated the default settings for AMD encoders [rhutsAMD]</li>
<li>Improved accuracy of chapter markers in Hybrid MP4/MOV [derrod]</li>
<li>Re-hid the cursor in edit fields on macOS [gxalpha]</li>
<li>Improved format selection for PipeWire video capture [tytan652]</li>
<li>Removed workarounds to prevent loading Qt 5 based plugins [RytoEX]</li>
<li>Removed the --disable-shutdown-check launch flag [PatTheMav]</li>
<li>Hybrid MP4/MOV is now out of beta and has been made the default output format for new  profiles [derrod]</li>
</ul>
<h3>Bug Fixes</h3>
<hr />
<ul>
<li>Potentially fixed a rare crash on macOS when moving or resizing the OBS window [PatTheMav]</li>
<li>Fixed a crash with SRT when using an invalid URL [pkviet]</li>
<li>Fixed a crash when setting non-default pkt_size with SRT [pkviet]</li>
<li>Fixed a crash in Media Source when playback starts with certain video files [howellrl]</li>
<li>Fixed a UI deadlock when opening source properties from the Sources list when the Windows setting 'Snap mouse to default button in dialog boxes' was enabled by adding a 200ms delay before creating the properties window [Warchamp7]</li>
<li>Fixed a memory leak when trying to output Hybrid MP4 to a non-writeable location [norihiro]</li>
<li>Fixed rare occurrence of multiview becoming blank [norihiro]</li>
<li>Fixed SRT reconnection failures [pkviet]</li>
<li>Fixed overflow texture rendering sRGB-awareness [PatTheMav]</li>
<li>Fixed incorrect color range property setting for AMD AV1 encoder [rhutsAMD]</li>
<li>Fixed Hybrid MP4 file splitting not working correctly in some cases [derrod]</li>
<li>Fixed not being able to capture higher than 60fps with macOS Screen Capture [jcm93]</li>
<li>Fixed focus not displaying properly in hotkey settings on macOS [gxalpha]</li>
<li>Fixed the scrollbar appearing invisible in Light and Rachni themes [shiina424]</li>
<li>Fixed HEVC frame priority not being set correctly in some cases, potentially causing playback errors when dropping frames [dsaedtler]</li>
<li>Fixed an issue that could result in increases to output latency after temporary encoder stalls [dsaedtler]</li>
<li>Fixed an issue where Multitrack Video could still be enabled after switching from a service that supports it to one that does not [Penwy]</li>
<li>Fixed an issue where GetGroupList with obs-websocket would return nothing [gxalpha]</li>
<li>Removed a workaround for older Qt versions that prevented docks from loading correctly while OBS is maximized [RytoEX]</li>
</ul>]]></description>
    </item>
        <item>
      <title>OBS Studio 31.0 Release Notes</title>
      <link>https://obsproject.com/blog/obs-studio-31-0-release-notes</link>
      <guid>https://obsproject.com/blog/obs-studio-31-0-release-notes</guid>
      <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<p><em><strong>Note</strong>: NVIDIA users may need to update their GPU drivers to 551.76 (Windows) / 550.54.14 (Linux) or newer. NVIDIA Kepler (600 and 700 series) GPUs are no longer supported for NVENC.</em></p>
<p><em><strong>Note</strong>: The code signing certificate for OBS has been updated. This may impact game capture compatibility with some anti-cheat solutions with this OBS update. If you are a game or anti-cheat developer please see <a href="https://obsproject.com/Capture Hook Certificate Update">obsproject.com/kb/capture-hook-certificate-update</a> on our knowledge base for more information.</em></p>
<h3>New Features</h3>
<ul>
<li>Added NVIDIA Blur Filter and Background Blur [pkviet]</li>
<li>Added preview scrollbars and zoom/scale indicator [cg2121/Warchamp7]</li>
<li>Added v210 format support for AJA device capture [paulh-aja]</li>
<li>Added Amazon IVS service integration [palana]</li>
<li>Added QSV AV1 Screen Content Coding [thyintel]</li>
<li>Enabled first-party YouTube Chat features [msuman-google]</li>
</ul>
<h3>General Changes</h3>
<ul>
<li>Updated the browser source/docks CEF (Chromium) to version 127 (6533) on all platforms [reitowo/WizardCM/PatTheMav/tytan652/pkviet/kkartaltepe/Lain-B]</li>
<li>Changed scene items to use relative coordinates [derrod]<ul>
<li>Existing scene collections will be automatically converted to use relative coordinates if the scene collection has a known output resolution set.</li>
</ul>
</li>
<li>Split NVIDIA Audio Effects from Noise Suppression [pkviet]<ul>
<li>Existing filters will be automatically migrated.</li>
</ul>
</li>
<li>Changed the Image Slideshow's Playback Mode property from radio buttons to a dropdown [derrod]</li>
<li>Disabled the (currently unsupported) built-in Automatic Scene Switcher when using Wayland on Linux [tytan652]</li>
<li>Improved error messages for macOS Virtual Camera [jcm93]</li>
<li>Changed Display and Window capture on Windows to not capture the first found display or window [Lain-B]   </li>
<li>Changed display and window capture on Linux to not capture implicitly [Lain-B]</li>
<li>Added a warning to Window Capture when trying to capture WinUI 3 applications with BitBlt [qhy040404]</li>
<li>Refactored the NVENC implementation with various improvements [derrod]<ul>
<li>SDK 12.2 features, such as split encoding, are now supported.</li>
<li>Additional features from old SDKs are supported:<ul>
<li>B-Frames as reference</li>
<li>Target Quality VBR mode (CQVBR)</li>
</ul>
</li>
<li>A custom options field has been added to allow setting more options that don't warrant their own UI elements.</li>
</ul>
</li>
<li>Improved screensaver inhibit functions on Linux in Flatpak [tytan652]</li>
<li>Changed scripts to correctly pass settings to modified callbacks on reload [Penwy]</li>
<li>Removed legacy QSV code for old devices (Haswell or older) [RytoEX]</li>
<li>Removed legacy QSV code for Windows 7 [RytoEX]</li>
<li>Removed default desktop audio device on macOS 13+ [jcm93]</li>
<li>Removed NVIDIA Kepler GPU support for NVENC [derrod]</li>
<li>Removed FTL support [derrod]</li>
<li>Removed legacy migrations from OBS Studio 28.1 and earlier [derrod]<ul>
<li>If updating from these older versions, you may wish to update to OBS Studio 30.2 first, and then update to OBS Studio 31.</li>
</ul>
</li>
<li>Removed support for Ubuntu 22.04 [derrod]</li>
<li>Removed legacy YouTube chat [gxalpha]</li>
<li>Blocked TikTok Virtual Camera from loading in OBS due to known issues [notr1ch]</li>
<li>Application settings have been split into "app" configuration and "user" configuration, rather than storing everything in global.ini [PatTheMav]</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed two crashes with the QSV encoder on Linux [kkartaltepe]</li>
<li>Fixed a crash with a race condition involving multitrack video output reconnect [dsaedtler]</li>
<li>Fixed two potential crashes in Linux Window Capture [Lain-B]</li>
<li>Fixed a crash on macOS that could occur if an audio device was disconnected [jcm93]</li>
<li>Fixed a crash on Windows when capturing D3D12 games [confusionattack/Lain-B]</li>
<li>Fixed a crash on Linux when importing a scene collection created on Windows [SarenDev]</li>
<li>Fixed a crash on Windows when capturing a Vulkan application [Charlese2]</li>
<li>Fixed a deadlock in MP4 muxer [derrod/notr1ch]</li>
<li>Fixed a deadlock when shutting down muxer [exeldro]</li>
<li>Fixed a potential deadlock when stopping an encoder [derrod]</li>
<li>Fixed a potential memory error and crash in text parser [fzwoch]</li>
<li>Fixed a couple minor memory leaks [pkviet]</li>
<li>Fixed a memory leak in PipeWire plugin [dimtpap]</li>
<li>Fixed a memory leak when playing an HDR media file [tt2468]</li>
<li>Fixed an issue on FreeBSD with handling SSL certificates [emaste]</li>
<li>Fixed an issue with pressed button color in the Rachni theme [shiina424]</li>
<li>Fixed an issue with some missing icons in the System theme [shiina424]</li>
<li>Fixed an SRT listener bug where the socket was not closed properly [pkviet]</li>
<li>Fixed an issue where the current scene collection could be erased to default when trying to switch to a different scene collection that's corrupted or invalid [derrod]</li>
<li>Fixed a buffer overrun in UTF-8 text conversion [derrod]</li>
<li>Fixed an issue that could cause bitrate spikes in QSV CBR [thyintel]<ul>
<li>Note: This fix only applies to Lunar Lake or newer except Alder Lake N.</li>
</ul>
</li>
<li>Fixed an issue where the Auto Configuration Wizard could unintentionally enable Enhanced Broadcasting [lexano-ivs]</li>
<li>Fixed issues with the audio clipping indicators displaying incorrectly on volume meters [norihiro]</li>
<li>Fixed an issue causing hotkeys to register inconsistently on macOS [jcm93]</li>
<li>Fixed an issue causing multitrack video output to fail if color format was set to I444 [dsaedtler]</li>
<li>Fixed an issue where Custom CSS in browser sources no longer worked with certain websites (namely YouTube chat) [vvto33]</li>
<li>Restored STUN support for WHIP output [mondain]</li>
</ul>]]></description>
    </item>
        <item>
      <title>Our Plan to Stop Confusing Everyone with OBS Studio Versioning</title>
      <link>https://obsproject.com/blog/obs-studio-versioning-changes</link>
      <guid>https://obsproject.com/blog/obs-studio-versioning-changes</guid>
      <pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<p>With OBS Studio 31 on the horizon, it’s a good time to reflect on how our release process works and how we’ve been handling versioning. Over the years, we've experienced a lot of growth, and it’s been a journey to find the right balance between new features, stability, and clarity in how we label our releases.</p>
<h3>A Decade of Growth</h3>
<p>OBS has been around for over ten years now, and in that time, it has grown significantly in terms of functionality, code complexity, and community size. With this growth came challenges, both in development and organization. While it’s a great problem to have, figuring out how to manage these growing pains hasn’t always been easy. </p>
<p>One of the areas that needed attention was our release process and versioning methods. Up until recently, we lacked a clear, consistent approach to how we numbered our releases. But with version 30, we’ve started to follow proper <strong>Semantic Versioning (SemVer)</strong> a lot more strictly.</p>
<h3>What Is Semantic Versioning?</h3>
<p><strong>Semantic Versioning</strong> is a system for labeling software versions in a logical, consistent way. It communicates the significance of changes so users and developers know what to expect from an update.</p>
<p><strong>MAJOR.MINOR.PATCH</strong><br />
<em>Ex. 30.0.1</em></p>
<ul>
<li><strong>MAJOR</strong>: Big, breaking changes that may affect how you interact with the software or require developers to adjust their code.</li>
<li><strong>MINOR</strong>: New features and improvements that don’t break anything but add something new.</li>
<li><strong>PATCH</strong>: Hotfixes and other bugs that need attention before other releases</li>
</ul>
<h3>Our Journey with Versioning</h3>
<p>In the past, our versioning was a bit… loose. We didn’t have a strict structure or consistency in deciding when to release a new version or how to label it. Releases would come when we felt there were enough new features or fixes to warrant one, and we’d assign a version number based on how significant we thought the changes were.</p>
<p>Sometimes a <strong>MAJOR</strong> version would include breaking changes, and other times it was simply a feature-packed release we wanted to highlight. This inconsistency could be confusing, and moving forward, we’ve committed to using <strong>MAJOR</strong> version numbers strictly for updates that fundamentally change how you use OBS or affect developers by modifying the API or dependencies.</p>
<p>A great example of why this change was needed is OBS 28.0. That release included an update to the UI framework we use, which broke compatibility with several plugins. In hindsight, our inconsistent use of <strong>MAJOR</strong> version bumps muddied the significance of this update, causing frustration among both users and developers. By sticking more closely to Semantic Versioning, we hope to avoid these kinds of issues in the future.</p>
<h3>What This Means for You</h3>
<p>Going forward, you can expect <strong>MINOR</strong> version bumps to be more common. We’re aiming to limit <strong>MAJOR</strong> breaking updates to about once a year, though that timeline could shift to be more or less depending on the needs of the project. </p>
<p>To be clear, this doesn’t mean the project is slowing down. In fact, it’s quite the opposite. With clearer planning and more predictable versioning, we’ll be able to manage releases more efficiently. In the past 10 years, we’ve reached version 30, but over the next decade, we may not even hit version 40, simply because <strong>MAJOR</strong> releases will be less frequent. This is just a visual change to how we label updates, not a reflection of the pace or size of our changes.</p>
<h3>Our Release Schedule</h3>
<p>Alongside our commitment to more structured versioning, we’re also working toward a more predictable release schedule. While we’re not enforcing strict deadlines for features or updates yet, we’re aiming for new releases roughly every 4 months. This loose schedule gives contributors and users a better idea of when to expect new features and fixes, without sacrificing quality by rushing development.</p>
<p>As we move forward, we’re excited to bring more structure to the OBS Studio release process, giving you clearer communication on what’s coming and when. By adopting a more standardized approach to versioning and scheduling, we hope to make OBS even better for both everyday users and developers who rely on it. We’re thrilled about what’s coming in version 31 and beyond—stay tuned!</p>]]></description>
    </item>
        <item>
      <title>OBS Studio 30.2 Release Notes</title>
      <link>https://obsproject.com/blog/obs-studio-30-2-release-notes</link>
      <guid>https://obsproject.com/blog/obs-studio-30-2-release-notes</guid>
      <pubDate>Fri, 12 Jul 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<p>This release brings some visual updates to the UI, a new Hybrid MP4 recording format, a wide array of fixes and improvements, as well as multitrack video output.</p>
<p><em><strong>Note</strong>: NVIDIA users may need to update their GPU drivers to 531.61 (Windows) / 530.41.03 (Linux) or newer.</em></p>
<p><em><strong>Note</strong>: The code signing certificate for OBS is being updated. This may impact game capture compatibility with some anti-cheat solutions starting with the next major OBS update. If you are a game or anti-cheat developer please see <a href="https://obsproject.com/kb/capture-hook-certificate-update">https://obsproject.com/kb/capture-hook-certificate-update</a> for more information.</em></p>
<h3>New Features</h3>
<ul>
<li>Added support for Multitrack Video streaming [palana]<ul>
<li>On Twitch, this is known as Enhanced Broadcasting. For more information, see: <a href="https://help.twitch.tv/s/article/multiple-encodes">https://help.twitch.tv/s/article/multiple-encodes</a></li>
<li>The supported audio channel configurations are stereo or mono.</li>
<li>This feature is currently only available on Windows and requires an NVIDIA GTX 900, GTX 10, or RTX 20 series GPU or newer or an AMD RX 6000 series GPU or newer. Support for other operating systems and GPU vendors is planned.</li>
<li>When this feature is enabled, the following data about your system will be sent to the streaming service when starting a stream:<ul>
<li>OBS version and audio/video settings (resolution, framerate, audio channels/tracks)</li>
<li>CPU info (name, speed, core counts)</li>
<li>GPU info (model, memory, driver version, device ID, vendor ID)</li>
<li>Memory info (free, total)</li>
<li>OS info (name, version, arch, emulation)<ul>
<li>Windows info (gaming feature status: Game Bar, Game DVR, Game Mode, Hardware-accelerated GPU Scheduling)</li>
</ul>
</li>
<li>Multitrack Video settings (maximum streaming bandwidth, maximum video tracks)</li>
</ul>
</li>
</ul>
</li>
<li>Added support for Enhanced RTMP/FLV multi-track audio and video [palana/kc5nra]<ul>
<li>Replaces the old metadata-based "VOD Track"</li>
</ul>
</li>
<li>Added "Hybrid MP4" output format (BETA) [derrod]<ul>
<li>Combines fault-tolerance of fragmented MP4 with wide compatibility and faster access times of regular MP4. For more information, see: <a href="https://obsproject.com/kb/hybrid-mp4">https://obsproject.com/kb/hybrid-mp4</a></li>
<li>Supports inserting chapter markers into the file via a hotkey or API. These markers are supported by most video players and editing software, such as DaVinci Resolve</li>
</ul>
</li>
<li>Added Linux support to the native NVENC encoder [derrod]<ul>
<li>NVENC AV1 is now supported on Linux</li>
</ul>
</li>
<li>Added Linux shared texture support to the NVENC encoder [derrod]</li>
<li>Added Linux shared texture support to the QuickSync encoder [kkartaltepe]</li>
<li>Added Linux shared texture support to the VA-API encoder [nowrep]</li>
<li>Added HEVC support to WebRTC output [murillo128]</li>
<li>Added Composable Themes system to simplify theme creation, maintenance, and enable future customization options [derrod/Warchamp7]<ul>
<li>Themes now consist of a base theme and variants that can be switched between in the new "Appearance" settings tab</li>
<li>Old themes will no longer work and will need to be updated to the new system. See the wiki page for details: <a href="https://github.com/obsproject/obs-studio/wiki/OBS-Studio-Theme-System">https://github.com/obsproject/obs-studio/wiki/OBS-Studio-Theme-System</a></li>
<li>The legacy System theme is no longer available. If it was used for accessibility reasons with high contrast, enable high contrast in your operating system settings to re-enable the OBS System Theme. OBS can only detect high contrast on Windows and macOS at this time.</li>
</ul>
</li>
</ul>
<h3>General Changes</h3>
<ul>
<li>Various UI and Theme tweaks [Warchamp7]</li>
<li>Audio of multiple instances of a source in a scene/group is now deduplicated [derrod]<ul>
<li>Deduplication is recursive, but does not apply on groups or nested scenes that are currently playing show/hide transitions, this may be fixed in the future</li>
</ul>
</li>
<li>Scene Collection specific plugin data is now retained for plugins that are not currently loaded [derrod]</li>
<li>Closed-captions are now supported for HEVC and AV1 [jhnbwrs]</li>
<li>Qt Fusion style is now always enforced on Linux [tytan652]</li>
<li>Combined PipeWire window/display capture into unified "Screen Capture" source to align with other platforms [tytan652]<ul>
<li>Renamed "Screen Capture (XSHM)" as "Display Capture (XSHM)" for consistency with other capture sources [tytan652]</li>
</ul>
</li>
<li>Set default recording format on macOS to fragmented MOV [gxalpha]</li>
<li>Improved freetype2 text source performance [kkartaltepe]</li>
<li>File open dialogs now start in the directory of the currently selected file, rather than the default [Warchamp7]</li>
<li>Moved warnings in advanced output to bottom of settings window for better visibility [GPattenden]</li>
<li>Various performance improvements for texture encoding [kkartaltepe]</li>
<li>Prioritize NVDEC decoder on NVIDIA systems [moocowsheep]</li>
<li>Support NVDEC decoder for encoded DirectShow sources [moocowsheep]</li>
<li>Replaced non-texture NVENC FFmpeg fallback with native implementation [derrod]</li>
<li>Log now includes all available encoders [Penwy]</li>
<li>Reset duration of scene item show/hide transitions when removing the transitions [Warchamp7]</li>
<li>Adjusted appearance of volume meters [Warchamp7]</li>
<li>Adjusted appearance of multiview borders and labels [Warchamp7]</li>
<li>Added support for audio-only and video-only WHIP outputs [tt2468]</li>
<li>Changed default container in non-macOS OBS Beta builds from Fragmented MP4 to Hybrid MP4 [derrod]</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed packet priority not being set for some AV1 encoders, resulting in outputs never recovering from dropping frames [derrod]</li>
<li>Fixed various issues with audio channel layouts in (remuxed) recordings [pkv/derrod]</li>
<li>Fixed various issues with the native FLV muxer [palana]</li>
<li>Fixed various issues with the RTMP protocol implementation [palana]</li>
<li>Fixed minor errors in HEVC and AVC decoder configuration records [derrod]</li>
<li>Fixed change discard confirmation dialog popping up twice when closing source properties [tytan652]</li>
<li>Fixed QSV AV1 on multi-GPU systems [thyintel/derrod]</li>
<li>Fixed FFmpeg output erroneously checking disk space when not writing to a file [RytoEX]</li>
<li>Fixed auto-config wizard not working without a stream key [mar10iana]</li>
<li>Fixed text alignment with extents [exeldro]</li>
<li>Fixed encoder properties having nested scroll areas in output settings [derrod]</li>
<li>Fixed crash if input video resolution changes when using hardware-accelerated decoding [tt2468]</li>
<li>Fixed button text being cut off in controls dock [powersagitar]</li>
<li>Fixed undo action for filters showing UUID instead of name [derrod]</li>
<li>Fixed not all eligible Patreon supporters being shown in the "About" dialogue [Warchamp7]</li>
<li>Fixed copy-pasting show/hide transitions not including duration [Warchamp7]</li>
<li>Fixed settings dialog being cut off on low-resolution screens [tytan652/Warchamp7/derrod/RytoEX] (yes, this one took four people to figure out)</li>
<li>Fixed paused indicator text stacking [Aleksbgbg]</li>
<li>Fixed disabled audio sources showing up in advanced audio properties [Penwy]</li>
<li>Fixed Grid Mode setting not being persisted when enabled through the View menu [RytoEX]</li>
<li>Fixed CoreAudio not handling encoder delay, resulting in audio being 44-48 ms late [derrod]</li>
<li>Fixed OBS not handling negative audio timestamps at the start of an output correctly, resulting in Opus and CoreAudio AAC audio being delayed by a few ms [derrod]</li>
<li>Fixed VA-API AV1 encoder being unavailable if H.264 is unsupported [kkartaltepe]</li>
<li>Fixed WebRTC buffer size being too small for recovery with high-bitrate video [Sean-Der]</li>
<li>Fixed renaming multiple scenes when hitting Tab key while renaming [howellrl]</li>
</ul>]]></description>
    </item>
        <item>
      <title>Writing an MP4 Muxer for Fun and Profit</title>
      <link>https://obsproject.com/blog/obs-studio-hybrid-mp4</link>
      <guid>https://obsproject.com/blog/obs-studio-hybrid-mp4</guid>
      <pubDate>Fri, 12 Jul 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<h5><center>(Except there is no profit, only pain)</center></h5>
<p>In OBS 30.2 I introduced the new "Hybrid MP4" output format which solves a number of complaints our users have had for pretty much all of OBS's existence; It's resilient against data loss like MKV, but widely compatible like regular MP4.</p>
<p>Getting here was quite a journey, and involved fixing several other bugs in OBS that were only apparent once diving this deep into how the audio and video data is stored.</p>
<p>In this post I'll try to explain how MP4 works, what the drawbacks were to regular/fragmented MP4, and how I tried to solve them with a hybrid approach.</p>
<h2>QTFF, BMFF, WTF</h2>
<p>The MP4 file format we all know and love today is based on Apple's <a href="https://en.wikipedia.org/wiki/QuickTime_File_Format">"QuickTime File Format" (QTFF)</a> - mostly just known as "MOV" - which was originally created in the 90s. It was adapted by the International Organization for Standardization (ISO) to create the <a href="https://en.wikipedia.org/wiki/MP4_file_format">MP4 File Format</a> in 2001, then later split up into the more generic <a href="https://en.wikipedia.org/wiki/ISO_base_media_file_format">"Base Media File Format" (ISO BMFF)</a> and an MP4 extension containing MPEG-specific features.</p>
<p>Since then, MP4 has undergone numerous updates and extensions over the years to support new codecs and more specialised use cases. The extensible nature of the base format also means that various users of MP4, such as Apple, have added extensions to support various other features such as DRM, 3D video and more.</p>
<h2>The Trouble with <del>Tribbles</del> MP4</h2>
<p>While MP4 is very widespread and supported by almost anything under the sun, there are some issues specific to the use case of recording live video to disk. To explain those, let's first go over the basic structure of an MP4 file, as that will help make sense of what was required to make Hybrid MP4 work.</p>
<p>At its core an MP4 file is made up of objects known as "Boxes" in ISO, or "Atoms" in Apple terminology. Each box consists of a header containing its size and a four-letter name/type, followed by its data. Most boxes contain data structures defined in ISO/Apple specifications, but some are containers for other boxes. This allows for a hierarchical structure of the file and makes it easy to extend the format by introducing new boxes containing additional information without breaking backwards compatibility with existing software. For the purposes of this blog post, however, we'll only be looking at what are known as "top-level boxes", i.e. boxes that are written directly into the file and are not contained within other boxes.</p>
<figure><img alt="MP4 Diagram" src="https://obsproject.com/media/pages/blog/obs-studio-hybrid-mp4/4e708fd0e3-1767490606/blog_mp4_transparent_fixed.png"></figure>
<p>A typical MP4 file produced by OBS or FFmpeg will contain four top-level boxes:</p>
<ul>
<li><code>ftyp</code> - File Type Box: Contains information about the the standard version(s) used in the file</li>
<li><code>free</code> - Free Space Box: Placeholder that should be ignored/skipped over</li>
<li><code>mdat</code> - Media Data Box: Contains data for media tracks (audio, video, etc.)</li>
<li><code>moov</code> - Movie Box: Contains other boxes with metadata for the file and media tracks</li>
</ul>
<p>There are two things here that create the main problem we have with MP4: The <code>moov</code> sits at the end and is written when finalising the file, and it is required to be able to make sense of the data contained in the <code>mdat</code> box. This means that if the writing of the file gets interrupted for any reason (BSOD, disk full, power loss, etc.) and the <code>moov</code> box is not written, the file is extremely difficult - if not impossible - to recover. This is obviously very bad™ if you just recorded your best ever clutch in Counter-Strike but then your disk space ran out and now you don't have any proof of it ever happening!</p>
<p><em><strong>Note about the <code>free</code> box since it will become important later:</strong> The size field in the box header is limited to 4 GiB. In order to have an <code>mdat</code> box larger than that, an extended size field needs to be used, which increases the size of the header. FFmpeg and OBS will write the placeholder so that it can be overwritten to writer a longer <code>mdat</code> header should it become necessary.</em></p>
<p>This leads us into the next part, which details the first attempt at solving this problem...</p>
<h2>Fragmented Frustration</h2>
<p>Some time ago the ISO format was extended with support for splitting media data into "Fragments", this is commonly referred to as "Fragmented MP4". These fragments can be split out into separate files as well, which is mainly used when streaming video over the internet, whether live on Twitch<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref">1</a></sup> or films on Netflix. The details of that are beyond the scope of this post, but you can learn more about why this is done and its advantages for streaming use cases by reading more about <a href="https://en.wikipedia.org/wiki/HTTP_Live_Streaming">HLS</a> and <a href="https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP">DASH</a>.</p>
<p>What's relevant for us is that a fragmented file has an "incomplete" <code>moov</code> that only contains the basic information necessary for decoding each track, with the information about specific samples (video frames, audio segments) contained in a fragment being stored in the <code>moof</code> (Movie Fragment Box) at the start of each fragment.</p>
<figure><img alt="Fragmented MP4 Diagram" src="https://obsproject.com/media/pages/blog/obs-studio-hybrid-mp4/be0b883d12-1767490633/blog_fmp4_transparent.png"></figure>
<p>This is useful for the OBS recording use case because it means that a file no longer relies on a single <code>moov</code> containing all the information about the media data in the file. Each fragment only needs it's own <code>moof</code> box + the incomplete <code>moov</code> at the beginning to be played back correctly. This means that if the writing of the file is interrupted (e.g. due to a power failure), everything up to the last fragment will still be readable, solving the data loss problem of regular MP4 files.</p>
<p>Sounds too good to be true, doesn't it? Well, there are some significant downsides that ultimately caused us to stop using fragmented MP4 as the default pretty quickly:</p>
<ol>
<li>Fragmented files are still not well supported in various applications, including editors and players</li>
<li>They are slow to access on HDD or network drives, as each fragment's header needs to be read to get the complete metadata of the file and start playback</li>
<li>File browsers such as the Windows explorer do not show the file duration due to 2.</li>
<li>Some players (e.g. the default Windows Media Player) do not allow seeking in the file due to 2. and will instead play it back like a livestream</li>
</ol>
<p>Of course this can be fixed by remuxing the file, but that just brings us right back to where we started with MKV. There has to be a better way...</p>
<h2>Hybrid Harmony</h2>
<p>Quite a while ago I had a simple though: What if we just "finalise" a fragmented file with a full <code>moov</code> so that it behaves like a regular MP4? Then finally a few months ago I started to actually explore this idea which evolved into what we now know as "Hybrid MP4".</p>
<p>While the recording is running, a hybrid file is really just a fragmented MP4, retaining the resilience against data loss, but when the recording stops, it is quickly modified to appear like a normal MP4. I called this process a "soft remux" because it only needs to overwrite a small part of the file to achieve similar results to fully remuxing a file.</p>
<p>To do this, a full <code>moov</code> is written at the very end of the file that indexes the media data exactly like a normal MP4 would, and the placeholder <code>free</code> box at the start is overwritten with an <code>mdat</code> header that turns the entire file up to the newly written <code>moov</code> box into one giant Media Data box, thus effectively hiding the fragments from a reading application. This means we're now left with a file that <em>appears</em> to be a regular MP4, when it's actually fragmented inside!</p>
<figure><img alt="Hybrid MP4 Diagram" src="https://obsproject.com/media/pages/blog/obs-studio-hybrid-mp4/9d3498e6ea-1767490681/blog_hybrid_transparent.png"></figure>
<p>The hybrid approach ultimately addresses all the problems we had by combining the best of both worlds. If a file is not finalised you still have a valid fragmented MP4 that can be remuxed if necessary, and if it is finalised, well, for all intents and purposes it's just a regular old MP4.</p>
<p>And that's pretty much it. This idea went through a few rounds of iteration and improvement, this post only details the final version that has shipped in OBS. It kind of hurts that several days of work and research can be summed up in a couple paragraphs, but that's what the "pain" part in the subtitle is for.</p>
<h2><a href="https://en.wikipedia.org/wiki/Big_Buck_Bunny#Legacy">Big Buck Bunny</a> Holes</h2>
<p>The process of building this implementation took me down quite a few rabbit holes, as it required me to learn a lot of low-level details about how audio and video data is stored in files, and sometimes left me wondering why my results were different from the references I was using. This section contains some fun and some not so fun examples of things I encountered while working on the Hybrid MP4 output.</p>
<h3>Chapter Markers</h3>
<p>Markers are one of the headline features that Hybrid MP4 adds over the existing FFmpeg-based output. Don't get me wrong, FFmpeg <em>does</em> support these as well, but we never implemented it. But while I was doing this I figured this might be a good time to get it done, and will give users a nice incentive to actually use and test it.</p>
<p>The MP4 standard itself actually does not define anything for chapter markers, they are entirely based on Apple's QuickTime specification, and even then it seems to be only <em>mostly</em> documented. The implementation in OBS is directly adapted from FFmpeg, and should work in all the same software that it does like video players and some editing suites such as DaVinci Resolve. Sadly this does not include Adobe Premiere or Final Cut Pro, but there may be tools coming to make it a bit easier for those users!</p>
<h3>Additional Metadata</h3>
<p>While I was at it I figured I can add some additional metadata to each media track and the file itself, such as the encoder configuration<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref">2</a></sup>, so I did! This is particularly useful when you're testing different settings and want to compare them later, but don't want to have to rename the file after every test. Files now also contain a correct creation/encoding date so even if you rename them you can still track when a file was originally recorded.</p>
<h3>Multi-Track Video</h3>
<p>The new MP4 output now also supports multiple video tracks alongside multiple audio tracks, this is great for debugging features such as Twitch's <a href="https://help.twitch.tv/s/article/multiple-encodes">Enhanced Broadcasting</a> by having a single file with all the video streams that can be easily switched between in players such as MPC-HC.</p>
<p>So it's not super useful for the average user <em>yet</em>, but hopefully we can make use of it in the future for things such as ISO recording (well, if we can also convince video editors to support it...).</p>
<h3>Audio Encoder Delay and why your audio might've been out of sync for the last few years</h3>
<p>AAC and Opus audio both have something called "priming" samples, this is a few milliseconds of silence at the start of an audio stream used to "warm up" the encoder, which should be skipped when playing back the file. Audio packets containing priming samples have a negative timestamp, indicating (part of) the audio they contain should be skipped during playback. There were two separate issues in OBS related to this:</p>
<ol>
<li>Audio packets with timestamp &lt; 0 would be discarded until the one with a closest timestamp &lt;= 0 is found, which would then have its timestamp "corrected" so that the stream always starts at 0, thus including the delay in the output and causing it to be slightly out of sync</li>
<li>The CoreAudio AAC encoder implementation did not subtract the delay from timestamps at all, thus audio always being delayed by 40-44 ms (at 48/44.1 kHz)</li>
</ol>
<p>Issue 1. happened to <strong>not</strong> affect the default audio encoder (FFmpeg AAC), as it uses a delay equivalent to packet duration, meaning the first packet with actual audio already starts at 0. Opus on the other hand would produce a first packet with a timestamp of -312 with the next one being 648, OBS would then "correct" the packets to 0 and 960 respectively and would result in the 312 samples of silence being included and the audio being ~6.5 ms late.</p>
<h2>Coincidental Collaboration</h2>
<p>Just a few days after we merged the Hybrid MP4 feature into OBS the FFmpeg maintainer Martin <a href="https://ffmpeg.org/pipermail/ffmpeg-devel/2024-May/328600.html">submitted a patch</a> that adds a similar feature to FFmpeg's MOV/MP4 muxer. This was entirely coincidental, and includes a note that Apple apparently did something like this already, which just proves that great minds do indeed think alike 😛.</p>
<p>This has now also been merged into FFmpeg as well, meaning it's already available in git builds and will hopefully soon make it's way into a stable release!</p>
<p><em>Note: The FFmpeg implementation is slightly different, and the OBS version has a few more safety nets just in case. It's still great to have though!</em></p>
<h2>MOV-ing Forward</h2>
<p>While MP4 is great for many things, it lacks some of the features and codec support available in it's ancestor QTFF (or MOV). Adding a "Hybrid MOV" mode is the next step to truly making it the new default in OBS. This primarily requires dealing with some of the differences between MOV and MP4 with things like PCM audio, differently implemented metadata structures, and also support for the ProRes codec. I'm hoping this can be done in time for OBS 31.0 if everything goes well!</p>
<p>A few other things that I'd like to work on for future improvements:</p>
<ol>
<li>Better accuracy for chapter marker timestamps (needs OBS backend updates)</li>
<li>Support for writing a timecode (<code>tmcd</code>) track (requires the same backend updates as 1.)</li>
<li>Support for configurable fragment duration, rather than always fragmenting on keyframes (particularly important for intra-only codecs such as ProRes)</li>
<li><em>(Maybe)</em> Built-in utility for exporting chapter markers in different formats for easier use in Premiere, etc.</li>
<li><strong>(Big Maybe)</strong> Support for embedded <a href="https://en.wikipedia.org/wiki/Extensible_Metadata_Platform">XMP</a> metadata for markers in Premiere</li>
</ol>
<h2>Thanks &amp; Acknowledgements</h2>
<ul>
<li>FFmpeg and its contributors for documenting the undocumented</li>
<li>GPAC for mp4box.js, which has been invaluable for debugging my muxer and inspecting its output</li>
<li>Apple's old QTFF documentation for actually being really good and having great explanations for concepts such as priming samples</li>
<li><strong>NOT</strong> the ISO for paywalling these specs and making it a god damn paperchase where every time you get one document it references three others that are also paywalled</li>
</ul>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Twitch currently only uses fragmented MP4 for HEVC/AV1 video, for H.264 it uses the <a href="https://en.wikipedia.org/wiki/MPEG_transport_stream">MPEG transport stream</a> container&#160;<a href="#fnref1:1" rev="footnote" class="footnote-backref">&#8617;</a></p>
</li>
<li id="fn:2">
<p>See the <a href="https://obsproject.com/kb/hybrid-mp4">Knowledge Base article</a> for details on how to enable the encoder metadata.&#160;<a href="#fnref1:2" rev="footnote" class="footnote-backref">&#8617;</a></p>
</li>
</ol>
</div>]]></description>
    </item>
        <item>
      <title>YouTube Renews Premier Sponsorship of the OBS Project</title>
      <link>https://obsproject.com/blog/youtube-renews-premier-sponsorship-of-the-obs-project</link>
      <guid>https://obsproject.com/blog/youtube-renews-premier-sponsorship-of-the-obs-project</guid>
      <pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<p><a href="https://www.youtube.com"><figure class="centered"><img alt="YouTube Logo" src="https://obsproject.com/media/pages/blog/youtube-renews-premier-sponsorship-of-the-obs-project/97f8c429a5-1767490533/yt_logo_mono_dark_small.png"></figure></a></p>
<p>We're excited to announce that YouTube has renewed their premier sponsorship of the OBS Project! Since they first partnered with us back in 2020, we've made some incredible progress together, both for the betterment of OBS, and the streaming community as a whole. Let's go over a few highlights from the past year that they have helped us accomplish to celebrate our continued partnership.</p>
<p>We partnered with YouTube to add support for streaming HEVC and AV1-encoded video over e-RTMP, the first update to the widely used protocol RTMP in over a decade. With the release of OBS 29.1 in May 2023, creators could use modern codecs to stream higher-quality video to YouTube using less bandwidth. To kick off 2024, we've added more e-RTMP features in OBS 30.1 (out now!), enabling creators to stream HDR content to YouTube using HEVC over e-RTMP.</p>
<p>We also collaborated with YouTube to embed a streamlined version of their Live Control Room panel as a dock within OBS. Released with OBS 30.0 in November 2023, this let creators monitor CCV and stream health, manage ads, insert stream markers, and more from OBS without the need to visit YouTube. Real-time content creation and streaming can be overwhelming, and we're happy that we can provide tools to ease the burden right in OBS. We're actively working with them and providing feedback to make this feature even better!</p>
<p>YouTube is a pillar of creativity in the internet community, serving as a nexus for people to share all kinds of content, including live performances, live streams of video game content, educational resources, product reviews, comedy sketches, and much more. It pioneered a new generation of video content across TV, computer and mobile devices, while also providing a platform that allows anyone to create and grow a career out of video content creation.</p>
<p>The OBS Project team is proud to have a role in serving content creators on YouTube with free and open source tools, and are incredibly grateful to YouTube for supporting us as we continue to meet those needs!</p>]]></description>
    </item>
        <item>
      <title>OBS Studio 30.1 Release Notes</title>
      <link>https://obsproject.com/blog/obs-studio-30-1-release-notes</link>
      <guid>https://obsproject.com/blog/obs-studio-30-1-release-notes</guid>
      <pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<p>If you would like to support the OBS Project, please consider contributing to our <a href="https://patreon.com/obsproject">Patreon</a> or <a href="https://opencollective.com/obsproject">Open Collective</a>!</p>
<h3>30.1 New Features</h3>
<ul>
<li>Enabled HDR for HEVC over RTMP [nquah]<ul>
<li>AV1 HDR is not currently supported by YouTube.</li>
</ul>
</li>
<li>Reworked the Image Slideshow source [Lain-B]<ul>
<li>The reworked Image Slideshow source loads files asynchronously and fixes an issue where the slideshow would loop before showing all images. To change existing Image Slideshow sources to the new version, you must recreate them. Existing Image Slideshow sources will continue functioning as before.</li>
</ul>
</li>
<li>Added Capture Audio option to window/game capture on Windows [derrod]</li>
<li>Added Premultiplied Alpha option for game capture on Windows [jpark37]</li>
<li>Added option for automatic cropping to bounding box [derrod]</li>
<li>Added maxRGB tonemapper for SDR in HDR Tone Mapping filter [jpark37]</li>
<li>Added GPU rescaling options for streaming and recording outputs [derrod]</li>
<li>Added channel selection for CoreAudio input devices [PatTheMav]</li>
<li>Added Capture Card Device source type on macOS [PatTheMav]</li>
<li>Enabled multi-track audio support for mpegts [pkviet]</li>
<li>Added AV1 support for VA-API [nowrep]</li>
<li>Added AV1 support for WebRTC/WHIP output [Sean-Der]</li>
<li>Added Video Capture Device (PipeWire) source type [GeorgesStavracas]</li>
</ul>
<h3>30.1 Changes</h3>
<ul>
<li>Added HDR support for the Elgato HD60 X Rev.2 [FBirth]</li>
<li>Added theme data search paths [derrod]</li>
<li>Added Lua script location to search path for Lua native libraries [Smartkin]</li>
<li>Added Python 3.11 support for macOS [PatTheMav]</li>
<li>Updated obs-websocket to version 5.4.2 [tt2468/Lain-B]<ul>
<li>Release notes for addition in 5.4.0 are here: <a href="https://github.com/obsproject/obs-websocket/releases/tag/5.4.0">https://github.com/obsproject/obs-websocket/releases/tag/5.4.0</a></li>
</ul>
</li>
<li>Improved simple mode replay buffer settings [gxalpha]</li>
<li>Switched to bigger units in the UI for high bitrate/large recordings [derrod]</li>
<li>Disabled Paste Transform on locked scene items [cg2121]</li>
<li>Disabled Edit Transform if scene item is locked [cg2121]</li>
<li>Removed Windows 7 and Ubuntu 20.04 NVENC fallbacks [derrod]</li>
<li>PCM audio in (fragmented) MP4/MOV is now supported [derrod]</li>
<li>Changed default recording format to fMP4/fMOV for stable releases [derrod]</li>
</ul>
<h3>30.1 Bug Fixes</h3>
<ul>
<li>Fixed crashes with the Virtual Camera on Windows when apps consumed it as YUY2 [vico-shang]</li>
<li>Fixed crash when loading Python at runtime on Windows [PatTheMav]</li>
<li>Fixed crash in Image Slideshow when adding a directory with no files in it [notr1ch]</li>
<li>Fixed crash on macOS when attempting to stream to a WHIP servers with certain configurations [RytoEX/Sean-Der]</li>
<li>Fixed crash when trying to stream with WebRTC/WHIP [CrackThrough]</li>
<li>Fixed a possible crash in Lua scripts when switching scene collections [exeldro]</li>
<li>Fixed a possible crash with WHIP output [Aleksbgbg]</li>
<li>Fixed deadlock when adding a macOS Screen Capture source [PatTheMav]</li>
<li>Fixed issue where OBS could be closed by docked browser panels [WizardCM]</li>
<li>Fixed high CPU usage with Virtual Camera on macOS [jcm93]</li>
<li>Fixed checkbox misalignment on macOS in properties view [nikola3211]</li>
<li>Fixed audio track 1 audio being offset/desynced with other tracks [derrod]</li>
<li>Fixed incorrect VST window size on HiDPI display [xlinshan]</li>
<li>Fixed editable list UI element having incorrect background-color [tuduweb]</li>
<li>Fixed the resize cursor with respecting the item transformation [BGM99]</li>
<li>Fixed disk space reporting for attached network drives on macOS [PatTheMav]</li>
<li>Fixed Safe Mode removing third-party transitions from scene collection [derrod]</li>
<li>Fixed being unable to use QSV in the Flatpak package [twelho]</li>
<li>Fixed audio track titles not being set in Custom FFmpeg Output [tuduweb]</li>
<li>Fixed an issue with free disk space calculation on ExFAT and FAT32 volumes on macOS [PatTheMav]</li>
<li>Fixed an issue with free disk space calculation on macOS not matching values in Finder [jcm]</li>
<li>Fixed an issue where a removed source's scene would not be correctly logged [exeldro]</li>
<li>Clarified the macOS microphone permissions prompt [jcm]</li>
<li>Fixed a regression causing a missing tooltip for Fragmented MOV/MP4 [shiina424]</li>
<li>Fixed an issue with the background of audio meters being transparent causing visual artifacts [fzwoch]</li>
<li>Fixed an issue with Yes/No buttons on the Reset Docks confirmation message box not being translated [shiina424]</li>
<li>Fixed an issue preventing the Remux dialog from being used multiple times [RytoEX]</li>
</ul>]]></description>
    </item>
        <item>
      <title>OBS Studio 29 Release Notes</title>
      <link>https://obsproject.com/blog/obs-studio-29-release-notes</link>
      <guid>https://obsproject.com/blog/obs-studio-29-release-notes</guid>
      <pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate>
      <description><![CDATA[<h2>OBS Studio 29.1</h2>
<h3>New Features and Additions</h3>
<ul>
<li>Added support for streaming AV1/HEVC over Enhanced RTMP [YouTube/yuriy-chunak/derrod]<ul>
<li>Enhanced RTMP V1 extends the RTMP protocol to support newer video codecs and HDR. More info at: <a href="https://github.com/veovera/enhanced-rtmp">https://github.com/veovera/enhanced-rtmp</a></li>
<li>Currently only supported by/enabled for YouTube as a beta feature</li>
<li>HDR is not yet implemented</li>
</ul>
</li>
<li>Added support for multiple audio tracks in Simple output recording [pkv]</li>
<li>Added a DLL blocking feature for Windows. This allows OBS to block problematic DLLs from attaching to OBS and causing freezing or crashes, for example 3rd party overlay hooks and outdated video capture devices. [notr1ch]<ul>
<li>This blocks old versions of popular VTubing software virtual cameras that are known to cause freezes when accessing video capture device properties. If you are affected, please update to the latest version of your VTubing software.</li>
</ul>
</li>
<li>Added settings to select the audio encoder for streaming and recording [tytan652]</li>
<li>Added an option to preload media sources used in Stingers to memory, to avoid frame skips during transitions [Lain]</li>
<li>Added Update Channels on macOS and updated Sparkle for smaller and faster updates going forward [derrod]</li>
<li>Added compatibility notices in the Window and Game Capture sources for Windows [derrod]</li>
<li>Added the ability to zoom browser docks with Ctrl - and + and the right click menu [WizardCM]</li>
<li>Added a setting to record in fragmented MP4 and MOV formats [derrod]<ul>
<li>These offer greater compatibility than MKV while providing similar resilience against data loss due to crashes, running out of space, etc.</li>
<li>Fragmented MP4 and MOV files can be remuxed to regular MP4/MOV in cases where the former may not be read correctly (e.g. in older editing software)</li>
</ul>
</li>
<li>Added support for surround sound for AJA capture cards [paulh-aja]</li>
<li>Added ProRes 4444 (XQ) support for VideoToolbox encoder on macOS [jpark37]</li>
<li>Added lossless audio recording options (FLAC/ALAC/PCM including 32-bit float) [derrod]</li>
<li>Added indicator if an audio source is unmuted, but not assigned to any audio tracks [derrod]</li>
<li>Added AMD AV1 encoder to simple output mode [notr1ch]</li>
</ul>
<h3>General Changes</h3>
<ul>
<li>Increased the minimum macOS version to macOS 11.0 [PatTheMav]</li>
<li>Output rescaling is ignored if the scaled resolution matches the current video output resolution [notr1ch]</li>
<li>NVENC error messages now include more details [notr1ch]</li>
<li>Changed the default FFmpeg AAC encoder to twoloop which has higher quality [norihiro]</li>
<li>Allow symbolic links for VST paths [tuduweb]</li>
<li>Implemented QVBR for AMF encoders [flaeri]</li>
<li>Expanded support for subtitle tracks in VLC source (up to 1000) [jjm2473]</li>
<li>The Hotkeys tab in settings is no longer loaded until switched to, resulting in the Settings window opening much faster for large scene collections [derrod]</li>
<li>Switched various internal data structures to use hash tables for lookups, resulting in significant performance and loading/saving time improvements with large scene collections [derrod]</li>
<li>Exported scene collection JSON is now pretty-printed and sorted, allowing for easier tracking via git or other versioning mechanisms [derrod]</li>
<li>Added a "What's New" entry in the help menu to manually open the post-update changelog dialog [derrod]</li>
<li>Clicking the "Defaults" button in properties will now ask for confirmation before resetting [derrod]</li>
<li>Improved Windows OBS updater speed and reduced download size by using Zstandard compression [derrod]</li>
<li>Added platform-specific "What's New" notifications to better communicate changes or issues not affecting all operating systems [derrod]</li>
<li>Added option to force SDR Window Capture capture in Windows 10+ mode [jpark37]</li>
<li>Improved YouTube thumbnail preview by using bilinear scaling [derrod]</li>
<li>Incompatible audio/video encoders will now be disabled based on the selected format [derrod]</li>
<li>Added HEVC and HDR support to VA-API encoder [yuriy-chunak]</li>
<li>Added HDR capture support for DeckLink sources [jpark37]</li>
<li>Video-related items in the right click menu of audio sources in the Sources list will no longer appear [cg2121]</li>
<li>Native macOS dialogs now respect OBS being set to dark themes [gxalpha]</li>
<li>Significantly improve screen capture performance on Intel dedicated GPUs on Linux [kkartaltepe]</li>
<li>JACK inputs on Linux will now display "OBS Studio" in their name to clarify their origin. This may cause existing configured devices to stop working until updated by the user [univrsal]</li>
<li>The system color selection dialog is now used on macOS [gxalpha]</li>
<li>Various improvements to the t-bar for a more predictable user experience [gxalpha]</li>
<li>Plugins installed system-wide are no longer loaded when OBS is run in Portable Mode [gxalpha]</li>
<li>Hardware Decoding of Media Sources can now use CUDA [rjgtav]</li>
<li>Improved DeckLink performance [jpark37]</li>
<li>Python 3.11 is now supported in Scripting [RytoEX]</li>
<li>Added FDK AAC support on Flatpak [tytan652]</li>
<li>Browser docks now provide a "Copy page address" option [WizardCM]</li>
<li>Increased the maximum resolution of browser sources to 8192x8192 [fungiboletus]</li>
<li>OBS Websocket has been updated to 5.2 [RytoEX]</li>
<li>Changed Add Source menu to sort case-insensitively [gxalpha]</li>
<li>Improved default buffering behavior for most Elgato video capture devices on Windows [FBirth]</li>
<li>Added codec logging for the QSV encoder [RytoEX]</li>
<li>Made hotkey edit layout margins symmetrical [gxalpha]</li>
<li>Added logging if the active encoder is incompatible with dynamic bitrate [pkv]</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed output silently not starting when using multi-track audio at higher frame rates [kkartaltepe]</li>
<li>Fixed dynamic bitrate changes not working when using NVENC presets p6 or p7 [pkv]</li>
<li>Fixed encoder settings not being updated if the encoder is changed in settings [tytan652]</li>
<li>Fixed a crash that could occur when using a video source that frequently changed its resolution (e.g. a VLC playlist) [notr1ch]</li>
<li>Fixed a crash that could occur when using streams in the media source (introduced in v29) [notr1ch]</li>
<li>Fixed an issue with negative gain in upward compressor [pkv]</li>
<li>Fixed several bugs in FFmpeg custom output related to color conversion [flaeri]</li>
<li>Fixed UI unresponsiveness when searching for hotkeys and duplicate key assignments in large collections [derrod]</li>
<li>Fixed an issue with RTMP timeouts that could cause a server to think OBS has cleanly ended the connection instead of it disconnecting due to an error, and not activating features like "disconnect protection" [notr1ch]</li>
<li>Fixed properties being cut off until window is resized [derrod]</li>
<li>Fixed portable Windows versions not restarting in portable mode after an update [derrod]</li>
<li>Fixed updating of an install being blocked by unrelated OBS instances running [derrod]</li>
<li>Fixed excessive config reads when sources are selected in the preview [derrod]</li>
<li>Fixed audio track assignments of sources provided by third-party plugins being reset when the plugin could not be loaded [derrod]</li>
<li>Fixed invalid rescaled resolutions being allowed when they shouldn't be [tuduweb]</li>
<li>Fixed presets in the Expander filter not applying changes immediately [tuduweb]</li>
<li>Fixed the virtual camera on Windows reporting the incorrect resolution to external apps, resulting in stretched images [exeldro]</li>
<li>Fixed the ability to drag and drop scenes after clicking Rename and not changing the name of the Scene [cg2121]</li>
<li>Fixed a crash on macOS that would occur when an external display with an active Projector was disconnected [PatTheMav]</li>
<li>Fixed an issue where remuxing a .ts file would fail [tuduweb]</li>
<li>Fixed an issue with the VLC source where large videos (e.g. 4K) would get squashed horizontally [CoalZombik]</li>
<li>Fixed spacing helpers appearing incorrectly when a source is rotated and flipped [cg2121]</li>
<li>Fixed an issue where the preview would display incorrectly when zoomed too far in either direction [cg2121]</li>
<li>Fixed the macOS virtual camera potentially crashing external apps and recordings to be the wrong length [mac-cain13]</li>
<li>Various fixes for monitoring when using PulseAudio [kkartaltepe]</li>
<li>Fixed a crash on shutdown with virtual camera on Linux [kkartaltepe/norihiro]</li>
<li>Fixed an issue in the V4L2 source on Linux where a capture device's frame rate could be invalid, resulting in incredibly large log files [9p4]</li>
<li>Fixed the listing of PulseAudio monitoring devices incorrectly listing inputs [jp-bennett]</li>
<li>Fixed the preview having the ability to scroll infinitely out of view when scaled manually [cg2121]</li>
<li>Fixed the Async Filters list showing incompatible async filters for synchronous sources [gxalpha]</li>
<li>Fixed an issue where the cursor would not properly disappear in certain games on Wayland [rmngr]</li>
<li>Fixed an issue where certain filters would not properly update when clicking the Defaults button [gxalpha]</li>
<li>Fixed an issue with FFmpeg NVENC producing invalid DTS when using b-frames [RytoEX/flaeri/derrod/tt2468]</li>
<li>Fixed an issue where network sources in the Media Source could cause rendering/UI freezes when they reconnect [tt2468]</li>
<li>Fixed AAC encoding of 2.1 audio [pkv]</li>
<li>Fixed an issue where pressing Space would unexpectedly pause the active media source when the main window was focused [cg2121]</li>
<li>Fixed an issue where duplicating scenes would lose colour coding on sources [cg2121]</li>
<li>Browser dock Inspect will now remember settings and customizations [WizardCM]</li>
<li>Fixed a case where HDR -&gt; SDR might not tonemap correctly [jpark37]</li>
<li>Fixed simple mode replay buffer maximum not being set [derrod]</li>
<li>Fixed Windows-only RTMP options (e.g., Network Optimizations) causing issues if the profile was imported on non-Windows with those enabled [tytan652]</li>
<li>Fixed security software status logs showing as blank when running on non-English locales [notr1ch]</li>
<li>Fixed a bug where certain system localizations couldn't load Lua files on Windows [exeldro]</li>
<li>Fixed Screen Capture crashing in the Flatpak with old versions of PipeWire server [tytan652]</li>
<li>Fixed an issue where Push to Talk on Linux wouldn't work when assigned to secondary mouse buttons [KasinSparks]</li>
<li>Fixed CBR padding when using NVENC AV1/HEVC [derrod]</li>
<li>Fixed Auto Scene Switcher not saving settings correctly [PatTheMav]</li>
<li>Fixed AMF encoder crashing when streaming by temporarily disabling dynamic bitrate when it is in use [derrod]</li>
<li>Fixed recordings made with Apple VT Hardware encoders in CRF mode only having one initial keyframe [derrod]</li>
<li>Various improvements and fixes to Decklink performance [jpark37]</li>
<li>Fixed transparent windows capturing incorrectly on Wayland using PipeWire [asahilina]</li>
<li>Fixed an issue with the source rotation handle when source is flipped [cg2121]</li>
<li>Fixed a crash in Decklink Output when no Decklink device is available [jpark37]</li>
</ul>
<h2>OBS Studio 29.0.2</h2>
<ul>
<li>Fixed a bug introduced in 29.0.1 which caused sources with an upward compressor filter to stop audio playback under certain circumstances [notr1ch/pkv]</li>
</ul>
<h2>OBS Studio 29.0.1</h2>
<ul>
<li>Fixed the "NVIDIA AUDIO Effects SDK is outdated" message appearing on the noise reduction filter properties when the SDK wasn't installed [notr1ch]</li>
<li>Fixed a crash that could happen if you use NVIDIA's audio effect filters and then later uninstall the SDK [pkv]</li>
<li>Fixed the expander and upward compressor audio filters sounding distorted [pkv/norihiro]</li>
<li>Added "Knee Width" option to the upward compressor audio filter to improve quality [pkv/norihiro]</li>
<li>Fixed a bug where overriding the theme on Linux could cause the program not to start up [kkartaltepe]</li>
<li>Fixed software rendering not working properly on Linux [columbarius]</li>
<li>Fixed a bug where the Stats window/panel would show an incorrect disk space calculation when pausing recordings [notr1ch]</li>
<li>Fixed a bug on Windows where the "Force SDR" setting in window capture wasn't showing up [jpark37]</li>
<li>Fixed a bug on macOS where the virtual camera would show up red [PatTheMav]</li>
<li>Fixed a bug where Linux captures would not work correctly on X11 [kkartaltepe]</li>
<li>Fixed a crash on Linux when using Wayland and trying to use the automatic scene switcher [GeorgesStavracas]</li>
<li>Fixed a bug where alpha wouldn't output properly when setting OBS to use BGRA color format [jpark37]</li>
<li>Fixed a crash on startup when OBS was minimized [derrod]</li>
<li>Fixed a bug where projectors could look washed out when projecting SDR content while using an HDR display [jpark37]</li>
<li>Fixed a bug on Windows where secondary displays could sometimes not show up in the display capture properties [jpark37]</li>
<li>Fixed a crash when using the virtual camera as an OBS source and changing the canvas resolution [notr1ch]</li>
<li>Fixed a bug on macOS where the properties window would go behind the main window after opening a file selection dialog [gxalpha]</li>
<li>Fixed a bug where profile encoder settings would not properly update when switching between services that require a different encoder [tytan652]</li>
<li>Fixed a bug in custom ffmpeg output mode where RTMP would force certain encoders [flaeri]</li>
</ul>
<h2>OBS Studio 29.0</h2>
<h3>New Features and Additions</h3>
<ul>
<li>Added support for the AMD AV1 Encoder for the RX7000 series GPUs on Windows [AMD/Lain]</li>
<li>Added support for the Intel AV1 Encoder for Arc GPUs on Windows [Intel/Lain]<ul>
<li>Note: CQP is available but not fully supported</li>
</ul>
</li>
<li>Added support for the Intel HEVC Encoder on Windows [yuriy-chumak/rcdrone/Lain]</li>
<li>Added an upward compressor filter [pkv]</li>
<li>Added a 3-band equalizer filter [Lain]</li>
<li>Added support for native HEVC and ProRes encoders on macOS, including P010 and HDR [Developer-Ecosystem-Engineering/PatTheMav/gxalpha]</li>
<li>Added support for macOS Desk View [Developer-Ecosystem-Engineering]</li>
<li>Added update channels for opting into receiving beta/release-candidate builds to Windows [Rodney]<ul>
<li>Work is still underway to get everything ready on the server side, updating via the built-in updater may not be available until later in the OBS 30.0 beta-testing period</li>
</ul>
</li>
<li>Websockets updated to 5.1.0, which has a number of bug fixes, UI improvements, and new stream reconnect events. [tt2468]</li>
</ul>
<h3>General Changes</h3>
<ul>
<li>The Replay Buffer's memory limit is now set to 75% of installed system RAM rather than fixed to 8GB [Rodney]</li>
<li>Added media key support in Linux [kkartaltepe]</li>
<li>Various improvements to NVIDIA Video and Audio filters, including a Mask Refresh slider and support for temporal processing, which provides better quality masking [pkv]</li>
<li>Improved Display Capture screen naming &amp; saving on Windows; indexes should now match regardless of Mode, and reconnected displays should show the correct monitor [jpark37]<ul>
<li>Note: This does mean existing Display Capture sources will be blank until manually configured, to avoid showing the wrong display</li>
</ul>
</li>
<li>Added support for encryption and authentication for SRT and RIST outputs [pkv]</li>
<li>Disabled ScreenCaptureKit Display &amp; App capture on macOS 12 due to various issues; users should either update to macOS 13 or use the existing Screen Capture source [PatTheMav]</li>
<li>Removed the automatic numbering on Multiview labels [Warchamp7]</li>
<li>Added the ability to mute individual browser docks [WizardCM]</li>
<li>Added the ability to right click and 'Inspect' individual browser docks [WizardCM]</li>
<li>Changed the default Simple Output NVENC preset to P5 for better compatibility &amp; performance [RytoEX]</li>
<li>Added support for higher refresh rates in the Video Capture Device source on Windows [WizardCM/EposVox]</li>
<li>Added the Apple VT Hardware encoder to the Auto Configuration Wizard [gxalpha]</li>
<li>Improved FFmpeg VA-API enablement by directly using Libva to check device capabilities [tytan652]</li>
<li>Various minor UX/accessibility tweaks in the UI [Warchamp7/cg2121]</li>
<li>Raised the speed at which dynamic bitrate recovers after a drop [Lain]</li>
<li>Audio should now be automatically captured for most capture card brands using the Video Capture Device source on Windows [WizardCM/EposVox]</li>
<li>Added a slide counter to the Source Toolbar when an Image Slide Show is selected [cg2121]</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed issues with async filters (such as Delay) not rendering correctly [jpark37]</li>
<li>Various performance improvements to Decklink preview output [jpark37]</li>
<li>Fixed an issue where source Projector windows wouldn't close when a source was deleted [cg2121]</li>
<li>Fixed an issue where cursors would disappear or display incorrectly on screen captures on Windows [caesay]</li>
<li>Fixed issues with CQP rate control for SVT and AOM AV1 encoders [flaeri]</li>
<li>Fixed an issue with CQP rate control for AMD HEVC and H264 [flaeri]</li>
<li>Fixed Virtual Camera not working with Webex and GoToMeeting [Lain]</li>
<li>Fixed capturing UHD/4K YUV on the AJA Kona HDMI [paulh-aja]</li>
<li>Fixed a bug where slideshow sources wouldn't remove cleared files when removing missing files [gxalpha]</li>
<li>Fixed slideshow counter on the source context toolbar showing "1/0" when empty, now shows "-/-" instead [cg2121]</li>
<li>Fixed chroma location for VAAPI [jpark37]</li>
<li>Fixed a case where macOS' VideoToolBox HEVC encoder would be parsed as AVC [jpark37]</li>
<li>Allow SRT streams to disconnect after timeout [pkv]</li>
<li>Fixed color space being incorrect for some video devices running in MJPEG video format on Windows [jpark37]</li>
<li>Fixed monitor names in the Fullscreen Projector &amp; Multiview menus on Windows [WizardCM]</li>
</ul>]]></description>
    </item>
        <item>
      <title>OBS Studio and obs-websocket Join Forces</title>
      <link>https://obsproject.com/blog/obs-studio-and-obs-websocket-join-forces</link>
      <guid>https://obsproject.com/blog/obs-studio-and-obs-websocket-join-forces</guid>
      <pubDate>Wed, 03 Aug 2022 00:00:00 +0000</pubDate>
      <description><![CDATA[<p>Right around 8 months ago, Palakis and I were approached by the members here at the OBS Project with an idea: Make WebSocket functionality a core feature of OBS Studio. On July 3rd, I was pleased to announce the standalone release of obs-websocket version 5. This version is a complete rewrite of the popular plugin obs-websocket. With over a year of development finally behind us, this version brings a new protocol, many great features, and greatly improved reliability. You can see the notable changes <a href="https://github.com/obsproject/obs-websocket/wiki/Notable-changes-between-4.x-and-5.x">here</a>.</p>
<p>While the release is a standalone plugin meant to be run with OBS Studio 27.2, we will be including version 5 with all downloads of OBS Studio starting with version 28.0.0. Including obs-websocket v5 by default will help drive adoption of the new protocol, and we expect it to benefit the third-party scripts and tools ecosystem long-term by bringing official support to the API that many of them depend on.</p>
<p>To install 5.0.1, check out the <a href="https://github.com/obsproject/obs-websocket/releases/tag/5.0.1">release available on GitHub</a>. Please bear in mind that obs-websocket v5 uses a new protocol that not all tools support, so you may need to additionally install the 4.9.1-compat version to continue using those tools. For a list of software tools that already support the new protocol, see <a href="https://github.com/obsproject/obs-websocket#client-software">here</a>.</p>
<p>Many existing tools will require the previous version of obs-websocket, 4.9.1-compat, in order to continue working until such time as those tools are updated. This version can be installed alongside v5 and will not conflict, and can safely be removed at a later date once any tools you may be using are updated to the new version. That version can be found alongside the download links for 5.0.1 on the release page.</p>
<p>We do have a <a href="https://discord.gg/WBaSQ3A">Discord Server</a> dedicated to obs-websocket where you can participate in discussions and get help for the plugin. If you'd like to contribute towards furthering obs-websocket development, we have a dedicated <a href="https://opencollective.com/obsproject/projects/obs-websocket-dev">Open Collective</a> page. Thank you to those who have faithfully contributed via Open Collective thus far!</p>]]></description>
    </item>
      </channel>
</rss>