# Release notes (/en/realtime-media/broadcast-streaming/reference/release-notes)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

<_PlatformTabsGroup groupMode="structured" canonicalPlatform="web" platforms="[&#x22;web&#x22;,&#x22;android&#x22;,&#x22;ios&#x22;,&#x22;macos&#x22;,&#x22;windows&#x22;,&#x22;electron&#x22;,&#x22;flutter&#x22;,&#x22;react-native&#x22;,&#x22;javascript&#x22;,&#x22;unity&#x22;,&#x22;unreal&#x22;,&#x22;blueprint&#x22;]" showTabs="true">
  <_PlatformPanel platform="web">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="web" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [AI Noise Suppression](#ai-noise-suppression)
    * [Virtual background](#virtual-background)
    * [Super Clarity extension](#super-clarity-extension)
    * [Watermark extension](#watermark-extension)
    * [Video Compositor extension](#video-compositor-extension)
    * [Beauty Effect extension](#beauty-effect-extension)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk]

    Video Calling 4.x is a JavaScript and TypeScript library loaded by an HTML web page. The SDK library uses APIs in the web browser to establish connections and control the communication, Broadcast Streaming and Interactive Live Streaming services.

    ### Compatibility [#compatibility]

    See [Supported platforms](/en/realtime-media/video/reference/supported-platforms).

    ### Known issues [#known-issues]

    ### v4.24.5 [#v4245]

    Released on June 24, 2026.

    #### Upgrade considerations [#upgrade-considerations]

    * **Domain allowlist change**

      Starting with v4.24.5, the SDK domain allowlist is updated to:

      ```text
      .agora.io
      .edge.agora.io
      .sd-rtn.com
      .edge.sd-rtn.com
      .rtnsvc.com
      .edge.rtnsvc.com
      .rtesvc.com
      .edge.rtesvc.com
      ```

      If you upgrade to v4.24.5, update your firewall allowlist so the SDK continues to work in restricted-network environments. See [Firewall requirements](/en/realtime-media/broadcast-streaming/reference/firewall).

    #### New features [#new-features]

    * **Background voice removal in AI Noise Suppression**

      The AI Noise Suppression extension is enhanced to remove background human voices. In noisy environments or scenarios with multiple speakers, this capability further isolates the target speaker and improves audio capture. See [Extension release notes](#ai-noise-suppression).

    #### Improvements [#improvements]

    This release includes the following improvements:

    * Optimized the signaling flow to improve session-setup efficiency and connection success rates in complex network environments.
    * Optimized media-tracing links and jitter-buffer handling to reduce first-frame time and audio and video stuttering in certain scenarios.
    * The audio subscription flow now uses a presubscribe model by default, improving subscription efficiency and playback stability. When full-link feedback and frame-rate-priority mode are enabled, you can now set a lower bound for resolution downgrade.

    #### Fixed issues [#fixed-issues]

    This release fixed the following issues:

    * Connection setup could time out in some scenarios.
    * The remote user received duplicate `user-joined` callbacks when a user with a string UID rejoined a channel immediately after leaving.
    * Messages could not be received in some scenarios.
    * On Safari 16.6, the local view could turn black or exit unexpectedly in some scenarios.
    * Remote video could freeze briefly after the first `client.publish(video)` call.
    * TypeScript type definition files were missing and some exported symbols were incorrect in the npm package.

    ### v4.24.4 [#v4244]

    Released on May 27, 2026.

    #### Improvements [#improvements-1]

    This release includes internal optimizations for weak-network scenarios, improving the login success rate.

    ### v4.24.3 [#v4243]

    Released on April 1, 2026.

    #### New features [#new-features-1]

    * **AI Noise Suppression extension upgrade**

      The AI Noise Suppression extension ([agora-extension-ai-denoiser](https://www.npmjs.com/package/agora-extension-ai-denoiser)) is upgraded to v2.0.1. This version adds a low-latency mode and the ability to configure the log level of the WASM module. For details, see [Extension release notes](#ai-noise-suppression).

    #### Improvements [#improvements-2]

    This release includes the following improvements:

    * Optimizes the interactive video experience in H.264 encoding scenarios.
    * The [Super Clarity extension](#super-clarity-extension) is upgraded to v2.0.1, with sharpening algorithm improvements that provide better video experience in some scenarios.

    ### v4.24.2 [#v4242]

    Released on December 12, 2025.

    This release addresses a compatibility issue introduced in Chrome 143.

    #### Issue description [#issue-description]

    During a communication session between users A and B, if user A unsubscribes and stops publishing an audio stream and then tries to publish audio again, the SDK triggers the following error:

    `Session error code: ERROR_CONTENT`

    A breaking change in Chrome causes this issue and affects all versions of the RTC Web SDK. See the [Chromium bug report](https://issues.chromium.org/issues/467468926) for details.

    #### Solution [#solution]

    This version implements a compatibility fix that prevents the issue from interrupting republishing and subscription workflows. The fix remains in place until Chrome provides an official update.

    The Agora R\&D team has reported the issue to the Chrome team and continues to monitor its progress.

    ### v4.24.1 [#v4241]

    Released on November 26, 2025.

    #### New Features [#new-features-2]

    * **Pre-call network test**

      Conducting a pre-call network test helps local users assess and predict the quality of their uplink network before starting a call. This version adds the [`startLastmileProbeTest`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartc.html#startlastmileprobetest) API, which returns information about packet loss, jitter, and round-trip time for both uplink and downlink before the call begins.

    * **Dual-stream mode**

      This version introduces the [`setDualStreamMode`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartcclient.html#setdualstreammode) method, which improves how you subscribe to dual video streams. By setting the `mode` parameter to `AUTO_SIMULCAST_MODE`, you enable adaptive low-stream mode on the sender side (low-stream is not sent by default). To send low streams, follow these steps:

      * The host on the receiving side calls `setRemoteVideoStreamType` to initiate a low-stream request.
      * The sender automatically switches to low-stream mode upon receiving the request.

      Additionally, you can set the mode parameter to `DISABLE_SIMULCAST_STREAM` (never send low stream) or `ENABLE_SIMULCAST_STREAM` (always send low stream).

      For the relationship between this method and the existing `enableDualStream` and `disableDualStream`, see the [API Reference](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartcclient.html#setdualstreammode). To ensure clear integration logic, Agora recommends that you choose one set of APIs for integration. Agora plans to deprecate `enableDualStream` and `disableDualStream` in future versions.

    * **Watermark extension (BETA)**
      This version adds the Watermark extension [`agora-extension-video-watermark`](https://www.npmjs.com/package/agora-extension-video-watermark) v1.0.0, which enables you to add image watermarks to real-time interactive video streams through an extension.

      The Watermark extension supports customizing the watermark's position, size, opacity, and other properties. It can be applied to both local and remote video tracks. For integration and usage steps, refer to Using the [Watermark extension guide](/en/realtime-media/video/build/apply-video-effects/watermark).

    * **Other New Features**

      Adds support for H.265 decoding. Refer to the [API Reference](https://api-ref.agora.io/en/video-sdk/web/4.x/globals.html#sdk_codec) for supported browser versions and usage restrictions.

    #### Improvements [#improvements-3]

    * **Expanded screen sharing capabilities**
      This version further expands screen sharing capabilities. In the `createScreenVideoTrack` API, the following parameters are added to support audio sharing during screen sharing:

      * `windowAudio` and `monitorTypeSurfaces` are added to [`ScreenVideoTrackInitConfig`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/screenvideotrackinitconfig.html) to control whether to allow sharing window audio and sharing the entire screen, respectively.

      * `suppressLocalAudioPlayback` and `restrictOwnAudio` are added to `ScreenAudioTrackInitConfig` to control whether local audio playback and capture are allowed.

      In screen sharing scenarios with co-hosting, Agora does not recommend sharing system or window audio, as it may cause echo. You can disable audio sharing by setting both `windowAudio` and `systemAudio` in `ScreenVideoTrackInitConfig` to `"exclude"`.

    * **New release of the Super Clarity extension**

      This version upgrades the algorithm of [`agora-extension-super-clarity`](https://www.npmjs.com/package/agora-extension-super-clarity), with improvements in reducing plugin size, enhancing video experience, and expanding browser compatibility. The new version of the plugin requires a browser that supports SIMD to run properly. For detailed changes and improvements, refer to the [Extension release notes](#super-clarity-extension).

    #### Bug Fixes [#bug-fixes]

    Fixes an issue on iOS where the system volume could not be set to `0` after destroying an audio stream.

    ### v4.24.0 [#v4240]

    Released on August 6, 2025

    #### New features [#new-features-3]

    * **Fast first-frame rendering**

      Adds a new `options` parameter to the [`join`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartcclient.html#join) method to configure channel media options. When you set `autoSubscribe` to `true` in [`IJoinOptions`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/ijoinoptions.html), the user automatically subscribes to the host’s media stream when joining the channel.

      In real-time interactive scenarios such as one-on-one or one-to-many calls, this feature reduces the time to render the first frame and improves the overall interactive experience.

      <CalloutContainer type="warning">
        <CalloutTitle>
          Note
        </CalloutTitle>

        <CalloutDescription>
          When automatic subscription to the host’s media stream is enabled, Agora delivers the media stream and starts billing for usage as soon as the user joins the channel.
        </CalloutDescription>
      </CalloutContainer>

    #### Improvements [#improvements-4]

    * **Transmission optimization in poor network conditions**

      Optimizes the bandwidth estimation algorithm and implements audio-priority transmission. This reduces the risk of video stuttering under extremely poor network conditions and improves the smoothness of resolution switching, making transitions more seamless. The SDK also responds faster after network recovery.

    * **New media connection strategy**

      Introduces a new media connection strategy that improves the SDK’s reconnection and media login success rates under enterprise and restricted network environments.

    * **Improved accuracy for network quality evaluation**

      Enhances the algorithm for evaluating [`NetworkQuality`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/networkquality.html) by incorporating available bandwidth as a reference. This enables the SDK to more accurately reflect the impact of bandwidth-limited network conditions.

      This improvement requires enabling a private parameter. Contact [support@agora.io](mailto\:support@agora.io) for details.

    ##### Other improvements [#other-improvements]

    * Optimizes the default video bitrate under different encoding standards to allocate uplink bandwidth more efficiently and reduce stuttering in poor network conditions.
    * Improves the fallback mechanism for devices that do not support AV1 decoding.
    * Enhances the user experience in one-on-one calls in `rtc` mode when communicating between Web clients or between Web and Native clients.

    #### Issues fixed [#issues-fixed]

    This version fixes the following issues:

    * Black screen on Firefox 138+ caused by a browser version rollback.
    * Video stuttering caused by Safari 18.4 and 18.5.
    * Encoding failure when the resolution was too low.
    * Occasional black screen in scenarios using Plan-B.

    ### v4.23.4 [#v4234]

    Released on June 5, 2025.

    This release includes internal improvements. It fixes an issue where calling `setMute` or `setEnable` under certain conditions could result in no sound. If you are using SDK version 4.23.0 or later, upgrade to this release for a better user experience.

    ### v4.23.3 [#v4233]

    Released on April 29, 2025.

    This release updates the virtual background extension to [v2.1.0](https://www.npmjs.com/package/agora-extension-virtual-background), with the following changes:

    * Optimizes memory and CPU usage.
    * Fixes black screen issues at specific resolutions.

    ### v4.23.2 [#v4232]

    Released on March 4, 2025.

    This release includes the following improvements:

    * Internal optimizations to support [Agora Conversational AI Engine](/en/introduction/conversational-ai).

      * Enable audio metadata transmission
      * Get presentation timestamp from the audio stream

      For details on using these features, [submit a technical support ticket](https://agoraio.zendesk.com/hc/en-us).

    * Further reduced package size.

    ### v4.23.1 [#v4231]

    Released on January 17, 2025.

    This release includes several internal improvements.

    ### v4.23.0 [#v4230]

    Released on December 19, 2024.

    #### Compatibility changes [#compatibility-changes]

    This release modified the calculation of [`freezeRate`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/remotevideotrackstats.html#freezerate) in `RemoteVideoTrackStats`. The calculation is changed from the cumulative average freeze rate to the freeze rate in the last second. You can use this parameter to determine whether the video is experiencing a momentary freeze. To calculate the cumulative average freeze rate for the current session, use [`totalFreezeTime`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/remotevideotrackstats.html#totalfreezetime) or [`totalDuration`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/remotevideotrackstats.html#totalduration).

    #### New features [#new-features-4]

    1. **`PeerConnection` state callback for the local media**

       To obtain the media connection state under poor network conditions, this release adds the [`peerconnection-state-change`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartcclient.html#event_peerconnection_state_change) event, which is used to obtain the connection state of WebRTC [RTCPeerConnection](https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection).

    2. **Sharing the current tab by default**

       To improve the ease of use of screen sharing, this release adds the [`preferCurrentTab`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/screenvideotrackinitconfig.html#prefercurrenttab) parameter in `ScreenVideoTrackInitConfig`, which supports setting sharing the current tab as default when creating a screen sharing track.

    #### Improvements [#improvements-5]

    1. **Improved media reconnection strategy**

       This release improves the media reconnection strategy, which in turn increases the reconnection and media login success rate under poor network conditions. For enterprise networks with firewalls, the improvement is particularly noticeable. Contact [support@agora.io](mailto\:support@agora.io) to try this new strategy.

    2. **Improved virtual background algorithm**

       This release upgrades the [Virtual Background extension](https://www.npmjs.com/package/agora-extension-virtual-background/v/2.0.0) to version 2.0.0. The updated algorithm provides a more distinct face edge and clearer and more stable video images.

    3. **Reduced package size**

       To further reduce the package size, this release separates the Plan-B feature, which is compatible with WebRTC, from the ESM-bundle package into an independent service module. Users can integrate them manually based on actual needs. For details, see [Use tree shaking](/en/realtime-media/video/build/optimize-and-operate/app-size-optimization#use-tree-shaking).

    4. **Other improvements**

       * Optimized login duration under complex network conditions.
       * Optimized layer switching algorithm of VP9, which can reduce latency and improve video smoothness.

         <CalloutContainer type="warning">
           <CalloutTitle>
             Note
           </CalloutTitle>

           <CalloutDescription>
             Safari does not support VP9 SVC.
           </CalloutDescription>
         </CalloutContainer>

    #### Bug fixes [#bug-fixes-1]

    This release fixes the following issues:

    * Black screen might occur when calling `setMute` and `setEnable` under certain conditions.
    * Occasional audio and video stream sending failures after network disconnection and reconnection.
    * Users with the role of `audience` can send streams in a 128-person scene.

    #### API changes [#api-changes]

    **Added**

    * `AgoraRTC.on("peer-connection-state-change")`
    * `preferCurrentTab` in `ScreenVideoTrackInitConfig`

    ### v4.22.2 [#v4222]

    v4.22.2 was released on 29 October 2024.

    #### New features [#new-features-5]

    **Screen sharing audio 3A processing**

    Starting from v4.22.2, when calling the `createScreenVideoTrack` method to create a screen sharing video track, the `withAudio` parameter supports passing `ScreenAudioTrackInitConfig` to customize the initialization config of audio sharing. Depending on your use case, you can enable 3A processing (AGC, AEC, and ANS) as needed to optimize the quality of shared audio.

    For details, see the [API documentation](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartc.html#createscreenvideotrack).

    <CalloutContainer type="warning">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        If your browser does not support audio sharing, passing `ScreenAudioTrackInitConfig` will only return the video track.
      </CalloutDescription>
    </CalloutContainer>

    #### API changes [#api-changes-1]

    This version introduces the following new APIs:

    * The `withAudio` parameter in the `createScreenVideoTrack` method supports passing `ScreenAudioTrackInitConfig`.

    ### v4.22.1 [#v4221]

    v4.22.1 was released on 23 September, 2024.

    #### Improvements [#improvements-6]

    This release includes several internal improvements.

    ### v4.22.0 [#v4220]

    v4.22.0 was released on 16 August, 2024.

    #### Compatibility changes [#compatibility-changes-1]

    To further reduce the package size, this version splits the Channel Media Relay Service and the Live Streaming Service from the ESM-bundle format package into independent service modules. You can manually import these modules for integration based on your actual needs. See [Use tree shaking](/en/realtime-media/video/build/optimize-and-operate/app-size-optimization#use-tree-shaking) for details on how to integrate.

    #### New features [#new-features-6]

    **Optimize channel preload**

    When using the channel preload feature, Agora recommends sending the host's media stream immediately when calling the method to join the channel. This reduces the first frame rendering time. For details, see [Preload channels](/en/realtime-media/video/build/join-and-manage-channels/preload-channels). With this setting, users will start pulling streams as soon as they join the channel, which will generate charges. For details on how Agora charges for the services, see [Pricing](/en/realtime-media/video/reference/pricing).

    **Support for AV1 encoding (Beta)**

    The SDK supports the AV1 video encoding format. You can enable this encoding format by setting `ClientConfig.codec` to `av1`. Compared to H.264 at the same bitrate, AV1 offers over a 30% improvement in encoding efficiency and provides better video quality.

    #### Improvements [#improvements-7]

    This version includes the following improvements:

    * Optimizes the SVC (Scalable Video Coding) capability for VP9 encoding and decoding, which further enhances the video quality and transmission efficiency.
    * Improves VAD (Voice Activity Detection) with a new music detection feature, increasing the accuracy of voice detection.

    #### Issues fixed [#issues-fixed-1]

    This version fixes the following issues:

    * The issue where Safari failed to retrieve `stats` in certain use-cases.
    * The issue with inaccurate bitrate settings under poor network conditions in certain use-cases.

    #### API changes [#api-changes-2]

    This version introduces the following new APIs:

    * `AgoraRTCClient.getRemoteAudioStats` adds the `receivePacketsDiscarded` return field.
    * `ClientConfig.codec` adds the `av1` enumeration.
    * The `AgoraRTC` module in the ESM-bundle adds the `use` method.

    ### v4.21.0 [#v4210]

    v4.21.0 was released on June 3, 2024.

    #### Compatibility changes [#compatibility-changes-2]

    This release introduces the Video Quality Control (VQC) module. `ICameraVideoTrack` enables the `“motion”` mode by default to ensure the smoothness of the video under low bandwidth and high CPU usage to further improve the user experience. You can call the [setOptimizationMode](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/ilocalvideotrack.html#setoptimizationmode) method to dynamically adjust the transmission mode of the video according to your needs.

    #### New features [#new-features-7]

    **Preload channels**

    This release adds the [AgoraRTC.preload](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartc.html#preload) method, which allows the user whose role is set to `audience` to preload channels before joining one. Calling the method can help shorten the time of joining a channel, thus reducing the time it takes for audience members to hear the host.

    #### Improvements [#improvements-8]

    This release includes the following improvements:

    * Enhances the bandwidth estimation and congestion control algorithms for the sender in weak network conditions, effectively reducing the buffering rate of the sender under such conditions.
    * Optimizes the SDK's browser compatibility detection scope to address the issue of inaccurate browser compatibility detection on certain devices.
    * To enhance the user experience of browsers under Safari 17.4, the video quality adaptive algorithm has been added to improve the adaptability of video quality in the case of limited network bandwidth, to further ensure the smoothness of video streaming.

    #### Issues fixed [#issues-fixed-2]

    This release fixes the following issues:

    * On some Android devices, the video playback status returned by `isPlaying` was inaccurate.
    * On Safari mobile browsers, the resolution information of the local video track returned by the `getLocalVideoStats` method was inaccurate; the resolution set by `setLowStreamParameter` for the low stream resolution did not take effect.

    #### API changes [#api-changes-3]

    **Added**

    * `AgoraRTC.preload`

    ### v4.20.2 [#v4202]

    v4.20.2 was released on March 21, 2024.

    #### Issues fixed [#issues-fixed-3]

    This release fixes the issue where the browser would modify the captured video resolution when calling [createCustomVideoTrack](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartc.html#createcustomvideotrack) in certain use-cases.

    ### v4.20.1 [#v4201]

    v4.20.1 was released on February 28, 2024.

    #### New features [#new-features-8]

    This release adds the following new features:

    **Send the SEI in the H.264 video streams**

    This release introduces the `LocalVideoTrack.sendSeiData` method and the `RemoteVideoTrack.on("sei-received")` event to add and send the Supplemental Enhancement Information (SEI) within the H.264 video streams. The SEI data package has a maximum size of 1KB and encompasses dynamic facial capture data, virtual video information, and digital watermarking. To enable this feature, please contact technical support.

    **Note:**

    * This functionality is only supported on Chrome 87 or later, as well as Safari 15.4 or later.
    * Due to the conflicts in certain browser core components, this feature is not available when [end-to-end media encryption (Beta)](/en/realtime-media/video/build/secure-and-protect-channels/media-stream-encryption) is enabled.

    **Monitor the video states of receivers**

    v4.20.1 introduces the `"video-state-changed"` event, which enables real-time monitoring of the video states of receivers, such as freezing and recovery, thereby facilitating prompt responses. For more information, see [API documentation](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iremotetrack.html#event_video_state_changed).

    **Data Stream Encryption**

    To enhance the security of data stream transmission, this version introduces a new `encryptDataStream` parameter in the `setEncryptionConfig` method for enabling data stream encryption. For more details, see [API documentation](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartcclient.html#setencryptionconfig).

    #### Improvements [#improvements-9]

    This release adds the following improvements:

    * Optimizes the audio reception experience on mobile devices, reducing issues such as electric noise or silence caused by browser defects in single audio stream use-cases.
    * Enhances video bitrate settings by adding a default setting for the minimum video bitrate. If you don't specify a value for `bitrateMin` when calling `setEncoderConfiguration`, the SDK will automatically set an appropriate bitrate based on the resolution and frame rate settings. This default setting only applies to Chrome and Edge browsers.

    #### Issues fixed [#issues-fixed-4]

    This release fixes the following issue:

    * In a single channel with 128 concurrent online hosts, if a user left the channel during network reconnection, it could result in the failure to subscribe to other users' audio streams for the local user.

    #### API changes [#api-changes-4]

    **Added**

    * `LocalVideoTrack.sendSeiData`
    * `RemoteVideoTrack.on("sei-received")`
    * `RemoteVideoTrack.on("video-state-changed")`
    * `encryptDataStream` parameter to `AgoraRTCClient.setEncryptionConfig`

    ### v4.20.0 [#v4200]

    v4.20.0 was released on December 8, 2023.

    #### Compatibility changes [#compatibility-changes-3]

    Prior to v4.20.0, the `IRemoteAudioTrack.setPlaybackDevice` method could be invoked on Firefox, but an echo issue would occur due to a Firefox [bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1849108). To improve the user experience, starting from v4.20.0, the SDK throws a `NOT_SUPPORTED` error when this method is called.

    If you are using the `IRemoteAudioTrack.setPlaybackDevice` method, you need to make code modifications after upgrading to v4.20.0.

    #### New features [#new-features-9]

    On certain versions of iOS devices, the app call might not automatically resume after being interrupted by a WeChat call or system phone call. To address this issue, this release introduces the `"audio-context-state-changed"` event to monitor whether the app call has been interrupted, and the `resumeAudioContext` method to restore the app call.

    For usage details, refer to the [API documentation](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartc.html#resumeaudiocontext).

    #### Improvements [#improvements-10]

    This release includes the following improvements:

    * Reduces the time it takes to join a channel when the user ID is a string.
    * Supports audio sharing on the ChromeOS platform when sharing the entire screen or a Chrome tab.

    #### API changes [#api-changes-5]

    **Added**

    * `resumeAudioContext`
    * `AgoraRTC.on("audio-context-state-changed")`

    ### v4.19.3 [#v4193]

    v4.19.3 was released on November 2, 2023.

    #### Issues fixed [#issues-fixed-5]

    This release fixes a black screen issue when receiving H.264 encoded video streams on Safari prior to 16. Specifically, when a client using v4.19.2 SDK for Web made a video call on Safari prior to 16 to a client using the SDK for Android, iOS, Windows, or macOS, the web client displayed a black screen if the native client sent H.264 encoded video streams.

    If you have integrated v4.19.2 of the SDK, Agora recommends upgrading to v4.19.3 as soon as possible.

    ### v4.19.2 [#v4192]

    v4.19.2 was released on October 20, 2023.

    #### Improvements [#improvements-11]

    **VP9 codec (GA)**

    This release advances VP9 from Beta to General Availability (GA) and introduces the following enhancements:

    * Updated browser compatibility: VP9 now supports Safari 16.0 and later versions on both desktop and mobile platforms.
    * Automatic fallback to VP8 for older browsers: If any user in a channel uses a browser version below the [specified compatibility threshold](#vp9-codec), all VP9-encoded video streams in that channel will automatically transition to VP8.

    Test results show that VP9 provides twice the quality of VP8 at equivalent bitrates.

    **Dynamic resolution adjustment on Safari**

    Safari has a known issue where it does not automatically reduce video encoding resolution under poor network conditions or reduced video frame rates, potentially leading to blurry video. To ensure user experience, this release adds the  `"720p_auto"` preset to the video encoder configurations. This preset guarantees automatic adjustment of the video encoding resolution on Safari.

    After upgrading to this version, if you are using a 720p video profile, Agora recommends switching to the `"720p_auto"` preset and setting the encoding format to `"vp9"` for optimal results.

    #### API changes [#api-changes-6]

    **Added**

    * `"720p_auto"` to `VideoEncoderConfigurationPreset`

    ### v4.19.1 [#v4191]

    v4.19.1 was released on October 11, 2023.

    #### Issues fixed [#issues-fixed-6]

    This release fixes the issue that an error occurred when using Webpack 4.x to bundle your app after integrating the SDK.

    ### v4.19.0 [#v4190]

    v4.19.0 was released on September 25, 2023.

    <CalloutContainer type="success">
      <CalloutTitle>
        Tip
      </CalloutTitle>

      <CalloutDescription>
        After integrating this version of the SDK into your app, you might encounter an error if you use Webpack 4.x to bundle your app. To resolve this issue:

        * If you intend to use Webpack 4.x, upgrade the SDK to v4.19.1.
        * If you prefer to continue using v4.19.0, Agora recommends bundling your app with Webpack 5.x or other tools such as Vite.
      </CalloutDescription>
    </CalloutContainer>

    #### Compatibility changes [#compatibility-changes-4]

    **Dynamic low-quality video profile adjustment**

    Before 4.19.0, you had to call `setLowStreamParameter` before `publish` to set the video profile for the low-quality video stream. This meant that changing the profile after publishing required republishing, impacting the viewing experience.

    As of this release, you can call `setLowStreamParameter` after `publish` to dynamically adjust the resolution, bitrate, and frame rate of the low-quality video stream. Agora recommends modifying your `setLowStreamParameter` calls as needed after upgrading to this release. For example, in use-cases such as live streaming and video conferences, as the number of hosts in the channel increases, you can dynamically adjust the video profile of the low-quality video stream to relieve bandwidth pressure.

    #### New features [#new-features-10]

    **Tree shaking support**

    As of this release, the SDK supports [tree shaking](https://webpack.js.org/guides/tree-shaking/), which removes unused code during the build process, reducing your app's size after integrating the SDK. To use this feature, see [App size optimization](/en/realtime-media/video/build/optimize-and-operate/app-size-optimization#use-tree-shaking).

    **Dual display of video stream**

    This release adds the `clone` method, allowing you to duplicate the current camera or screen sharing video track and customize display parameters. This can be useful in use-cases such as video conferencing and online education, where you want to display the same video stream with two sets of display parameters, including resolution, frame rate, and bitrate. For example, you can have one display set to high definition and the other to low definition.

    **Switch between front and rear cameras**

    To improve camera switching on mobile devices, this release adds the `facingMode` parameter to the `ICameraVideoTrack.setDevice` method. You can specify whether to use the front or rear camera on the mobile device.

    See [`setDevice`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/icameravideotrack.html#setdevice) for details.

    **Third-party video moderation**

    As of this release, the SDK supports integration with third-party video moderation services.

    See `setImageModeration` in the [API Reference](https://api-ref.agora.io/en/video-sdk/web/4.x/index.html) for details.

    **Beta features**

    End-to-end media encryption and Super Clarity extension are released in beta.
    See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-12]

    **Optimized automatic mode**

    In the automatic mode, the SDK initially attempts a direct connection to Agora backend. If the attempt fails, the SDK automatically switches to TCP/TLS 443. To enhance the connection experience in restricted networks, this release optimizes the SDK's automatic mode, improving connection speed and stability. The optimized automatic mode no longer uses proxies, resulting in the deprecation of the `AgoraRTCClient.on("join-fallback-to-proxy")` callback.

    **Other improvements**

    This release also includes the following improvements:

    * Reduces the time to first frame rendering. To enable this improvement, please [contact technical support](mailto\:support@agora.io).
    * Adds token expiration as a reason for a user leaving a channel in the `AgoraRTCClient.on("connection-state-change")` callback for easier troubleshooting.
    * Adds `sendJitterMs` and `sendRttMs` to local audio track information, reporting jitter (ms) and round-trip time (ms) for sent audio packets.

    #### Issues fixed [#issues-fixed-7]

    This release fixes the following issues:

    * Under normal network conditions, the SDK occasionally misreported uplink network quality as `5` in the first few seconds after joining a channel.
    * The local and remote audio and video packet loss rates reported by the SDK under the `currentPacketLossRate` attribute were inaccurate.
    * On Windows devices using Chrome 115 browser, if the local user's screen sharing remained static without mouse movement, screen sharing stopped.
    * During the procedure of subscribing to remote media streams, instances arose where the absence of audio was sporadically encountered by the local user when the remote user republished the audio stream. Likewise, when the remote user republished the video stream, occasional occurrences of a black screen were observed by the local user.
    * Memory was not promptly released after calling `IBufferSourceAudioTrack.close`.

    #### API changes [#api-changes-7]

    **Added**

    * `ICameraVideoTrack.clone` and `ILocalVideoTrack.clone`

    * `facingMode` to the `setDevice` method

    * `TOKEN_EXPIRE` to the `ConnectionDisconnectedReason` enum

    * `setImageModeration`

    * `AgoraRTCClient.on("image-moderation-connection-state-change")`

    * `ImageModerationConfiguration`

    * `ImageModerationConnectionState`

    * `sendJitterMs` and `sendRttMs` to the `LocalAudioTrackStats` interface

    * `sendJitterMs` and `sendRttMs` to the  `LocalVideoTrackStats` interface

    * `getRTCRtpTransceiver`

    * `AgoraRTCClient.on("transceiver-updated")`

    **Deprecated**

    * `AgoraRTCClient.on("join-fallback-to-proxy")`

    ### v4.18.3 [#v4183]

    v4.18.3 was released on September 20, 2023.

    #### Issues fixed [#issues-fixed-8]

    v4.18.3 fixes the following issue:

    * The SDK failed to obtain audio and video statistics on Safari 17.

    ### v4.18.2 [#v4182]

    v4.18.2 was released on July 11, 2023.

    #### Issues fixed [#issues-fixed-9]

    v4.18.2 fixes the following issues:

    * In certain circumstances, Video SDK for Web triggered microphone and camera device permission prompts after it
      finished loading.

    ### v4.18.1 [#v4181]

    v4.18.1 was released on July 03, 2023.

    #### Improvements [#improvements-13]

    **Error handling support for event listeners**

    As of this release, when an error occurs during the execution of the callback function assigned to the event listener (`listener`), the SDK does not interrupt normal operation. Instead, the SDK captures the exception and provide error information in the logs.

    **Enhanced concurrency control for asynchronous methods**

    This release optimizes concurrency control for asynchronous methods. When the following asynchronous methods are invoked concurrently, the SDK executes them in the order they were called, ensuring consistency:

    * `join` and `leave`
    * `publish` and `unpublish`
    * `subscribe` and `unsubscribe`

    Taking `publish` and `unpublish` as an example, if you call `unpublish` immediately after calling `publish`:

    * In versions earlier than 4.18.1, `unpublish` might not take effect, which means the media track could remain published.
    * As of version 4.18.1, the actual result is consistent with the order of these method calls, which means the media track is correctly unpublished.

    #### Issues fixed [#issues-fixed-10]

    This release fixed the issue that the following callbacks were not triggered when an external camera or microphone was initially connected to a device without any available cameras or microphones:

    * `onCameraChanged` or `AgoraRTC.on("camera-changed")`
    * `onMicrophoneChanged` or `AgoraRTC.on("microphone-changed")`

    ### v4.18.0 [#v4180]

    v4.18.0 was released on June 12, 2023.

    #### New features [#new-features-11]

    **Variable playback speed for audio files**

    To facilitate changing the playback speed of audio effect or music files, v4.18.0 modifies the `IBufferSourceAudioTrack` class as follows:

    * Adds the `setAudioBufferPlaybackSpeed` method, which can be called before or after a user joins a channel.
    * Adds the `playbackSpeed` property to retrieve the current playback speed.

    **Custom signaling proxy**

    v4.18.0 adds the `setProxyServer` method to allow customization of the signaling proxy server used by the SDK.

    **Flexible event listening for AgoraRTC objects**

    As of v4.18.0, the `IAgoraRTC` class inherits all methods from the `EventEmitter` class, providing a flexible way of listening to all events emitted by the `AgoraRTC` object.

    Using `onCameraChanged` as an example:

    ```javascript
    // Previous event listening (earlier than v4.18.0)
    AgoraRTC.onCameraChanged = (info) => {
      console.log("camera changed!", info.state, info.device);
    };
    // New event listening (v4.18.0 and later)
    AgoraRTC.on("camera-changed", (info) => {
      console.log("Camera changed!", info.state, info.device);
    });
    ```

    You can continue using the previous approach. However, for higher flexibility and extensibility, Agora recommends modifying the listening approach for the following events after upgrading the SDK:

    * `onAutoplayFailed`
    * `onCameraChanged`
    * `onMicrophoneChanged`
    * `onPlaybackDeviceChanged`
    * `onSecurityPolicyViolation`
    * `onAudioAutoplayFailed`: Deprecated, see `onAutoplayFailed` instead

    Scalable Video Coding, access to encoded data, and enhanced connection experience in restricted networks are released in beta.
    See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-14]

    **Shorter time to join channel**

    As of v4.18.0, the SDK enables WebSocket message compression by default, reducing the time to join a channel in poor network conditions.

    **Other improvements**

    v4.18.0 also includes the following improvements:

    * Improves the retry mechanism by adding a 3s retry rule to switch a downgraded video resolution to a higher one. This prevents the video resolution from remaining low when the network conditions improve, resulting in a better user experience.
    * Upgrades the Cloud Proxy service to enhance its stability in different network environments.

    #### API changes [#api-changes-8]

    **Added**

    * `setProxyServer`
    * `setAudioBufferPlaybackSpeed` method and `playbackSpeed` property to `IBufferSourceAudioTrack`
    * The following methods inherited from the `EventEmitter` class to the `IAgoraRTC` class:
      * `on`
      * `off`
      * `once`
      * `getListeners`
      * `removeAllListeners`

    <CalloutContainer type="info">
      <CalloutDescription>
        These methods support the following event names as parameters:

        * `"camera-changed"`
        * `"microphone-changed"`
        * `"playback-device-changed"`
        * `"autoplay-failed"`
        * `"security-policy-violation"`
      </CalloutDescription>
    </CalloutContainer>

    #### Issues fixed [#issues-fixed-11]

    v4.18.0 fixes the following issues:

    * Mobile devices experienced delays in receiving notifications for the [broadcaster leave channel event](/en/realtime-media/video/build/optimize-and-operate/receive-notifications#104-broadcaster-leave-channel).
    * Users experienced a black screen while watching video streams encoded with H.264 in older browser versions.
    * Memory usage increased when using the SDK with the Virtual Background or Image Enhancer extension.
    * The SDK continued to use the expired token during reconnection attempts after generating a new token using the `renewToken` method.

    ### v4.17.2 [#v4172]

    v4.17.2 was released on April 20, 2023.

    #### Issues fixed [#issues-fixed-12]

    This release fixes the issue where the `getCurrentFrameData` method returned abnormal data.

    ### v4.17.1 [#v4171]

    v4.17.1 was released on April 19, 2023.

    #### Compatibility changes [#compatibility-changes-5]

    <CalloutContainer type="info">
      <CalloutDescription>
        Chrome 107 prevents users from sharing the current tab by default. If you need to allow users to share the current tab on Chrome 107 and later versions, please upgrade your SDK to v4.17.1 or later as soon as possible.
      </CalloutDescription>
    </CalloutContainer>

    To accommodate changes related to screen sharing in Chrome 107 (refer to [Chrome documentation](https://developer.chrome.com/docs/web-platform/screen-sharing-controls/)), this release introduces the following changes to the `config` parameter in the `createScreenVideoTrack` method:

    * Deprecates the `screenSourceType` property. If you are using this property, replace it with the newly added `displaySurface` property after upgrading to this version.
    * Adds new properties: `selfBrowserSurface`, `surfaceSwitching`, and `systemAudio`.

    For detailed explanations of these properties, see [ScreenVideoTrackInitConfig](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/screenvideotrackinitconfig.html) in the API reference.

    #### Improvements [#improvements-15]

    **Improved flexibility in setting video profiles**

    This release improves the flexibility in setting video profiles for different types of video tracks:

    * You can now specify the resolution and the frame rate when calling `createCustomVideoTrack` to create a custom video track, by passing in values for the `width`, `height`, and `frameRate` parameters.
    * After creating a screen track or a custom video track, you can dynamically adjust the video profile using `LocalVideoTrack.setEncoderConfiguration`. Please note that there is a known issue with calling this method on a screen track in certain versions of macOS Safari. [See issue details](/en/realtime-media/video/reference/common-problems).

    For details, see more about [Configure video encoding](/en/realtime-media/video/build/manage-connection-and-quality/optimize-multihost-video).

    **Other improvements**

    This release also includes the following improvements:

    * The time required to create tracks using `createMicrophoneAudioTrack` or `createMicrophoneAndCameraTracks` on Safari browsers is reduced.

    * When you have two `AgoraRTCClient` objects created locally, you have the option to block certain callbacks from one `AgoraRTCClient` to another. These callbacks include those triggered when joining or leaving a channel, and publishing or unpublishing streams. For example, if you are using Client A for publishing a screen track and Client B for publishing a camera track, and you enable this feature to block callbacks, Client A and B will not receive the following callbacks from each other:

      * `AgoraRTCClient.on("user-published")`
      * `AgoraRTCClient.on("user-joined")`
      * `AgoraRTCClient.on("user-unpublished")`
      * `AgoraRTCClient.on("user-left")`
      * `AgoraRTCClient.on("published-user-list")`
      * `AgoraRTCClient.on("user-info-update")`

    To enable this feature, contact technical support.

    #### API changes [#api-changes-9]

    **Added**

    * `displaySurface` (replacement for `screenSourceType`), `selfBrowserSurface`, `surfaceSwitching`, and `systemAudio` in the `ScreenVideoTrackInitConfig` interface
    * `width`, `height`, and `frameRate` in the `createCustomVideoTrack` method
    * `LocalVideoTrack.setEncoderConfiguration`

    **Deleted**

    * `ILocalVideoTrack.setBeautyEffect`

    ### v4.17.0 [#v4170]

    v4.17.0 was released on March 22, 2023.

    #### New features [#new-features-12]

    **Dynamic switching of local video streams**

    This release adds the `ILocalVideoTrack.replaceTrack` method to increase the flexibility to switch local video tracks.

    For example, to switch from one camera to another before v4.17.0, you needed to call `IAgoraRTCClient.unpublish` to
    unpublish the current track and then call `IAgoraRTCClient.publish` to publish a new track.
    As of v4.17.0, you can call `ILocalVideoTrack.replaceTrack` directly.

    #### Improvements [#improvements-16]

    **Optimized reconnection mechanism**

    As of v4.17.0, the SDK defaults to showing the last video frame before disconnection during reconnection,
    which prevents a black screen during the reconnection process. This optimization is not available on Safari due to Safari's limitations.

    **Other improvements**

    This release also includes the following improvements:

    * The accuracy of SDK-related quality metrics on [Analytics](/en/realtime-media/agora-analytics/product-overview) is improved.
    * The time required to join a channel is reduced. This optimization is not available on Firefox due to Firefox's limitations.

    #### API changes [#api-changes-10]

    **Added**

    * `ILocalVideoTrack.replaceTrack`

    **Deleted**

    * `ILocalVideoTrack.setBeautyEffect`

    #### Issues fixed [#issues-fixed-13]

    On Safari on iOS 14.7 and later, performing subscribing and unsubscribing operations repeatedly to multiple audio streams could result in not hearing remote users.

    ### v4.16.1 [#v4161]

    Video Calling v4.16.1 was released on February 7, 2023.

    #### Issues fixed [#issues-fixed-14]

    This release fixes the following issue:

    * When using Video SDK for Web v4.16.0, the video freeze rate showed in Agora Analytics is much higher than the correct value.

    ### v4.16.0 [#v4160]

    Video Calling v4.16.0 was released on January 5, 2023.

    #### Improvements [#improvements-17]

    This release adds the following enhancements:

    **Compatibility for deprecated RTCMediaStreamTrackStats on Chrome**

    Chrome plans to deprecate the stats dictionary `RTCMediaStreamTrackStats`.
    See the service announcement on [discuss-webrtc@googlegrooups.com](https://groups.google.com/g/discuss-webrtc/c/9c8ZjberEcI).
    This change affects the following media track statistics returned by the SDK:

    | Statistics              | Affected fields                                                                                                            |
    | :---------------------- | :------------------------------------------------------------------------------------------------------------------------- |
    | `LocalVideoTrackStats`  | `sendFrameRate`<br />`sendResolutionHeight`<br />`sendResolutionWidth`                                                     |
    | `RemoteVideoTrackStats` | `receiveFrameRate`<br />`receiveResolutionHeight`<br />`receiveResolutionWidth`<br />`renderFrameRate`<br />`receiveDelay` |
    | `RemoteAudioTrackStats` | `receiveDelay`<br />`receiveLevel`                                                                                         |

    To ensure the accuracy of these media track statistics on Chrome, please upgrade the SDK to v4.16.0 or later as soon as possible.

    **Other improvements**

    This version of the SDK also includes the following improvements:

    * The cause of the [`HTMLMediaElement` error event](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error_event)
      is now recorded in the log.
    * The size of the SDK package is reduced.

    #### Issues fixed [#issues-fixed-15]

    This release fixes the following issues:

    * Media operations failed when the SDK was attempting to reconnect to the network.
    * When relaying media streams across channels, [`ChannelMediaRelayConfiguration.addDestChannelInfo`](https://api-ref.agora.io/en/voice-sdk/web/4.x/interfaces/ichannelmediarelayconfiguration.html#adddestchannelinfo)
      could not set `uid` to `0` to identify the relay stream in the destination channel.
    * Some known issues on iOS 14.x.

    ### v4.15.1 [#v4151]

    v4.15.1 was released on December 2, 2022.

    #### Issues fixed [#issues-fixed-16]

    This release fixes the following issue:

    * No audio was received on iOS 13.7.

    ### v4.15.0 [#v4150]

    v4.15.0 was released on October 31, 2022.

    #### New features [#new-features-13]

    The latest features in this release are:

    ##### Audio stream filter (Beta) [#audio-stream-filter-beta]

    v4.15.0 introduces filtering audio streams based on volume. Once this function is enabled, Agora backend ranks all subscribed audio streams by volume. By default, the three audio streams with the highest volume are transported to others in the channel. To change the number of audio streams to be transported, contact [support@agora.io](mailto\:support@agora.io).

    Agora enables channel hosts to control whether the audio streams being published are filtered based on volume. Streams that are not filtered bypass this filter mechanism and are transported directly to the receivers. In use-cases with a large number of publishers, enabling this function helps reduce the bandwidth and device system pressure for the receivers.

    To enable this function, contact [support@agora.io](mailto\:support@agora.io).

    ##### VP9 codec [#vp9-codec]

    Video SDK for Web v4.15.0 adds support for the VP9 codec in the following browsers:

    |         | Supported browsers<sup>①</sup>                                                                                     |
    | ------- | ------------------------------------------------------------------------------------------------------------------ |
    | Desktop | Chrome 65 or later<br />Firefox 69 or later<br />Edge 79 or later<br />Safari 16 or later                          |
    | Android | Chrome 68 or later<br />Wechat v8.0.6 or later<br />Other apps that use WKWebView: WebView v65.0.3325.109 or later |
    | iOS     | Safari 16 or later                                                                                                 |

    <CalloutContainer type="info">
      <CalloutDescription>
        ① To ensure the best user experience, best practice is to use the latest version of the browsers listed above.
      </CalloutDescription>
    </CalloutContainer>

    To start a call using the VP9 codec, apps you connect to built using for Android, iOS, Windows, or macOS must use Video SDK v4.0.1 or greater.

    ##### CSP violation callback [#csp-violation-callback]

    v4.15.0 adds the `AgoraRTC.onSecurityPolicyViolation` callback. When Agora fails to load a resource or send a request due to Content Security Policy(CSP) violations, the Video SDK triggers this callback. When you receive this callback, modify your CSP configuration to ensure that you can access Agora-related services.

    #### Improvements [#improvements-18]

    The SDK has the following improvements:

    * The accuracy of network quality reported by `AgoraRTCClient.on("network-quality")` in certain use-cases has increased.
    * Resumption of audio or video streams when the user switches between Wi-Fi networks is faster.

    #### API changes [#api-changes-11]

    **Added**

    * `IAgoraRTC.onSecurityPolicyViolation`

    #### Compatibility changes [#compatibility-changes-6]

    Cloud Proxy default mode has changed. In Video SDK for Web v4.15.0, the `mode` parameter in `startProxyServer` defaults to `3`. This represents the Force UDP cloud proxy mode. In this mode, Video SDK always transmits data over UDP. For details, see [Restricted network connection with Cloud Proxy](/en/realtime-media/video/build/manage-connection-and-quality/cloud-proxy).

    ### v4.14.2 [#v4142]

    v4.14.2 was released on October 27, 2022.

    #### Issues fixed [#issues-fixed-17]

    This release fixes the following issue:

    * When using WeChat browsers on iOS 14.x, no audio is received from the first channel the user subscribes to.

    ### v4.14.1 [#v4141]

    v4.14.1 was released on October 24, 2022.

    #### Issues fixed [#issues-fixed-18]

    This release fixes the following issues:

    * On Electron v17.x, screen sharing did not work properly. To solve this issue, add the following code in the main process:
      ```javascript
      const {  ipcMain, desktopCapturer } = require("electron");

      ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) => desktopCapturer.getSources(opts));
      ```
    * On desktop Safari, if autoplay was blocked for all videos, they kept trying to replay resulting in video freeze.
    * On mobile browsers, the video freeze rate calculated by the SDK was higher than the actual value when the browser was running in the background.
    * In Android WebView, the default poster (a gray play button) of the video element showed before video playback.
    * Media stream relay failed after the SDK resumed connection to the network.
    * During a media stream relay, the SDK continued to send heartbeats after the user left the source channel.

    ### v4.14.0 [#v4140]

    v4.14.0 was released on August 31, 2022.

    #### Compatibility changes [#compatibility-changes-7]

    **getVolumeLevel accuracy improvement**

    As of v4.14.0, the SDK calibrates the calculation of the volume returned in  `getVolumeLevel`. The volume range is still \[0,1], where 1 represents the highest audio level. If your business use-case depends on the volume returned in `getVolumeLevel`  (for example, a speaker icon shows according to the volume), ensure that you check the returned volume after upgrading to v4.14.0.

    #### Issues fixed [#issues-fixed-19]

    This release fixes the following issue:

    * The received Opus stereo audio had no stereo effect.
    * On versions earlier than Chrome 76, the `decodeFrameRate` returned by the `getRemoteVideoStats` method was 0.
    * On WeChat browsers running on iOS 14.1 and 14.2, the first subscribed audio stream was silent.
    * After calling `LocalVideoTrack.setBeautyEffect` to enable image enhancement, calling `LocalVideoTrack.unpipe` caused an error.
    * On Windows Chrome 103 and later versions, enabling the dual-stream mode did not take effect in certain use-cases.

    ### v4.13.0 [#v4130]

    v4.13.0 was released on July 25, 2022.

    #### New features [#new-features-14]

    **Adding support for media processing extensions**

    As of v4.13.0, the SDK supports using media processing extensions on remote audio and video tracks (extension support for local audio and video tracks was added in [v4.10.0](#410)).

    Currently, Agora provides the following extension for remote audio tracks:

    | Extension                      | Description                                                                                                                                                                    | Documentation                                                          |
    | :----------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- |
    | Spatial Audio Extension (Beta) | Enables a real-time audio blurring or air absorption effect for a user's audio based on the user's position relative to other users, which makes conversations more immersive. | Contact [support@agora.io](mailto\:support@agora.io) for full details. |

    #### Improvements [#improvements-19]

    **AI Noise Suppression and virtual background**

    The AI Noise Suppression extension and virtual background extension are converted from beta release to official release. To experience the AI Noise Suppression or virtual background extension, contact [support@agora.io](mailto\:support@agora.io).

    **Callback for token expiration**

    v4.13.0 improved the logic of triggering the callback for token expiration. If a token expires when the user's device is in sleep mode or disconnected from network, the SDK triggers the `token-privilege-did-expire` event when the device resumes operation and attempts to reconnect to the SDK.

    #### API changes [#api-changes-12]

    **Added**

    * `RemoteAudioTrack.pipe`

    * `RemoteAudioTrack.unpipe`

    * `RemoteVideoTrack.pipe`

    * `RemoteVideoTrack.unpipe`

    ### v4.12.2 [#v4122]

    v4.12.2 was released on July 7, 2022. This release improved the automatic mode for SDK connectivity (In this mode, the SDK first attempts a direct connection to Agora backend; if the attempt fails, the SDK automatically switches to TCP/TLS 443).

    ### v4.12.1 [#v4121]

    v4.12.1 was released on June 27, 2022. This release fixed the following issues:

    * Subscribing to remote streams occasionally failed after disconnection.

    * On Firefox, performing subscribing and unsubscribing operations repeatedly to multiple video streams occasionally caused video freezing.

    ### v4.12.0 [#v4120]

    v4.12.0 was released on June 15, 2022.

    #### Improvements [#improvements-20]

    **Media processing extensions**

    Media processing extensions have the following changes:

    * The [Image Enhancement Extension (Beta)](https://www.npmjs.com/package/agora-extension-beauty-effect) is released. This extension incorporates and upgrades the built-in image enhancement feature (enabled by [setBeautyEffect](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/ilocalvideotrack.html#setbeautyeffect))) of the Agora Web SDK 4.x. You can adjust parameters including the contrast, brightness, and smoothness levels, in order to touch up the image for effects such as skin lightening and skin smoothing. For details, see [Use the Image Enhancement Extension](/en/realtime-media/video/build/apply-video-effects/beauty-effect).

    * The [Virtual Background Extension (Beta)](https://www.npmjs.com/package/agora-extension-virtual-background) supports animated virtual backgrounds as of v1.0.0-beta-3. You can set a user's background as a short video. For details, see [Use the Virtual Background Extension](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    #### Issues fixed [#issues-fixed-20]

    v4.12.0 fixed the issue that when dual-stream mode was enabled on Safari, calling methods such as `Track.setEnabled(false)` and `Track.close()` could not turn off the camera indicator light.

    ### v4.11.1 [#v4111]

    v4.11.1 was released on May 9, 2022. This release fixed the following issues:

    * Subscribing to audio streams might cause no sound on Firefox.
    * Compatibility issues occurred in Safari on iOS 12 and in the WeChat built-in browser on iOS 13.

    ### v4.11.0 [#v4110]

    v4.11.0 was released on April 1, 2022.

    #### Compatibility changes [#compatibility-changes-8]

    As of v4.11.0, the SDK adopts an automatic mode by default to ensure connectivity. In this mode, the SDK first attempts a direct connection to Agora backend; if the attempt fails, the SDK automatically switches to TCP/TLS 443. You can listen for such auto-switch events through `client.on("join-fallback-to-proxy")`.

    #### Improvements [#improvements-21]

    **Channel capacity improvement**

    As of v4.11.0, a single channel can support up to 128 concurrent online hosts, who can publish media streams at the same time. The number of audience members in a channel is unlimited. Each host or audience member can subscribe to a maximum of 50 hosts at the same time.

    To experience this improvement, contact [support@agora.io](mailto\:support@agora.io).

    #### Fixed issues [#fixed-issues-1]

    v4.11.0 fixed the following issues:

    * Angular’s dependency zone.js caused an error when `Promise.finally` was called in the SDK.

    * On Chrome, AEC could not be enabled when sending stereo sound.

    * On Chrome 100, the SDK reported inaccurate statistics for the decoding frame rate and sending frame rate.

    * When dual-stream mode was enabled, calling `unpublish` without parameters caused the method call to fail.

    ### v4.10.2 [#v4102]

    v4.10.2 was released on March 24, 2022. This release fixed the issue that calling `join` in certain use-cases might cause proxy exceptions.

    ### v4.10.1 [#v4101]

    v4.10.1 was released on March 17, 2022 and added the dependency of TypeScript type definitions for Agora Extension `agora-rte-extension` in `package.json`. If you use TypeScript for type checking, Agora suggests that you update TypeScript to v4.3.2 or later.

    ### v4.10.0 [#v4100]

    v4.10.0 was released on March 11, 2022.

    #### New features [#new-features-15]

    **Adding support for media processing extensions**

    v4.10.0 supports using media processing extensions in the Video Calling. The following extensions are currently free to use during the beta period. For guidance on how to integrate and use the extensions, refer to the documentation listed in the following table:

    | Extension                             | Description                                                                                                       | Documentation                                                                                                        |
    | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
    | Virtual Background Extension (Beta)   | Enables users to replace their actual background with a solid color or custom image, or to blur their background. | [Use the Virtual Background Extension (Beta)](/en/realtime-media/video/build/apply-video-effects/virtual-background) |
    | AI Noise Suppression Extension (Beta) | Reduces many types of sudden noise and reduces vocal distortion when multiple people speak at the same time.      | [AI Noise Suppression](/en/realtime-media/video/build/enhance-the-audio-experience/ai-noise-suppression)             |

    #### API changes [#api-changes-13]

    **Added**

    * `AgoraRTC.registerExtensions`

    * `LocalTrack.pipe`

    * `LocalTrack.unpipe`

    * `LocalTrack.processorDestination`

    ### v4.9.4 [#v494]

    v4.9.4 was released on March 16, 2022 and fixed the failure to access localStorage when loading the SDK in an iFrame in Chrome Incognito mode.

    ### v4.9.3 [#v493]

    v4.9.3 was released on March 3, 2022. This release fixed several internal issues.

    ### v4.9.1 [#v491]

    v4.9.1 was released on February 24, 2022. This release fixed several internal issues.

    ### v4.9.0 [#v490]

    v4.9.0 was released on February 17, 2022.

    #### New features [#new-features-16]

    **Setting the video stream type of all remote users**

    v4.9.0 adds the [`setRemoteDefaultVideoStreamType`](https://api-ref.agora.io/en/video-sdk/web/4.x/interfaces/iagorartcclient.html#setremotevideostreamtype) method. After you call `enableDualStream` to enable dual-stream mode on the senders' clients, `setRemoteDefaultVideoStreamType` enables receivers to choose whether to receive the high-quality or low-quality stream of all remote users.

    **Cloud Proxy Force TCP mode**

    v4.9.0 adds Force TCP mode for the Agora Cloud Proxy service. In this mode, the SDK always transmits data over TLS 443. To use this mode, set `mode` as 5 when calling `startProxyServer`.

    **Checking the visibility of the `<video>` HTML tag**

    After you call `play`, the SDK creates an `<video>` HTML tag for playing video tracks. v4.8.0 adds the following methods and events for checking the visibility of the `<video>` tag:

    * `localVideoTrack.on("video-element-visible-status")`
    * `remoteVideoTrack.on("video-element-visible-status")`
    * `localVideoTrack.getVideoElementVisibleStatus`
    * `remoteVideoTrack.getVideoElementVisibleStatus`

    When `localTrack.isPlaying` or `remoteTrack.isPlaying` is `true` but you cannot see any video, the above methods or events can help you check whether the `<video>` tag is visible or not and learn the reason when the `<video>` tag is invisible.

    #### Improvements [#improvements-22]

    * Improves the accuracy of the `client.on("is-using-cloud-proxy")` event.

    * If you set the video resolution but do not set the bitrate, the SDK now can automatically calculate and set a reasonable bitrate according to the resolution and frame rate. This improvement helps to avoid bandwidth overload due to a high bitrate.

    #### Issues fixed [#issues-fixed-21]

    v4.9.0 fixed the following issues:

    * When you call `play` to play a local video track and pass in a DOM element from another window, the SDK reported an error.

    * When using v4.8.0 together with Angular and zone.js, users might fail to join a channel because zone.js modified the promise object.

    * Several known issues on iOS.

    #### API changes [#api-changes-14]

    **Added**

    * `setRemoteDefaultVideoStreamType`

    * `localVideoTrack.on("video-element-visible-status")`

    * `remoteVideoTrack.on("video-element-visible-status")`

    * `localVideoTrack.getVideoElementVisibleStatus`

    * `remoteVideoTrack.getVideoElementVisibleStatus`

    * `client.on("join-fallback-to-proxy")`

    ### v4.8.2 [#v482]

    v4.8.2 was released on January 27, 2022. This release fixed the issue that on iOS WeChat, the video playback might go black after being interrupted by a screen lock.

    ### v4.8.1 [#v481]

    v4.8.1 was released on January 6, 2022. This release fixed an internal issue.

    ### v4.8.0 [#v480]

    v4.8.0 was released on December 29, 2021.

    #### New features [#new-features-17]

    **Checking the visibility of the \<video> HTML tag**

    After you call `play`, the SDK creates an `<video>` HTML tag for playing video tracks. v4.8.0 adds the following methods and events for checking the visibility of the `<video>` tag:

    * `localVideoTrack.on("video-element-visible-status")`

    * `remoteVideoTrack.on("video-element-visible-status")`

    * `localVideoTrack.getVideoElementVisibleStatus`

    * `remoteVideoTrack.getVideoElementVisibleStatus`

    When `localTrack.isPlaying` or `remoteTrack.isPlaying` is `true` but you cannot see any video, the above methods or events can help you check whether the `<video>` tag is visible or not and learn the reason when the `<video>` tag is invisible.

    #### Improvements [#improvements-23]

    v4.8.0 made some internal improvements.

    #### Issues fixed [#issues-fixed-22]

    v4.8.0 fixed the following issues:

    * When receiving streams on iOS Safari as an audience member, the host’s voice could be heard, but the volume returned by the `client.on("volume-indicator")` event was 0.

    * When sending streams on iOS Safari, if you first call `setDevice` and then `setEncoderConfiguration`, the SDK returns an error.

    #### API changes [#api-changes-15]

    **Added**

    * `localVideoTrack.on("video-element-visible-status")`

    * `remoteVideoTrack.on("video-element-visible-status")`

    * `localVideoTrack.getVideoElementVisibleStatus`

    * `remoteVideoTrack.getVideoElementVisibleStatus`

    ### v4.7.3 [#v473]

    v4.7.3 was released on November 17, 2021. This release avoided the issue that on the Safari browser in iOS 15.1, after a call was interrupted, the Video Calling failed to resume playing the remote media.

    ### v4.7.2 [#v472]

    v4.7.2 was released on October 14, 2021, with the following changes:

    * Avoided the [issue](https://bugs.webkit.org/show_bug.cgi?id=230537) that on the Safari browser in iOS 15, after a call was interrupted by a phone call, the Video Calling might fail to resume sending the local media and playing the remote media.

    * Avoided the [black screen issue](https://bugs.webkit.org/show_bug.cgi?id=230532) that might occur when using `videoTrack.play(element, {mirror: true})` to play the video on the desktop or mobile Safari 15 browser.

    * Fixed the issue that calling `AgoraRTC.checkSystemRequirements()` on the Edge browser only returned `false`.

    ### v4.7.1 [#v471]

    v4.7.1 was released on September 13, 2021. This release fixed some issues on Safari 11 and iPad Chrome.

    ### v4.7.0 [#v470]

    v4.7.0 was released on September 1, 2021.

    #### Compatibility changes [#compatibility-changes-9]

    As of v4.7.0, if you enable media stream encryption, the SDK automatically disables encryption and resets the encryption configurations after a user leaves the channel. To re-enable the encryption, call `setEncryptionConfig` before the user joins the channel again.

    #### Improvements [#improvements-24]

    This release makes the following improvements:

    * Optimizes the end-user experience of the Video Calling on the mobile browser.

    * Improves the accuracy of the volume obtained by `getVolumeLevel`.

    * Adds the support of enabling dual-stream mode on Safari.

    #### Issues fixed [#issues-fixed-23]

    This release fixed the following issues:

    * After calling `LocalAudioTrack.setVolume` to adjust the local volume, the local user could not perceive the volume change.

    * When the log level was set to none, the SDK nevertheless output the initialization logs.

    * The promise returned by `LocalAudioTrack.setDevice` could get stuck in a pending state.

    ### v4.6.3 [#v463]

    v4.6.3 was released on August 10, 2021. This release fixed an occasional issue: After the user closes a tab or browser on the local client, the remote client does not receive the `user-left` event immediately.

    ### v4.6.2 [#v462]

    v4.6.2 was released on July 30, 2021. This release fixed the issue that the SDK did not destroy all the media players created during a call or live streaming. Chrome 92 introduced a limit on the number of media players that can be created in a particular tab: 75 for the desktop. After you play tracks several times, the undestroyed media players in the SDK might cause the playback failure in the tab.

    ### v4.6.1 [#v461]

    v4.6.1 was released on July 21, 2021. This release fixed an internal error.

    ### v4.6.0 [#v460]

    v4.6.0 was released on July 16, 2021.

    #### New features [#new-features-18]

    **Interactive Live Streaming Standard**

    As of v4.6.0, the Video Calling supports Interactive Live Streaming Standard. The major difference between Agora Interactive Live Streaming Standard and Agora Live Interactive Streaming Premium is the latency level on the audience’s client:

    * Interactive Live Streaming Premium: Ultra-low latency (400 ms to 800 ms) from the host’s client to an audience member’s client.

    * Interactive Live Streaming Standard: Low latency (1500 ms to 2000 ms) from the host’s client to an audience member’s client.

    The charges for Standard and Premium are different. For details, see the [product overview](/en/realtime-media/video/) and [pricing](/en/realtime-media/video/reference/pricing) of Interactive Live Streaming Standard.

    You can set the latency level of the audience role in the following two ways:

    * When calling `createClient` to create a client object, set the `role` parameter as `"audience"` and the `level` parameter in `clientRoleOptions` as `1`.

    * When calling the `setClientRole` method, set the `role` parameter as `"audience"` and the level parameter in `clientRoleOptions` as `1`.

    **The mute states of local tracks**

    v4.6.0 adds the `localTrack.setMuted` method to stop sending the media data of local tracks. The differences between this method and `localTrack.setEnabled` are as follows:

    * After the method call of `localVideoTrack.setEnabled(false)` to stop sending video, the SDK also immediately turns off the camera light and stops video capture, while `localVideoTrack.setMuted` does not stop video capture.

    * Calling `setEnabled(true)` takes longer to resume sending the media data than by than calling `setMuted(false)`.

    #### Improvements [#improvements-25]

    **Dealing with autoplay blocking**

    To deal with the autoplay blocking of video on iOS, v4.6.0 deprecates the `onAudioAutoplayFailed` callback, and adds the `onAutoplayFailed` callback instead to indicate an audio or video autoplay failure.

    On most web browsers, inaudible media are not affected by autoplay blocking. However, on iOS Safari with low power mode enabled, or on other iOS in-app browsers that implement a custom autoplay policy, such as the WeChat browser, the autoplay of inaudible media is blocked.

    #### Issues fixed [#issues-fixed-24]

    v4.6.0 fixes the following issues:

    * The method call of `localAudioTrack.setVolume` did not take effect immediately.

    * Using multiple clients on one web page caused unexpected issues.

    * The SDK did not check whether the App ID was a string of 1 to 256 bytes in size.

    #### API changes [#api-changes-16]

    **Added**

    * `localTrack.setMuted`

    * `onAutoplayFailed`

    * `clientRoleOptions` in `ClientConfig`

    * `options` in the `setClientRole` method

    **Deprecated**

    * `onAudioAutoplayFailed`

    ### v4.5.0 [#v450]

    v4.5.0 was released on May 25, 2021.

    #### New features [#new-features-19]

    **AEC (Acoustic Echo Canceller) for the audio played on the local client**

    In a use-case where multiple users play a media file at the same time, such as watching a movie together, if the user A plays the media file through [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement) on Chrome with a speaker, the SDK captures the audio played by a speaker together with the voice of the user A. The other users can hear the audio sent by the user A and the audio played locally, which sounds like an echo. To deal with this echo issue, v4.5.0 adds the `processExternalMediaAEC` method. You can call `processExternalMediaAEC` and pass in the `HTMLMediaElement` to enable the AEC for the audio played on the local client.

    #### Improvements [#improvements-26]

    **Channel encryption**

    To strengthen the security of the key, v4.5.0 adds two encryption modes, `"aes-128-gcm2"` and `"aes-256-gcm2"`, which use the PBKDF2 (Password-Based Key Derivation Function 2). When calling `setEncryptionConfig` and setting the encryption mode as `"aes-128-gcm2"` or `"aes-256-gcm2"`, you need to set `secret` and `salt`. For how to generate and set `secret` and `salt`, see [Secure channel encryption](/en/realtime-media/video/build/secure-and-protect-channels/media-stream-encryption).

    **Restrict media zones**

    As of v4.5.0, when calling `setArea` to specify the media zone for connection, you can use the `areaCode` parameter to specify a large zone and use the `excludedArea` parameter to specify a small zone. The region for connection is the large zone excluding the small zone. You can only specify the large zone as `"GLOBAL"`. For details, see [Restrict media zones](/en/realtime-media/video/build/manage-connection-and-quality/geofencing).

    **The preset video encoder configurations for screen sharing**

    v4.5.0 adds the following preset video encoder configurations for screen sharing in ScreenEncoderConfigurationPreset:

    * `"480p_3"`: The resolution is 640 × 480 and the frame rate is 15 fps.

    * `"720p_3"`: The resolution is 1280 × 720 and the frame rate is 15 fps.

    * `"1080p_3`": The resolution is 1920 × 1080 and the frame rate is 15 fps.

    #### Issues fixed [#issues-fixed-25]

    v4.5.0 fixes the following issues:

    * The `OptimizationMode` setting did not take effect.

    * On iOS, when the Video Calling captures media, noises might occur on the local client.

    * On Firefox, after the stream transmitted by the SDK switched from high quality to low quality, the video resolution obtained by the `getRemoteVideoStats` method was still the resolution of the high-quality stream.

    * On Chrome, after you called `remoteAudioTrack.setVolume` to adjust the volume, if the playback was paused and then resumed, the volume changed back to the original one.

    * On Chrome, the `LocalAudioTrack.setVolume` method did not take effect.

    #### API changes [#api-changes-17]

    **Added**

    * `processExternalMediaAEC`

    * `clientRoleOptions` in `ClientConfig`

    * `options` in the `setClientRole` method

    * `salt` in the `setEncryptionConfig` method

    * `"aes-128-gcm"` and `"aes-256-gcm"` in `EncryptionMode`

    * `excludedArea` in the `setArea` method

    ### v4.4.0 [#v440]

    v4.4.0 was released on April 2, 2021.

    #### Compatibility changes [#compatibility-changes-10]

    **Firewall domain whitelist**

    As of v4.4.0, the destination domains required for your firewall whitelist changes to:

    .agora.io
    .edge.agora.io
    .sd-rtn.com
    .edge.sd-rtn.com

    If you upgrade the SDK to v4.4.0, update your firewall domain whitelist to ensure you can use Agora products in environments with restricted network access.

    #### Improvements [#improvements-27]

    **AES-GCM encryption mode**

    In use-cases requiring high security, to ensure the confidentiality, integrity and authenticity of data, and to improve the computational efficiency of data encryption, v4.4.0 adds the following encryption modes in `EncryptionMode`:

    * `"aes-128-xts"`: 128-bit AES encryption, GCM mode.

    * `"aes-256-gcm"`: 256-bit AES encryption, GCM mode.

    Once you enable the built-in encryption, all users in the same channel must use the same encryption mode and key, including the server-side users, such as the Agora recording service.

    **Cloud proxy**

    v4.4.0 adds the `client.on("is-using-cloud-proxy")` event. The SDK triggers this event after the local client successfully publishes a media stream to indicate whether the media stream is forwarded by the [Cloud proxy service](/en/realtime-media/video/build/manage-connection-and-quality/cloud-proxy).

    **Error code**

    If you start media capturing after disabling the media capture device on Windows, the error thrown by the SDK changes from `UNEXPECTED_ERROR` to `NOT_READABLE`.

    #### Issues fixed [#issues-fixed-26]

    v4.4.0 fixes the following issues:

    * The SDK did not trigger the `"first-frame-decoded"` event for a remote audio track.

    * The return value of `AgoraRTC.checkSystemRequirement` was inaccurate.

    * When the network had multiple IP addresses, the cloud proxy service did not take effect.

    #### API changes [#api-changes-18]

    **Added**

    * `client.on("is-using-cloud-proxy")`

    * `"aes-128-gcm"` and `"aes-256-gcm"` in `EncryptionMode`

    ### v4.3.0 [#v430]

    v4.3.0 was released on January 26, 2021.

    #### New features [#new-features-20]

    **Cloud proxy**

    This release optimizes the Agora cloud proxy architecture and enhances the connectivity of the Video Calling in environments with restricted network access. The optimized Agora cloud proxy service also supports regional connection.

    You can contact (mailto:support\@agora.io) to apply for using the optimized Agora cloud proxy service and set the `mode` parameter as `3` when calling `startProxyServer`. For details, see [Cloud proxy service](/en/realtime-media/video/build/manage-connection-and-quality/cloud-proxy).

    ### v4.2.1 [#v421]

    v4.2.1 was released on December 23, 2020. This release fixed the incorrect error that the SDK throws when you pass an illegal parameter in the client.publish method.

    ### v4.2.0 [#v420]

    v4.2.0 was released on December 1, 2020.

    #### New features [#new-features-21]

    **Regional connection**

    This release adds the `AgoraRTC.setArea` method for specifying the region for connection. After specifying the region, the SDK connects to the Agora servers within that region. The following regions are supported:

    * China

    * North America

    * Europe

    * Asia, excluding Mainland China

    * Japan

    * India

    * Global

    This advanced feature applies to use-cases that have regional restrictions.

    **Video transmission optimization strategy**

    This release adds the `localVideoTrack.setOptimizationMode` method for setting the video transmission optimization mode:

    * `"balanced"`: Uses the default transmission optimization strategy.

    * `"detail"`: Prioritizes clarity.

    * `"motion"`: Prioritizes smoothness.

    See the API reference for the introduction to each transmission optimization mode. This method applies to use-cases where you need to dynamically adjust the optimization mode during a video call, live streaming, or screen sharing. For example, during the screen sharing, before you change the shared content from slides to a video, you can change the optimization mode from `"detail"` to `"motion"` to ensure smoothness in poor network conditions.

    **Network quality of remote users**

    This release adds the `AgoraRTCClient.getRemoteNetworkQuality` method for getting the uplink and downlink network quality of all the remote users to whom the local user subscribes.

    **Cloud proxy**

    This release changes the `mode` parameter of the `AgoraRTCClient.startProxyServer` method from `boolean` to `number`.

    #### Improvements [#improvements-28]

    * After disabling an audio or video tracks by calling `setEnabled`, you can still call `setDevice` to switch devices.

    * After you call `AgoraRTCClient.setEncryptionConfig` to enable the built-in encryption, when the user uses a weak secret, the SDK outputs a warning message to the Web Console and prompts the user to use a strong secret. A strong secret must contain at least eight characters and be a combination of uppercase and lowercase letters, numbers, and special characters.

    #### Issues fixed [#issues-fixed-27]

    * When you disabled a local video track, you could not publish another video track.

    * After enabling dual-stream mode, if you called `setEnabled(false)` to disable a video track during the process of publishing, the publishing failed and could not be recovered.

    * After an audience member tried to publish a local track in live mode but failed, the audience member could not publish this track even after switching the role to host.

    * After dual-stream mode was enabled, a bug during the disconnection would occasionally cause publishing to fail after reconnection.

    * After unpublishing a local camera video track and then publishing a screen-sharing track, the video bitrate was fixed at around 700 Kbps, and the resolution and frame rate dropped.

    * Due to Safari’s limited support for WebAudio, the audio of `BufferSourceAudioTrack` could be distorted.

    * When the SDK gained device permission for the first time, it did not trigger the media device change events (`onMicrophoneChanged`, `onCameraChanged`, or `onPlaybackDeviceChanged`). The SDK only triggered these events for a subsequent device change.

    #### API changes [#api-changes-19]

    **Added**

    * `AgoraRTC.setArea`

    * `localVideoTrack.setOptimizationMode`

    * `AgoraRTCClient.getRemoteNetworkQuality`

    **Changed**

    * Changed the type of the `mode` parameter in `AgoraRTCClient.startProxyServer` from `boolean` to `number`

    ### v4.1.1 [#v411]

    v4.1.1 was released on October 27, 2020. This release fixed the following issues:

    * Improved the accuracy of the `event_network_quality` event.

    * The method call of `createCameraVideoTrack` did not stop on Safari when the SDK cannot find a video capture device.

    * After calling `unsubscribe` to unsubscribing from an unpublished track of a remote user, the subsequent subscribing and unsubscribing operations failed to take effect.

    * Reduced the performance degradation due to frequent method calls of `setEnabled` to enable and disable a video track in dual-stream mode.

    * Occasional errors when `client.getLocalVideoStats` was called on Safari.

    ### v4.1.0 [#v410]

    v4.1.0 was released on September 4, 2020.

    #### New features [#new-features-22]

    **Screenshot capture**

    v4.1.0 adds the `getCurrentFrameData` method which gets the data of the video frame being rendered.

    **Audio playback device management**

    v4.1.0 adds the following APIs to manage audio playback devices:

    * `setPlaybackDevice`: Sets the audio playback device, for example, the speaker. This method supports Chrome only.

    * `getPlaybackDevices`: Retrieves the audio playback devices available.

    * `onPlaybackDeviceChanged`: Occurs when an audio playback device is added or removed.

    #### Improvements [#improvements-29]

    * Fully supports Chromium-based versions of Microsoft Edge (versions 80 and later).

    * Improves the accuracy of the `network-quality` event.

    * Supports sharing audio when sharing Chrome tabs on macOS.

    #### Issues fixed [#issues-fixed-28]

    * Information retrieved by `checkVideoTrackIsActive` on Safari is inaccurate.

    * Occasional failure of reconnection after enabling dual-stream mode.

    * Occasional failure to call `setEnabled` after leaving the channel.

    * Failure to push streams to CDN with transcoding and without transcoding at the same time.

    * Occasional failure to automatically re-subscribe to the remote streams after disconnection, indicated by the `UNEXPECTED_RESPONSE: ERR_SUBSCRIBE_REQUEST_INVALID` error.

    * Failure to join different channels with the same UID in one browser tab.

    * Occasional misreport on connection states due to frequent channel join and leave.

    #### API changes [#api-changes-20]

    **Added**

    * `LocalVideoTrack.getCurrentFrameData`

    * `RemoteVideoTrack.getCurrentFrameData`

    * `AgoraRTC.getPlaybackDevices`

    * `LocalAudioTrack.setPlaybackDevice`

    * `RemoteAudioTrack.setPlaybackDevice`

    * `AgoraRTC.onPlaybackDeviceChanged`

    * `Client.getLocalAudioStats`

    * `Client.getRemoteAudioStats`

    * `Client.getLocalVideoStats`

    * `Client.getRemoteVideoStats`

    **Deprecated**

    * The `LocalTrack.getStats` and `RemoteTrack.getStats` methods. Use the `Client.getLocalAudioStats`, `Client.getRemoteAudioStats`, `Client.getLocalVideoStats` and `Client.getRemoteVideoStats` methods instead.

    ### v4.0.1 [#v401]

    v4.0.1 was released on July 18, 2020. This release fixed the following issues:

    * Failure to publish local tracks on Chrome 70.
    * Publish operation may not be aborted when leaving the channel.

    ### v4.0.0 [#v400]

    v4.0.0 was released on July 15, 2020.

    #### Compatibility changes [#compatibility-changes-11]

    v4.0.0 deletes the `LocalTrack.setMute` method and adds the `LocalTrack.setEnabled` method for enabling or disabling a local track. The advantages of this change are as follows:

    * Eliminates the concept of "mute" to avoid confusion between mute states and publishing states.

    * In versions earlier than v4.0.0, the SDK triggers the `Client.on("user-mute-updated")` callback when the remote user calls `setMute` to change the mute state.

    * As of v4.0.0, the SDK triggers the existing `Client.on("user-unpublished")` or `Client.on("user-published")` callbacks when the remote user calls `setEnabled` to enable or disable a track.

    * After you call `setMute(true)`, the SDK sends black video frames or silenced audio frames. If you mute a local video track, the camera light stays on, which might adversely impact the user experience. In contrast, if you disable a local video track by calling `setEnabled(false)`, the SDK immediately turns off the camera and stops capturing video.

    > The `setEnabled` method changes media input behaviors, so it is an asynchronous operation and returns the result through the `Promise` object.

    #### New features [#new-features-23]

    **Video encoding strategy**

    v4.0.0 adds the `optimizationMode` property in the `CameraVideoTrackInitConfig`, `ScreenVideoTrackInitConfig`, and `CustomVideoTrackInitConfig` interfaces. When creating a video track by calling `createCameraVideoTrack`, `createCustomVideoTrack`, or `createScreenVideoTrack`, you can choose whether to prioritize video quality or smoothness by setting optimizationMode as the following:

    * `"detail"`: Prioritizes video quality.

    * The SDK ensures high-quality images by automatically calculating a minimum bitrate based on the capturing resolution and frame rate. No matter how poor the network condition is, the sending bitrate will never be lower than the minimum value.

    * In most cases, the SDK does not reduce the sending resolution, but may reduce the frame rate.

    * `"motion"`: Prioritizes video smoothness.

    * In poor network conditions, the SDK reduces the sending bitrate to minimize video freezes.

    * In most cases, the SDK does not reduce the frame rate, but may reduce the sending resolution.

    > The `optimizationMode` property of the video track created by calling createScreenVideoTrack is set as `"detail"` by default.

    #### Improvements [#improvements-30]

    * Redesigns the `withAudio` parameter in `AgoraRTC.createScreenVideoTrack`. In addition to `enable` and `disable`, you can also set `withAudio` as `auto`. In this setting, the SDK shares the audio, dependent on whether the browser supports this function.

    * Does not allow setting the `withAudio` parameter as `"all"` any more to avoid code repetition. As of v4.0.0, you can only set `withAudio` as `"audio"` or `"video"`. This change involves the following APIs:

    * The `Client.subscribe` method.

    * The `Client.on("user-published")` and `Client.on("user-unpublished")` callbacks.

    #### Issues fixed [#issues-fixed-29]

    v4.0.0 fixed the following issues:

    * After the local user called `unpublish`, the SDK triggerred the `Client.on("user-left")` callback on the remote side.

    * Periodic video blur when sharing the screen in `"rtc"` mode.

    * Occasional publishing failure when calling `publish` and `unpublish` frequently.

    * The `Client.on("network-quality")` callback was inaccurate.

    #### API changes [#api-changes-21]

    **Added**

    * The `Client.localTracks` interface

    * The `LocalTrack.setEnabled` method

    * The `optimizationMode` property in `CameraVideoTrackInitConfig`, `ScreenVideoTrackInitConfig`, and `CustomVideoTrackInitConfig` interfaces

    **Updated**

    * Adds the value of `auto` to the withAudio parameter in `AgoraRTC.createScreenVideoTrack`.

    * Removes the value of `"all"` from the mediaType parameter in `Client.subscribe`.

    * The `mediaType` parameter in the `Client.on("user-published")` and `Client.on("user-unpublished")` callbacks does report `"all"`

    **Deprecated**

    * The `LocalAudioTrackStats.muteState` property

    * The `LocalVideoTrackStats.muteState` property

    * The `RemoteVideoTrackStats.muteState` property

    * The `RemoteAudioTrackStats.muteState` property

    **Deleted**

    * The `Client.on("user-mute-updated")` callback

    * The `LocalTrack.setMute` method

    * The `AgoraRTCRemoteUser.audioMuted` property

    * The `AgoraRTCRemoteUser.videoMuted` property

    * The `LocalTrack.getUserId` method

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="android">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="android" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [MetaKit extension](#metakit-extension)
    * [Camera Movement extension](#camera-movement-extension)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-1]

    If your target platform is Android 12 or higher, add the `android.permission.BLUETOOTH_CONNECT` permission to the `AndroidManifest.xml` file of the Android project to enable the Bluetooth function of the Android system.

    ### Known issues [#known-issues-1]

    ### v4.6.3 [#v463-1]

    Released on February 12, 2026.

    #### Issues fixed [#issues-fixed-30]

    This release fixed the following issues:

    * In audio/video interaction scenarios with the beauty effects enabled, the sender's screen turned black occasionally or the app crashed on certain device models.
    * The app occasionally crashed in audio/video interaction scenarios.

    ### v4.6.2 [#v462-1]

    Released on January 19, 2026.

    #### New features [#new-features-24]

    Included in this release:

    * **App-level screen sharing support on Android**

      Starting from Android 14, the system allows users to choose between sharing the full screen or a single app during screen sharing, enhancing privacy and multitasking. This version adapts to this system capability by adding support for sharing a single app in addition to full-screen sharing. The new `onLocalVideoEvent` callback reports local video events, especially those related to screen sharing.

    * **New permission granted callback on Android**

      The `onPermissionGranted` callback helps confirm permission status in screen sharing scenarios. You can use this callback to determine whether the user granted Camera or Screen permission.

    * **Support for getting audio buffer delay**

      To address the issue where the main vocal and background accompaniment may be out of sync in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module to get the millisecond-level audio buffer delay when playing media files.

    #### Improvements [#improvements-31]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `onNetworkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.
      * Improves video capture performance in low-light or dark environments on some devices, resulting in brighter images.
      * The Media Recorder module now supports recording audio from Media Player and Audio Mixing.

    #### Compatibility changes [#compatibility-changes-12]

    This release introduces the following compatibility changes:

    * **Removes `uid` from `EncodedVideoFrameInfo` struct**

      The `uid` parameter is removed from the `EncodedVideoFrameInfo` struct. You can retrieve the `remoteUid` directly from the `onEncodedVideoFrameReceived` callback. Update your integration logic accordingly.

    * **Audio Spectrum removed from Lite and Voice packages**

      To further reduce SDK package size, this version removes the Audio Spectrum feature from the Lite and Voice SDK packages. If you need the Audio Spectrum feature, please integrate the Full package.

    * **Decoder plugins built into the SDK**

      The relevant decoder plugins are now built into the SDK to ensure overall decoding compatibility.

    #### Issues fixed [#issues-fixed-31]

    This release fixed the following issues:

    * On certain devices (such as Redmi 14C), video from the sender occasionally displayed black borders on the receiver side during audio and video engagements.
    * The `bitrate` setting in the `startLocalTranscoder` API did not take effect.
    * On some emulators (such as LDPlayer 9), electrical noise was occasionally heard on the receiver side during audio and video engagements.
    * In live PK scenarios, when the audience enabled independent rendering of composite video streams, the rendered user video displayed abnormally.
    * During audio and video engagements, after calling `playEffect` locally, if a remote user switched to broadcaster and started speaking, electrical noise was occasionally heard locally.
    * On some vivo devices running Android 15, the app crashed when the camera was turned off.
    * When a user joined a channel as a broadcaster with the audio scenario set to `AUDIO_SCENARIO_CHATROOM` and did not publish local audio, then played a music file using `startAudioMixing`, and switched the audio scenario to `AUDIO_SCENARIO_GAMESTREAMING`, noise was occasionally heard.
    * The app occasionally became unresponsive (ANR) during audio and video engagements.
    * Occasional crashes occurred during audio and video engagements.
    * Beauty effects did not work in some scenarios.

    ### v4.6.1 [#v461-1]

    Released on November 26, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        This version of the SDK uses v1.3.0 of the libaosl.so library.
      </CalloutDescription>
    </CalloutContainer>

    #### Issues fixed [#issues-fixed-32]

    This version fixes the following issues:

    * Users on the receiving end occasionally saw a black screen during audio and video communication.
    * The app occasionally crashed during audio and video communication when connected to a network via VPN.
    * Distorted images appeared when playing 4K resolution video sources using the media player.
    * The app occasionally crashed during audio and video communication.
    * In multi-channel scenarios, the app occasionally crashed during audio and video communication with other devices.
    * When using the Voice SDK, the `onRtcStats` callback reported a `memoryAppUsageRatio` value that was always `0`.

    ### v4.6.0 [#v460-1]

    Released on August 26, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        The version of the `libaosl.so` library in the v4.6.0 SDK is 1.3.0.
      </CalloutDescription>
    </CalloutContainer>

    #### Compatibility changes [#compatibility-changes-13]

    This version includes SDK behavior changes, API deprecations, and deletions. To ensure your app functions correctly, update your code after upgrading to this version.

    For details on deprecated and deleted APIs in each version, see the [API Sunset Notice](https://api-ref.agora.io/video-sdk/android/4.x/API/rtc_api_sunset.html).

    * **Deprecation of direct CDN streaming APIs**

      Deprecates the APIs related to direct CDN streaming, which will be removed in a future release. Agora recommends using [Media Push](/en/realtime-media/media-push/get-started/enable-media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration`
      * `setDirectCdnStreamingVideoConfiguration`
      * `startDirectCdnStreaming`
      * `stopDirectCdnStreaming`
      * `updateDirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingStats`
      * `DirectCdnStreamingState`
      * `DirectCdnStreamingReason`

    * **Deprecation of virtual metronome APIs**

      Deprecates the APIs for the virtual metronome feature, which will be removed in a future release.

      * `startRhythmPlayer`
      * `configRhythmPlayer`
      * `onRhythmPlayerStateChanged`

    * **Deprecation of watermark APIs**

      Deprecates the old watermark APIs. Agora recommends using the new watermark APIs introduced in this version.

      * `addVideoWatermark [2/2]`
      * `addVideoWatermarkEx`

    * **Deletion of redundant APIs**

      Removed the following redundant APIs and parameters:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `WlAccStats`
      * `onWlAccMessage`
      * `enableWirelessAccelerate`

    * **Changes to int UID and string UID mapping**

      * Before v4.6.0: If you used `registerLocalUserAccount` to register a string UID (for example, `"aa"`) and obtain an int UID (for example, `123`), joining a channel with this int UID automatically mapped it to the original string UID (`"aa"`).
      * From v4.6.0: The SDK no longer automatically maps an int UID to the original string UID. If you need to join the channel with the original string UID, call the join method directly with the string UID. After upgrading, review and update your app logic to ensure users join the channel with the expected identity.

    * **Added domain whitelist**

      If you have upgraded from a previous SDK version to v4.6.0 and are using the domain whitelist feature (set `mdomainLimit` to `true` in `RtcEngineConfig`), add the following domains to the whitelist to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    #### New features [#new-features-25]

    * **Simulcasting multi-bitrate video streams (Beta)**

      Added support for sending multiple video streams of different resolutions from a single video source, including in multi-channel scenarios. You can now configure up to four layers: one high-resolution stream and up to three lower-resolution streams. Use configuration options to define resolution, bitrate, and whether to automatically reduce the number of streams when network or device performance drops. Subscribers can choose which stream to receive based on their network conditions. This feature helps developers deliver smooth experiences in scenarios such as conferences, large classes, and interactive live streaming, even when network conditions are poor.

    * **Multipath network transmission**

      Introduced multipath transmission for devices with multiple network interfaces (such as 5G, Wi-Fi, and LAN). This feature improves stability in challenging network environments, including in-vehicle systems, IoT, trains, and highways. Enable it by setting `enableMultipath` in `ChannelMediaOptions` to `true`.

      * *Dynamic mode*: Dynamically selects the optimal path based on network conditions. Suitable for scenarios sensitive to data consumption but requiring high experience quality, such as meetings and educational settings. You can optionally set `preferMultipathType` to prioritize a path type; if not set, all paths have the same default weight.
      * *Duplicate mode*: Sends data simultaneously over all available paths (such as LAN, Wi-Fi, and cellular) to eliminate the impact of poor network conditions. Suitable for scenarios not sensitive to data consumption but with extreme stability requirements, such as outdoor broadcasting and parallel control. This mode incurs additional costs.

      Configure uplink and downlink modes separately with `uplinkMultipathMode` and `downlinkMultipathMode`. Monitor performance with the `onMultipathStats` callback, which reports per-path statistics including data consumption.

    * **Video quality scoring**

      Added the `mosValue` member to `RemoteVideoStats` to report a score from 1 (extremely poor video quality with severe blurring) to 5 (excellent video quality with a clear image and no artifacts) for received video quality. This enables real-time monitoring of the subjective quality of remote video streams and helps dynamically adjust video parameters for quality monitoring and alerting. Contact [support@agora.io](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

      Deprecates the old `addVideoWatermark [2/2]` and `addVideoWatermarkEx` methods and introduced new versions of these methods that support multiple watermarks with IDs and layering order. Use `removeVideoWatermark` to remove a specific watermark.

    * **Asynchronous engine destruction**

      Added the `destroy [2/2]` method with an option for asynchronous destruction, triggering the `onEngineReleased` callback.

    * **Token renewal result callback**

      Added the `onRenewTokenResult` callback and `RENEW_TOKEN_ERROR_CODE` for handling the result of `renewToken`.

    * **Advanced beauty (Beta)**

      Introduced a brand-new advanced beauty feature, delivering a powerful yet easy-to-use beautification solution.

      * **Precision beauty effects**
        * *Face shaping*: Supports independent fine-tuning of 29 facial areas (for example, slimming face, enlarging eyes, narrowing nose) or one-click natural effects via presets.
        * *Style makeup*: Offers rich effects including eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
        * *Skin enhancement*: Includes professional skin optimizations such as teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.

      * **Unified and simple API**
        Manage all beauty, makeup, and filter functions through three core nodes — `BEAUTY`, `STYLE_MAKEUP`, and `FILTER` — using `IVideoEffectObject` for unified parameter setup and lifecycle control.

      * **Ready-to-use presets**
        Integrates multiple out-of-the-box style templates (for example, "Natural Beauty," "Senior Makeup," "Cool White Filter") for instant polished results.

      * **Dynamic parameter control**
        Enables real-time reading and modification of granular parameters (for example, smoothing strength, lipstick type) via key-value pairs, with support for saving custom configurations and resetting defaults.

      * **Local resource guarantee**
        All beauty resources (effects, filters, makeup) are packaged as local bundle files, ensuring stability and reliability.

    * **Other new features**

      * Added `setPlaybackAudioFrameBeforeMixingParameters` to configure the format of raw audio frames returned in `onPlaybackAudioFrameBeforeMixing`, including sample rate, number of channels, and the number of samples per callback.
      * Added `preloadEffectEx [1/2]` for preloading audio effects in a specific channel. Supports both local and online files, enabling faster playback later and suitable for multi-channel scenarios.
      * Added `playEffectEx [1/2]` for playing audio effects in a specific channel with advanced controls such as loop count, pitch, spatial position, volume, whether to publish to the channel, and starting playback position.
      * Added the `position` member in `ContentInspectModule` to choose the capture point for screenshot uploads, allowing capture from raw video data or before/after effects processing.
      * Added the `screenColorType` member to `SegmentationProperty` for specifying or detecting background screen color (green, blue, or auto-detected) to improve virtual background segmentation accuracy.

    #### Improvements [#improvements-32]

    * Added support for G.711 and G.722 audio codecs when interoperating with the Web SDK to improve cross-platform audio compatibility and clarity.
    * Optimized the plugin loading mechanism to automatically load the SDK's dynamic library plugins for Android apps developed with C++.
    * Improved video clarity in screen sharing scenarios involving documents.

    #### Issues fixed [#issues-fixed-33]

    This version fixes the following issues:

    * Online audio effect playback restarted from the beginning when `seek` was called to change playback position.
    * Occasional echoes in media volume mode when a broadcaster published a microphone audio stream while playing an audio effect with `playEffect [2/2]` and music with `startAudioMixing [2/2]`.
    * Missing media metadata observer callback when `registerMediaMetadataObserver` was called after `setExternalVideoSource` (Android, iOS).
    * Occasional crashes (Android, iOS).
    * Incorrect relay state (`RELAY_STATE_FAILURE`) and error (`RELAY_ERROR_SERVER_ERROR_RESPONSE`) reported after a specific join/relay sequence using `joinChannelEx`.
    * Occasional audio noise when using Bluetooth or wired headphones after setting `AUDIO_SCENARIO_CHATROOM` (Android).

    ### v4.5.2 [#v452]

    Released on April 22, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `libaosl.so` library version in Video SDK v4.5.2 is 1.2.13.
      </CalloutDescription>
    </CalloutContainer>

    #### Issues fixed [#issues-fixed-34]

    This release fixes the following issues:

    * While playing a multi-track media file, noise was heard when adjusting the audio pitch using `setAudioPitch`.
    * When the host called `createCustomAudioTrack` with `trackType` set to `AUDIO_TRACK_DIRECT`, pushed custom audio frames using `pushExternalAudioFrame`, and then called `playEffect` \[2/2] to play audio effects, audience members heard noise.
    * Apps using the SDK occasionally experienced UI lag caused by main thread blocking during audio and video interactions.
    * When playing an MP4 file with EAC3 audio encoding using `startAudioMixing`, sometimes no sound was heard.
    * Memory leaks occurred after leaving the channel and stopping video rendering.
    * After calling `setCameraFocusPositionInPreview` to manually set the focus position, the focus position was inaccurate when the camera captured a zoomed-in image.
    * When calling `setExternalMediaProjection` to configure an external `MediaProjection` instance, the transmitted video stream resolution (width/height) did not adjust dynamically when the screen orientation changed between landscape and portrait modes.
    * Calling `openWithMediaSource` and setting `isLiveSource` to `true` to play a video stream caused playback failure.
    * When attempting to open a non-existent local media file, the `onPlayerSourceStateChanged` callback did not report `PLAYER_STATE_FAILED` as expected.
    * When the sender transmitted multi-channel encoded audio, the receiver occasionally experienced noise.
    * When opening two different media resources consecutively using the media player, the second call unexpectedly triggered the `onPlayerInfoUpdated` callback with information from the first media resource.
    * After enabling user volume indication with `enableAudioVolumeIndication`, the `onAudioVolumeIndication` callback returned a local user volume of 0 for both local and remote users.
    * The app occasionally froze during audio and video communication.
    * Calling `setExtensionProperty` with the key `"makeup_options"` to apply makeup effects failed.
    * In low-light environments, the preview image appeared darker on certain device models during audio and video communication.
    * On 21:9 ultra-wide displays, setting a high resolution (such as 3840×2160) during screen sharing caused the shared image to appear cropped in both the local preview and on the receiver’s screen.
    * When the app called `enableVideoImageSource` to enable the video image source feature, streaming succeeded, but occasionally `onVideoPublishStateChanged` did not return the expected results.
    * In multi-channel scenarios, if the app called `setupRemoteVideoEx` before successfully calling `joinChannelEx`, the first frame of the remote video occasionally experienced significant delay.
    * After a failed attempt to join a channel, trying again without first calling `leaveChannel [1/2]` occasionally caused a crash.

    ### v4.5.1 [#v451]

    Released on March 4, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `libaosl.so` library version in Video SDK v4.5.1 is 1.2.13.
      </CalloutDescription>
    </CalloutContainer>

    #### New features [#new-features-26]

    **AI conversation scenario**

    This version introduces the `AUDIO_SCENARIO_AI_CLIENT` audio scenario option, specifically designed for interacting with conversational AI agents powered by the [Conversational AI Engine](/en/introduction/conversational-ai).

    This scenario optimizes audio transmission algorithms based on the characteristics of AI-generated voices, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. The optimization enhances conversation continuity and reliability across various network environments.

    #### Issues fixed [#issues-fixed-35]

    This release fixes the following issues:

    * Apps integrating the Agora SDK with `targetSdkVersion` set to 34 crashed when attempting to enable screen sharing for the first time on Android 14.
    * When joining multiple channels simultaneously and calling the `takeSnapshotEx [1/2]` method to capture local video stream snapshots in each channel, the screenshot for the first channel failed.
    * After using the `pause` method to pause playback, calling `seek` to move to a specific position, and then calling `play`, the Media Player resumed from the paused position instead of the newly specified position.
    * When using the Media Player, the file path returned by `getPlaySrc [1/2]` did not update after calling `switchSrc` to switch to a new media resource.
    * When using Bluetooth headphones on certain device models for audio and video interactions, adjusting the phone volume occasionally changed the media volume instead of the Bluetooth volume.
    * During audio and video interactions, the local user sometimes experienced a black screen when viewing remote video streams.
    * On specific device models, calling `setCameraExposureFactor` to set the camera's exposure coefficient at a particular angle sometimes caused the video screen to darken when the device was moved to another angle.
    * When playing a CDN live stream, the video occasionally froze for an extended period after recovering from an interruption.
    * In interactive live streaming, after joining a channel as an audience member using a `string` user ID, the audio and video occasionally became unsynchronized.
    * Plugins sometimes malfunctioned when using AI noise suppression and AI echo cancellation plugins simultaneously.

    ### v4.5.0 [#v450-1]

    Released on November 27, 2024.

    #### Compatibility changes [#compatibility-changes-14]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="warning">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        As of v4.5.0, both Video SDK and Signaling SDK (v2.2.0 and above) include the `libaosl.so` library. If you manually integrate Video SDK via CDN and also use Signaling SDK, delete the earlier version of the `libaosl.so` library to avoid conflicts. The `libaosl.so` library version in Video SDK v4.5.0 is 1.2.13.
      </CalloutDescription>
    </CalloutContainer>

    1. **Changes in strong video noise suppression**

       The `VIDEO_DENOISER_LEVEL_STRENGTH` enumeration is removed.

       Instead, after enabling video noise suppression by calling [`setVideoDenoiserOptions [1/2]`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setvideodenoiseroptions2), you can call the [`setBeautyEffectOptions [1/2]`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setbeautyeffectoptions) method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions [1/2]`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, you need to enable video noise suppression first and use specific settings as detailed in [`setLowlightEnhanceOptions [1/2]`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setlowlightenhanceoptions).

    2. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`COMPRESSION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_compressionpreference.html) enumeration class, a new `PREFER_COMPRESSION_AUTO` (-1) enumeration is added, replacing the original `PREFER_QUALITY` (1) as the default value. In this mode, the SDK will automatically choose between `PREFER_LOW_LATENCY` or `PREFER_QUALITY` based on your video scene settings to achieve the best user experience.
       * In the [`DEGRADATION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_degradationpreference.html) enumeration class, a new `MAINTAIN_AUTO` (-1) enumeration is added, replacing the original `MAINTAIN_QUALITY` (1) as the default value. In this mode, the SDK will automatically choose between `MAINTAIN_FRAMERATE`, `MAINTAIN_BALANCED`, or `MAINTAIN_RESOLUTION` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    3. **16 KB memory page size**

       Starting from Android 15, the system adds support for 16 KB memory page size, as detailed in [Support 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes). To ensure the stability and performance of the app, starting from this version, the SDK supports 16 KB memory page size, ensuring seamless operation on devices with both 4 KB and 16 KB memory page sizes, enhancing compatibility and preventing crashes.

    #### New features [#new-features-27]

    1. **Live show scenario**

       This version adds the `APPLICATION_SCENARIO_LIVESHOW(3)` (Live Show) enumeration to [`VideoScenario`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_videoapplicationscenariotype.html). You can call [`setVideoScenario`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setvideoscenario) to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency (no need to call `enableInstantMediaRendering`) for better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the [`setLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (for example, screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`setFilterEffectOptions [1/2]`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (`.cube`) in the `config` parameter to apply custom filter effects such as whitening, vivid, cool, black and white, and others. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file to quickly apply a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the `startLocalAudioMixer` method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * When using the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **External MediaProjection**

       This version introduces the [`setExternalMediaProjection`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setexternalmediaprojection) method, which allows you to set an external `MediaProjection` and replace the `MediaProjection` applied by the SDK.

       If you have the capability to apply for `MediaProjection` on your own, you can use this feature to achieve more flexible screen capture.

    6. **EGL context**

       This version introduces the [`setExternalRemoteEglContext`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setexternalremoteeglcontext) method, which is used to set the EGL context for rendering remote video streams. When using the Texture format video data for remote video self-rendering, you can use this method to replace the SDK's default remote EGL context, resulting in unified EGL context management.

    7. **Color space settings**

       This version adds `getColorSpace` and `setColorSpace` to [`VideoFrame`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_videoframe.html). You can use `getColorSpace` to obtain the color space properties of the video frame and use `setColorSpace` to customize the settings. By default, the color space uses Full Range and BT.709 standard configuration. Developers can flexibly adjust according to their own capture or rendering needs, further enhancing the customization capabilities of video processing.

    #### Improvements [#improvements-33]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`takeSnapshot [2/2]`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotEx [2/2]`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing`member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency.
       * This version optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * When calling `switchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `onPlayerEvent` callback will report the `PLAYER_EVENT_SWITCH_ERROR` event, indicating that an error has occurred during media resource switching.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Bug fixes [#bug-fixes-2]

    This version fixes the following issues:

    * When the video source of the sender is in the JPEG format, the frame rate on the receiving end occasionally falls below expectations.
    * Occasional noise and stuttering when playing music resources from the music content center.
    * During audio and video interaction, after being interrupted by a system call, the user volume reported by the `onAudioVolumeIndication` callback was incorrect.
    * When the receiving end subscribes to the low-quality video stream by default and does not automatically subscribe to any video stream when joining the channel, calling `muteRemoteVideoStream(uid, false)` after joining the channel to resume receiving the video stream results in receiving the high-quality stream.
    * Calling `startAudioMixing [1/2]` and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.
    * Occasional crashes during audio and video interaction.

    ### v4.4.1 [#v441]

    Released on August 8, 2024.

    #### Issues fixed [#issues-fixed-36]

    This release fixes the issue where `io.agora.rtc:full-rtc-basic:4.4.0` and `io.agora.rtc:voice-rtc-basic:4.4.0` were not working properly on Maven Central due to an upload error.

    ### v4.4.0 [#v440-1]

    v4.4.0 was released on August 5, 2024.

    #### Compatibility changes [#compatibility-changes-15]

    This version includes optimizations to some features, including changes to the SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        Starting from v4.4.0, the SDK provides an API sunset notice, which includes information about deprecated and removed APIs in each version. See [API Sunset Notice](https://api-ref.agora.io/en/video-sdk/android/4.x/API/rtc_api_sunset.html).
      </CalloutDescription>
    </CalloutContainer>

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds new corresponding callbacks that contain context information (see table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback | New callback           |
       | ----------------- | ---------------------- |
       | `onEvent`         | `onEventWithContext`   |
       | `onStarted`       | `onStartedWithContext` |
       | `onStopped`       | `onStoppedWithContext` |
       | `onError`         | `onErrorWithContext`   |

    2. This version removes the `buffer`, `uid`, and `timeStampMs` parameters of the `onMetadataReceived` callback. You can get metadata-related information, including `timeStampMs` (timestamp of the sent data), `uid` (user ID), and `channelId` (channel name) through the newly-added `metadata` parameter.

    #### New features [#new-features-28]

    1. **Lite SDK**

       Starting from this version, Agora introduces Lite SDK, which includes only the basic audio and video capabilities and partially cuts advanced features, effectively reducing the app size after integrating the SDK.

       * Lite SDK supports manual integration or third-party repository integration.
       * For information on dynamic libraries included in the Lite SDK, see [App size optimization](/en/realtime-media/video/build/optimize-and-operate/app-size-optimization).
       * For the list of APIs supported by Lite SDK, see [Lite SDK API](https://api-ref.agora.io/en/video-sdk/android/4.x/API/rtc_lite_api.html).
       * For the limitations and precautions when using the Lite SDK to play media files, refer to [Which audio file formats does the Agora Video SDK support?](/en/api-reference/faq/product/audio_format)

    2. **Alpha transparency effects**

       This version introduces the Alpha transparency effects feature, supporting the transmission and rendering of Alpha channel data in video frames for SDK capture and custom capture use-cases, enabling transparent gift effects, custom backgrounds on the receiver end, and so on:

       * `VideoFrame` and `AgoraVideoFrame` add the `alphaBuffer` member, which sets the Alpha channel data.
       * `AgoraVideoFrame` adds the `fillAlphaBuffer` member. For BGRA or RGBA formatted video data, it sets whether to automatically extract the Alpha channel data and fill it into `alphaBuffer`.
       * `VideoFrame` and `AgoraVideoFrame` add the `alphaStitchMode` member, which sets the relative position of `alphaBuffer` and video frame stitching.

       Additionally, `AdvanceOptions` adds a new member `encodeAlpha`, which is used to set whether to encode and send Alpha information to the remote end. By default, the SDK does not encode and send Alpha information; if you need to encode and send Alpha information to the remote end (for example, when virtual background is enabled), explicitly call `setVideoEncoderConfiguration` to set the video encoding properties and set `encodeAlpha` to `true`.

    3. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method and passing in the sound effect types supported in the `VOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-34]

    1. **Adaptive hardware decoding support**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and effectively reducing system load.

    2. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    3. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the parameter types of the following APIs. These improvements enhance code readability, reduce potential errors, and facilitate future maintenance.
         * Deprecates the `option` parameter of type `int` in `setRemoteSubscribeFallbackOption` \[1/2], and adds an overloaded function `setRemoteSubscribeFallbackOption` \[2/2] with the `option` parameter of type `StreamFallbackOptions`.
         * Deprecates the `streamType` parameter of type `int` in `setRemoteVideoStreamType` \[1/2], `setRemoteDefaultVideoStreamType` \[1/2], and `setRemoteVideoStreamTypeEx` \[1/2], and adds overloaded functions `setRemoteVideoStreamType` \[2/2], `setRemoteDefaultVideoStreamType` \[2/2], and `setRemoteVideoStreamTypeEx` \[2/2] with the `streamType` parameter of type `VideoStreamType`.
       * Optimizes the transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * Deprecates redundant enumerations `CLIENT_ROLE_CHANGE_FAILED_REQUEST_TIME_OUT` and `CLIENT_ROLE_CHANGE_FAILED_CONNECTION_FAILED`.

    #### Issues fixed [#issues-fixed-37]

    This release fixes the following issue:

    * Audio playback failed when pushing external audio data using `pushExternalAudioFrame` and the sample rate was not set as a recommended value, such as 22050 Hz and 11025 Hz.

    ### v4.3.2 [#v432]

    v4.3.2 was released on June 4, 2024.

    #### Improvements [#improvements-35]

    1. This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    2. The Agora media player now supports playing MP4 files with an Alpha channel.

    3. The Agora media player now fully supports playing music files located in the `/assets/` directory or from URI starting with `content://`.

    #### Issues fixed [#issues-fixed-38]

    This version fixed the following issues:

    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app crashed when opening the app and starting screen sharing after the first installation or system reboot.
    * Local audio capture failed after joining a channel while answering a system phone call and hanging up, preventing remote users from hearing any sound.
    * During the interaction process on certain devices (for example, Redmi Note8), after answering and hanging up a system call, local media files were played without sound and no sound was heard from the remote end (Android).
    * The app occasionally crashed when remote users left the channel.
    * The values of `cameraDirection` and `focalLengthType` returned by [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) could not be read directly.

    ### v4.3.1 [#v431]

    v4.3.1 was released on April 29, 2024.

    #### Compatibility changes [#compatibility-changes-16]

    To ensure parameter naming consistency, this version renames `channelName` to `channelId` and `optionalUid` to `uid` in `joinChannel` \[1/2]. Update your app's code after upgrading to this version to ensure normal project operations.

    #### New features [#new-features-29]

    1. **Wide and ultra-wide cameras**

       To allow users to capture a broader field of view and more complete scene content, this release introduces support for wide and ultra-wide cameras. You can first call [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) to check the device's focal length capabilities, and then call [setCameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setcameracapturerconfiguration) and set `cameraFocalLengthType` to the supported focal length types, including wide and ultra-wide.

    2. **Multi-camera capture**

       This release introduces additional functionalities for Android camera capture:

       1. Support for capturing and publishing video streams from the third and fourth cameras:
          * New enumerators `VIDEO_SOURCE_CAMERA_THIRD`(11) and `VIDEO_SOURCE_CAMERA_FOURTH`(12) are added to [VideoSourceType](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_videosourcetype.html), specifically for the third and fourth camera sources. This change allows you to specify up to four camera streams when initiating camera capture by calling [startCameraCapture](https://api-ref.agora.io/en/video-sdk/android/4.x/API/api_irtcengine_startcameracapture.html).
          * New parameters `publishThirdCameraTrack` and `publishFourthCameraTrack` are added to [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_channelmediaoptions.html). Set these parameters to `true` when joining a channel with [joinChannel \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_joinchannel2) to publish video streams captured from the third and fourth cameras.
       2. Support for specifying cameras by camera ID:
          * A new parameter `cameraId` is added to [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_cameracapturerconfiguration.html). For devices with multiple cameras, where `cameraDirection` cannot identify or access all available cameras, you can obtain the camera ID through Android's native system APIs and specify the desired camera by calling [startCameraCapture](https://api-ref.agora.io/en/video-sdk/android/4.x/API/api_irtcengine_startcameracapture.html) with the specific `cameraId`.
          * A new method [switchCamera \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_switchcamera2) supports switching cameras by `cameraId`, allowing apps to dynamically adjust camera usage during runtime based on available cameras.

    3. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_encryptionconfig.html) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_enableencryption). If there are issues causing failures in data stream encryption or decryption, these can be identified by the newly added `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE` and `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE` enumerations.

    4. **Local video rendering**

       This version adds the following members to [VideoCanvas](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_videocanvas.html) to support more local rendering capabilities:

       * `surfaceTexture`: Set a native Android `SurfaceTexture` object as the container providing video imagery, then use SDK external methods to perform OpenGL texture rendering.
       * `enableAlphaMask`: This member enables the receiving end to initiate Alpha mask rendering. Alpha mask rendering can create images with transparent effects or extract human figures from video content.

    5. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setdualstreammode2), the SDK defaults to the following behaviors:

       * The default encoding resolution for low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the small streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    6. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    7. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-36]

    1. **Optimization of local video status callbacks**

       This version introduces the following enumerations, allowing you to understand more about the reasons behind changes in local video status through the [onLocalVideoStateChanged](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback:

       * `LOCAL_VIDEO_STREAM_REASON_DEVICE_INTERRUPT` (14): Video capture is interrupted due to the camera being occupied by another app or the app moving to the background.
       * `LOCAL_VIDEO_STREAM_REASON_DEVICE_FATAL_ERROR` (15): Video capture device errors, possibly due to camera equipment failure.

    2. **Camera capture improvements**

       Improvements have been made to the video processing mechanism of camera capture, reducing noise, enhancing brightness, and improving color, making the captured images clearer, brighter, and more realistic.

    3. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure, especially around the fingers, are more stable, significantly reducing flickering at the edges.

    4. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `EAR_MONITORING_FILTER_REUSE_POST_PROCESSING_FILTER`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    5. **Other improvements**

       This version also includes the following improvements:

       * Enhanced performance and stability of the local compositing feature, reducing its CPU usage.
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * New chorus effect `ROOM_ACOUSTICS_CHORUS` is added to enhance the spatial presence of vocals in chorus use-cases.
       * In [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_remoteaudiostats.html), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending end to when the audio is played on the receiving end.

    #### Issues fixed [#issues-fixed-39]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * After joining a channel and calling [disableAudio](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio), audio playback did not immediately stop.
    * Broadcasters using certain models of devices under speaker mode experienced occasional local audio capture failures when switching the app process to the background and then back to the foreground, causing remote users to not hear the broadcaster's audio.
    * On devices with Android 8.0, enabling screen sharing occasionally caused the app to crash.
    * In use-cases using camera capture for local video, when the app was moved to the background and [disableVideo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_disablevideo) or [stopPreview](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_stoppreview) was called to stop video capture, camera capture was unexpectedly activated when the app was brought back to the foreground.
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-22]

    **Added**

    * The `surfaceTexture` and `enableAlphaMask` members in [VideoCanvas](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_videocanvas.html)
    * `LOCAL_VIDEO_STREAM_REASON_DEVICE_INTERRUPT`
    * `LOCAL_VIDEO_STREAM_REASON_DEVICE_FATAL_ERROR`
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MediaSourceType](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_mediasourcetype.html) adds `SPEECH_DRIVEN_VIDEO_SOURCE`
    * [VideoSourceType](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_videosourcetype.html) adds `VIDEO_SOURCE_SPEECH_DRIVEN`
    * [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
    * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * `ERR_DATASTREAM_DECRYPTION_FAILED`
    * `ROOM_ACOUSTICS_CHORUS` is added, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability)
    * [AgoraFocalLengthInfo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_focallengthinfo.html)
    * [CAMERA\_FOCAL\_LENGTH\_TYPE](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_camerafocallengthtype.html)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType`
    * [VideoSourceType](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_videosourcetype.html) adds the following enumerations:
      * `VIDEO_SOURCE_CAMERA_THIRD`(11)
      * `VIDEO_SOURCE_CAMERA_FOURTH`(12)
    * [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_channelmediaoptions.html) adds the following members:
      * `publishThirdCameraTrack`
      * `publishFourthCameraTrack`
      * `publishLipSyncTrack`
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId`
    * [CAMERA\_DIRECTION](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_cameradirection.html) adds `CAMERA_EXTRA`(2)
    * [switchCamera \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_switchcamera2)
    * `EAR_MONITORING_FILTER_BUILT_IN_AUDIO_FILTERS`

    ### v4.3.0 [#v430-1]

    v4.3.0 was released on February 22, 2024.

    #### Compatibility changes [#compatibility-changes-17]

    This release has optimized the implementation of some functions, which involved renaming or deletion of some APIs. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Raw video data callback behavior change**

       As of this release, the callback processing related to raw video data changes from the previous fixed single thread to a random thread, meaning that callback processing can occur on different threads. Due to limitations in the Android system, OpenGL must be tightly bound to a specific thread. Therefore, Agora suggests that you make one of the following modifications to your code:

       * (Recommended) Use the `TextureBufferHelper` class to create a dedicated OpenGL thread for video pre-processing or post-processing (for example, image enhancement, stickers, and so on).
       * Use the `eglMakeCurrent` method to associate the necessary OpenGL context for each video frame with the current thread.

    2. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `onLocalAudioStateChanged`         | `error`                 | `reason`           |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `onPlayerStateChanged`             | `error`                 | `reason`           |
       | `onRtmpStreamingStateChanged`      | `errCode`               | `reason`           |

       | Original enumeration class     | New enumeration class           |
       | ------------------------------ | ------------------------------- |
       | `DirectCdnStreamingError`      | `DirectCdnStreamingReason`      |
       | `MediaPlayerError`             | `MediaPlayerReason`             |
       | `MusicContentCenterStatusCode` | `MusicContentCenterStateReason` |

       **Note:** For specific renaming of enumerations, refer to [API changes](#api-changes).

    3. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                              | Alternative methods and callbacks  |
       | ---------------------------------------------------------- | ---------------------------------- |
       | * `startChannelMediaRelay`
       * `updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | - `startChannelMediaRelayEx`
       - `updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `onChannelMediaRelayEvent`                                 | `onChannelMediaRelayStateChanged`  |

    4. **Custom video source**

       Since this release, `pushExternalVideoFrameEx`\[1/2] and `pushExternalVideoFrameEx`\[2/2] are renamed to `pushExternalVideoFrameById`\[1/2] and `pushExternalVideoFrame`\[1/2], and are migrated from `RtcEngineEx` to `RtcEngine`.

    5. **Audio route**

       Since this release, `RouteBluetooth` is renamed to `AUDIO_ROUTE_BLUETOOTH_DEVICE_HFP`, representing a Bluetooth device using the HFP protocol. The `AUDIO_ROUTE_BLUETOOTH_DEVICE_A2DP`(10) is added to represent a Bluetooth device using the A2DP protocol.

    6. **The state of the remote video**

       To make the name of the enumeration easier to understand, this release changes the name of the enumeration from `REMOTE_VIDEO_STATE_PLAYING` to `REMOTE_VIDEO_STATE_DECODING`, while the meaning of the enumeration remains unchanged.

    7. **Reasons for local video state changes**

       The `LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE` enumeration has been changed to `LOCAL_VIDEO_STREAM_REASON_CODEC_NOT_SUPPORT`.

    8. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    9. **Removing `IAgoraEventHandler` interface**

       This release deletes the `IAgoraEventHandler` interface class. All callback events that were previously managed under this class are now processed through the `IRtcEngineEventHandler` interface class.

    #### New features [#new-features-30]

    1. **Custom mixed video layout on the receiving end**

       To facilitate customized layout of mixed video stream at the receiver end, this release introduces the [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo) callback. When the receiver receives the channel's mixed video stream sent by the video mixing server, this callback is triggered, reporting the layout information of the mixed video stream and the layout information of each sub-video stream in the mixed stream. The receiver can set a separate `view` for rendering the sub-video stream (distinguished by `subviewUid`) in the mixed video stream when calling the [setupRemoteVideo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setupremotevideo) method, achieving a custom video layout effect.

       When the layout of the sub-video streams in the mixed video stream changes, this callback will also be triggered to report the latest layout information in real time.

       Through this feature, the receiver end can flexibly adjust the local view layout. When applied in a multi-person video use-case, the receiving end only needs to receive and decode a mixed video stream, which can effectively reduce the CPU usage and network bandwidth when decoding multiple video streams on the receiving end.

    2. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the first view: Set the `position` parameter to `VIDEO_MODULE_POSITION_POST_CAPTURER_ORIGIN` (introduced in this release) in `VideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the second view: Set the `position` parameter to `VIDEO_MODULE_POSITION_POST_CAPTURER` in `VideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    3. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    4. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the [openWithMediaSource](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayer.html#api_imediaplayer_openwithmediasource) method and enable this function by setting the `enableMultiAudioTrack` parameter in [MediaPlayerSource](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_mediasource.html).

    5. **Audio playback device test**

       This release introduces the [startPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_startplaybackdevicetest) method to allow you to test whether your local audio device for playback works properly. You can specify the audio file to be played through the `testAudioFilePath` parameter and see if your audio device works properly. After the test is completed, you need to call the newly added [stopPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_stopplaybackdevicetest) method to stop the test.

    6. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption): Sets fallback option for the subscribed video stream in weak network conditions.
       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onremotesubscribefallbacktoaudioonly): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * [setPlayerOption](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionString](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption2): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-37]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 FPS) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setinearmonitoringvolume).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_ibasespatialaudioengine.html#api_ibasespatialaudioengine_setzones) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling the [ILocalSpatialAudioEngine](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) method.

    4. **Optimization of video pre-processing methods**

       This release adds overloaded methods with the `sourceType` parameter for the following 5 video preprocessing methods, which support specifying the media source type for applying video preprocessing effects by passing in `sourceType` (for example, applying on a custom video capture media source):

       * [setBeautyEffectOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setbeautyeffectoptions2)
       * [setLowlightEnhanceOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setlowlightenhanceoptions2)
       * [setVideoDenoiserOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setvideodenoiseroptions2)
       * [setColorEnhanceOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setcolorenhanceoptions2)
       * [enableVirtualBackground \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_enablevirtualbackground2)

    5. **Other improvements**

       This release also includes the following improvements:

       * Adds `codecType` in [VideoEncoderConfiguration](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_videoencoderconfiguration.html) to set the video encoding type.
       * Adds `allowCaptureCurrentApp` member in [AudioCaptureParameters](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_screenaudioparameters.html), which is used to set whether to capture audio from the current app during screen sharing. The default value of this member is `true`, which means it collects the audio from the current app by default. In certain use-cases, the shared screen audio captured by the app may cause echo on the remote side due to signal delay and other reasons. Agora suggests setting this member as `false` to eliminate the remote echo introduced during the screen sharing process.
       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling `setLocalAccessPoint` to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_playerplaybackstats.html).

    #### Issues fixed [#issues-fixed-40]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [onLocalVideoStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats)
      callback is 0, which is not as expected.
    * In an online meeting use-case, occasional audio freezes occurred when the local user was listening to remote users.

    #### API changes [#api-changes-23]

    **Added**

    * [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo)
    * [VideoLayout](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_videolayout.html)
    * The `subviewUid` and `uid` members in `VideoCanvas`
    * The `codecType` member in [VideoEncoderConfiguration](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_videoencoderconfiguration.html)
    * The `allowCaptureCurrentApp` member in [AudioCaptureParameters](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_screenaudioparameters.html)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_playerplaybackstats.html)
    * [startPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_startplaybackdevicetest)
    * [stopPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_stopplaybackdevicetest)
    * The `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_localaudiostats.html)
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CUSTOM_VIDEO_SOURCE` enumeration in [MediaSourceType](https://api-ref.agora.io/en/video-sdk/android/4.x/API/enum_mediasourcetype.html)
    * [setBeautyEffectOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setbeautyeffectoptions2)
    * [setLowlightEnhanceOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setlowlightenhanceoptions2)
    * [setVideoDenoiserOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setvideodenoiseroptions2)
    * [setColorEnhanceOptions \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setcolorenhanceoptions2)
    * [enableVirtualBackground \[2/2\]](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_enablevirtualbackground2)
    * The `AUDIO_ROUTE_BLUETOOTH_DEVICE_A2DP` enumeration

    **Modified**

    * `pushExternalVideoFrameEx`\[1/2] and `pushExternalVideoFrameEx`\[2/2] are renamed to `pushExternalVideoFrameById`\[1/2] and `pushExternalVideoFrameById`\[2/2], and are migrated from `RtcEngineEx` to `RtcEngine`
    * `REMOTE_VIDEO_STATE_PLAYING` enumeration name changed to`REMOTE_VIDEO_STATE_DECODING`
    * `ROUTE_BLUETOOTH` is renamed as `AUDIO_ROUTE_BLUETOOTH_DEVICE_HFP`
    * All `ERROR` fields in the following enumerations are changed to `REASON`:
      * `LOCAL_AUDIO_STREAM_ERROR_OK`
      * `LOCAL_AUDIO_STREAM_ERROR_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION`
      * `LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY`
      * `LOCAL_AUDIO_STREAM_ERROR_CAPTURE_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_OK`
      * `LOCAL_VIDEO_STREAM_ERROR_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY`
      * `LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_CODEC_NOT_SUPPORT`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_NOT_FOUND`
      * `PLAYER_ERROR_NONE`
      * `PLAYER_ERROR_INVALID_ARGUMENTS`
      * `PLAYER_ERROR_INTERNAL`
      * `PLAYER_ERROR_NO_RESOURCE`
      * `PLAYER_ERROR_INVALID_MEDIA_SOURCE`
      * `PLAYER_ERROR_UNKNOWN_STREAM_TYPE`
      * `PLAYER_ERROR_OBJ_NOT_INITIALIZED`
      * `PLAYER_ERROR_CODEC_NOT_SUPPORTED`
      * `PLAYER_ERROR_VIDEO_RENDER_FAILED`
      * `PLAYER_ERROR_INVALID_STATE`
      * `PLAYER_ERROR_URL_NOT_FOUND`
      * `PLAYER_ERROR_INVALID_CONNECTION_STATE`
      * `PLAYER_ERROR_SRC_BUFFER_UNDERFLOW`
      * `PLAYER_ERROR_INTERRUPTED`
      * `PLAYER_ERROR_NOT_SUPPORTED`
      * `PLAYER_ERROR_TOKEN_EXPIRED`
      * `PLAYER_ERROR_UNKNOWN`
      * `RTMP_STREAM_PUBLISH_ERROR_OK`
      * `RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT`
      * `RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED`
      * `RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT`
      * `RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR`
      * `RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR`
      * `RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN`
      * `RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT`
      * `RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED`
      * `RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND`
      * `RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED`
      * `RTMP_STREAM_PUBLISH_ERROR_NOT_BROADCASTER`
      * `RTMP_STREAM_PUBLISH_ERROR_TRANSCODING_NO_MIX_STREAM`
      * `RTMP_STREAM_PUBLISH_ERROR_NET_DOWN`
      * `RTMP_STREAM_PUBLISH_ERROR_INVALID_PRIVILEGE`
      * `RTMP_STREAM_UNPUBLISH_ERROR_OK`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`

    ### v4.2.6 [#v426]

    v4.2.6 was released on November 17, 2023.

    #### Issues fixed [#issues-fixed-41]

    This release fixed the following issues:

    * Issues occurring when using Android 14:

      * When switching between portrait and landscape modes during screen sharing, the screen sharing process was interrupted. To restart screen sharing, users needed to confirm recording the screen in the pop-up window.
      * When integrating the SDK, setting the Android `targetSdkVersion` to `34` could cause screen sharing to be unavailable or even the app to crash.
      * Calling `startScreenCapture` without sharing video, that is, setting `captureVideo` to `false`, and then calling `updateScreenCaptureParameters` to share video, that is, setting `captureVideo` to `true`, resulted in a frozen shared screen on the receiving end.
      * When screen sharing in a landscape mode, the shared screen seen by the audience was divided into two parts: One side of the screen was compressed, and the other side was black.

    * In live streaming use-cases, the video on the audience end was occasionally distorted.

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v4.2.3 [#v423]

    v4.2.3 was released on October 11, 2023.

    #### Compatibility changes [#compatibility-changes-18]

    This version optimizes the management of Texture Buffer in the SDK capture and custom video capture use-cases, effectively eliminating the potential for frame loss and crashes. Starting from this version, the texture format of the `TextureBuffer` type no longer includes the OES format, only the RGB format. Add adaptation to the I420 and RGB texture formats when processing video data.

    #### New features [#new-features-31]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `CONTENT_INSPECT_TYPE_IMAGE_MODERATION` enumeration is added in the `type` parameter of `ContentInspectModule`, which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `ContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       In addition, this version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperformed, the error code `-4:ERR_NOT_SUPPORTED` is returned, indicating the device does not support the feature.

    #### Improvements [#improvements-38]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10% (specific values may vary depending on the device model and platform).

    2. **Screen sharing use-case optimization**

       This release also optimizes the video encoding configuration in screen sharing use-cases. When users customize the `width` and `height` properties of the video, the SDK rounds down the actual encoding resolution while maintaining the aspect ratio of the video and the screen, ensuring that the final encoding resolution does not exceed the user-defined encoding resolution, thereby improving the accuracy of billing for screen sharing streams.

    **Other improvements**

    This release includes the following additional improvements:

    * Optimizes the management method of Texture Buffer for SDK capture and custom video capture use-cases, effectively eliminating frame dropping and crash risks.
    * Optimizes the logic of handling invalid parameters. When you call the `setPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code -2, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crash when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-42]

    This release fixed the following issues:

    * When using the H.265 encoding mode, when a Web client joined the interactivity, it caused a redundant `onUserEnableLocalVideo` callback on the native side: when the host called `enableLocalVideo (true)`, the receiving end first received a `onUserEnableLocalVideo` callback (with `enabled` as `false`) before receiving a `onUserEnableLocalVideo` callback (with `enabled` as `true`).
    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `playEffect [2/2]` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * When the host called the `startAudioMixing [2/2]` method to play music, sometimes the host couldn't hear the music while the remote users could hear it.
    * Occasional crashes occurred on certain Android devices.
    * Calling `takeSnapshotEx` once receives the `onSnapshotTaken` callback for multiple times.
    * In channels joined by calling `joinChannelEx` exclusively, calling `setEnableSpeakerphone` is unable to switch audio route from the speaker to the headphone.

    #### API changes [#api-changes-24]

    **Added**

    * `enableContentInspectEx`
    * `CONTENT_INSPECT_TYPE_IMAGE_MODERATION` in `type` of `ContentInspectModule`.
    * `serverConfig` in `ContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `FeatureType`

    ### v4.2.2 [#v422]

    v4.2.2 was released on july 27, 2023.

    #### New features [#new-features-32]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info" />

    All 4.x SDKs support using wildcard tokens.
    \:::

    2. **Preloading channels**

       This release adds `preloadChannel[1/2]` and `preloadChannel[2/2]` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `VideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    #### Improvements [#improvements-39]

    1. **Improved camera capture effect**

       Since this release, camera exposure adjustment is supported. This release adds `isCameraExposureSupported` to query whether the device supports exposure adjustment and `setCameraExposureFactor` to set the exposure ratio of the camera.

    2. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    3. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    4. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. To improve the switching experience between multiple audio routes, this release adds the `setRouteInCommunicationMode` method. This method can switch the audio route from a Bluetooth headphone to the earpiece, wired headphone or speaker in communication volume mode ([`MODE_IN_COMMUNICATION`](https://developer.android.google.cn/reference/kotlin/android/media/AudioManager?hl=en#mode_in_communication)).
    2. The SDK automatically adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    3. To help users understand the reasons for more types of remote video state changes, the `REMOTE_VIDEO_STATE_REASON_CODEC_NOT_SUPPORT` enumeration has been added to the `onRemoteVideoStateChanged` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-43]

    This release fixed the following issues:

    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.

    #### API changes [#api-changes-25]

    **Added**

    * `setCameraExposureFactor`
    * `isCameraExposureSupported`
    * `preloadChannel[1/2]`
    * `preloadChannel[2/2]`
    * `updatePreloadChannelToken`
    * `setRouteInCommunicationMode`
    * `CodecCapLevels`
    * `VideoCodecCapLevel`
    * `backgroundColor` in `VideoCanvas`
    * `codecLevels` in `CodecCapInfo`
    * `REMOTE_VIDEO_STATE_REASON_CODEC_NOT_SUPPORT`

    ### v4.2.1 [#v421-1]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-40]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-44]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * In screen sharing use-cases, some Android devices experienced choppy video on the receiving end.

    ### v4.2.0 [#v420-1]

    v4.2.0 was released on May 24, 2023.

    #### Compatibility changes [#compatibility-changes-19]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video data acquisition**

    The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.

    **2. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `ChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `ChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **3. Miscellaneous**

    * `onApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `enableDualStreamMode`\[1/2] and `enableDualStreamMode`\[2/2] are deprecated. Use `setDualStreamMode`\[1/2] and `setDualStreamMode`\[2/2] instead.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-33]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode to balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background function. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting scenarios where high bitrate is required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    This release adds the local video mixing feature. You can use the `startLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `updateLocalTranscoderConfiguration` method and the `onLocalVideoTranscoderError` callback. After enabling local video mixing, you can use the `updateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `onLocalVideoTranscoderError` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    #### Improvements [#improvements-41]

    **1. Improved voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced screen share**

    This release adds the `queryScreenCaptureCapability` method, which is used to query the screen capture capabilities of the current device. To ensure optimal screen sharing performance, particularly in enabling high frame rates like 60 fps, Agora recommends you to query the device's maximum supported frame rate using this method beforehand.

    This release also adds the `setScreenCaptureScenario` method, which is used to set the scenario type for screen sharing. The SDK automatically adjusts the smoothness and clarity of the shared screen based on the scenario type you set.

    **3. Improved compatibility with audio file types**

    As of v4.2.0, you can use the following methods to open files with a URI starting with `content://`:

    * `startAudioMixing` \[2/2]
    * `playEffect` \[3/3]
    * `open` \[2/2]
    * `openWithMediaSource`

    **4. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **5. Multi-camera capture**

    This release introduces `startCameraCapture`. By calling this method multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras need to be connected.

    **6. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **7. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    #### Issues fixed [#issues-fixed-45]

    This release fixed the following issues:

    * Occasional crashes occurred on Android devices when users joined or left a channel.
    * When the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.
    * Occasional failure when enabling in-ear monitoring.
    * Occasional echo.
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback.

    #### API changes [#api-changes-26]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `startLocalVideoTranscoder`
    * `updateLocalTranscoderConfiguration`
    * `onLocalVideoTranscoderError`
    * `queryScreenCaptureCapability`
    * `setScreenCaptureScenario`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioTrackType`
    * `VideoScenario`
    * The `mDomainLimit` and `mAutoRegisterAgoraExtensions` members in `RtcEngineConfig`
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * `BACKGROUND_NONE`(0)
    * `BACKGROUND_VIDEO`(4)

    **Deprecated**

    * `enableDualStreamMode`\[1/2]
    * `enableDualStreamMode`\[2/2]
    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`

    **Deleted**

    * `onApiCallExecuted`
    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions`

    ### v4.1.1 [#v411-1]

    v4.1.1 was released on February 8, 2023.

    #### Compatibility changes [#compatibility-changes-20]

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    <CalloutContainer type="info">
      <CalloutDescription>
        The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    #### New features [#new-features-34]

    **1. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **2. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `onVideoRenderingTracingResult` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks **Join Channel** and then get the indicators in the video frame rendering process through the `onVideoRenderingTracingResult` callback.
    This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-42]

    **1. Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode:

    * When the video processing mode is `PROCESS_MODE_READ_ONLY`, the return value is reserved for future use.
    * When the video processing mode is `PROCESS_MODE_READ_WRITE`, the SDK receives the video frame when the return value is `true`. The video frame is discarded when the return value is `false`.

    **2. Super resolution**

    This release improves the performance of super resolution. To optimize the usability of super resolution, this
    release removes `enableRemoteSuperResolution`. Super resolution is now included in the online strategies of video quality enhancement which does not require extra configuration.

    #### Issues fixed [#issues-fixed-46]

    This release fixes the following issues:

    * Playing audio files with a sample rate of 48 kHz failed.
    * Crashes occurred after users set the video resolution as 3840 × 2160 and started CDN streaming on Xiaomi Redmi 9A devices.
    * In real-time chorus use-cases, remote users heard noises and echoes when an OPPO R11 device joined the channel in loudspeaker mode.
    * When the playback of the local music finished, the `onAudioMixingFinished` callback was not properly triggered.
    * When using a video frame observer, the first video frame was occasionally missed on the receiver's end.
    * When sharing screens in use-cases involving multiple channels, remote users occasionally saw black screens.
    * Switching to the rear camera with the virtual background enabled occasionally caused the background to be inverted.
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.
    * At the moment when a user left a channel, a request for leaving was not sent to the server and the leaving behavior was incorrectly determined by the server as timed out.

    #### API changes [#api-changes-27]

    **Added**

    * `enableInstantMediaRendering`
    * `startMediaRenderingTracing`
    * `startMediaRenderingTracingEx`
    * `onVideoRenderingTracingResult`
    * `MEDIA_RENDER_TRACE_EVENT`
    * `VideoRenderingTracingInfo`

    **Deleted**

    * `enableRemoteSuperResolution`
    * `superResolutionType` in `RemoteVideoStats`

    ### v4.1.0 [#v410-1]

    v4.1.0 was released on December 15, 2022.

    #### New features [#new-features-35]

    **1. Headphone equalization effect**

    This release adds the `setHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call `setHeadphoneEQParameters` to adjust the EQ.

    **2. Encoded video frame observer**

    This release adds the `setRemoteVideoSubscriptionOptions` and `setRemoteVideoSubscriptionOptionsEx` methods. When you call the `registerVideoEncodedFrameObserver` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the [API reference](https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengine.html#api_imediaengine_registervideoframeobserver).

    **3. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **4. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `CameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **5. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * Adds the `leaveChannelEx` \[2/2] method. Compared with the `leaveChannelEx` \[1/2] method, a new `options` parameter is added, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **6. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advanceOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `compressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `encodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **7. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `onClientRoleChanged` callback. The value of this parameter is as follows:

    * `AUDIENCE_LATENCY_LEVEL_LOW_LATENCY` (1): Low latency.
    * `AUDIENCE_LATENCY_LEVEL_ULTRA_LOW_LATENCY` (2): Ultra-low latency.

    **8. Brand-new AI Noise Suppression**

    The SDK supports a new version of Noise Suppression (in comparison to the basic Noise Suppression in v3.7.x). The new AI Noise Suppression has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **9. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense of presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user, respectively, by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation`, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`, and the receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the hearing of the headphones.

    #### Improvements [#improvements-43]

    **1. Bluetooth permissions**

    To simplify integration, as of this release, you can use the SDK to enable Android users to use Bluetooth normally without adding the `BLUETOOTH_CONNECT` permission.

    **2. CDN streaming**

    To improve user experience during CDN streaming, when your camera does not support the video resolution you set when streaming, the SDK automatically adjusts the resolution to the closest value that is supported by your camera and has the same aspect ratio as the original video resolution you set. The actual video resolution used by the SDK for streaming can be obtained through the `onDirectCdnStreamingStats` callback.

    **3. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8), and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **4. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **5. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `AUDIO_SCENARIO_MEETING` scenario.
    * Improves the smoothness of SDK video rendering.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network scenarios.

    #### Issues fixed [#issues-fixed-47]

    This release fixed the following issues:

    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
    * The call `getExtensionProperty` failed and returned an empty string.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.

    #### API changes [#api-changes-28]

    **Added**

    * `setHeadphoneEQParameters`

    * `setRemoteVideoSubscriptionOptions`

    * `setRemoteVideoSubscriptionOptionsEx`

    * `VideoSubscriptionOptions`

    * `leaveChannelEx` \[2/2]

    * `muteLocalAudioStreamEx`

    * `muteLocalVideoStreamEx`

    * `muteAllRemoteAudioStreamsEx`

    * `muteAllRemoteVideoStreamsEx`

    * `startRtmpStreamWithoutTranscodingEx`

    * `startRtmpStreamWithTranscodingEx`

    * `updateRtmpTranscodingEx`

    * `stopRtmpStreamEx`

    * `startChannelMediaRelayEx`

    * `updateChannelMediaRelayEx`

    * `pauseAllChannelMediaRelayEx`

    * `resumeAllChannelMediaRelayEx`

    * `stopChannelMediaRelayEx`

    * `followEncodeDimensionRatio` in `CameraCapturerConfiguration`

    * `hwEncoderAccelerating` in `LocalVideoStats`

    * `advanceOptions` in `VideoEncoderConfiguration`

    * `newRoleOptions` in `onClientRoleChanged`

    * `adjustUserPlaybackSignalVolumeEx`

    * `IAgoraMusicContentCenter` interface class and methods in it

    * `IAgoraMusicPlayer` interface class and methods in it

    * `IMusicContentCenterEventHandler` interface class and callbacks in it

    * `Music` class

    * `MusicChartInfo` class

    * `MusicContentCenterConfiguration` class

    * `MvProperty` class

    * `ClimaxSegment` class

    **Deprecated**

    * `onApiCallExecuted`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes deprecated member parameters `backgroundImage` and `watermark` in `LiveTranscoding` class.
    * Removes `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8) in `onChannelMediaRelayEvent` callback.

    ### v4.0.1 [#v401-1]

    v4.0.1 was released on September 29, 2022.

    #### Compatibility changes [#compatibility-changes-21]

    This release deletes the `sourceType` parameter in `enableDualStreamMode` \[3/3] and `enableDualStreamModeEx`, and the `enableDualStreamMode` \[2/3] method, because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK, you don't need to specify the video source type any more.

    #### New features [#new-features-36]

    **1. In-ear monitoring**

    This release adds `getEarMonitoringAudioParams` callback to set the audio data format of the in-ear monitoring. You can use your own audio effect processing module to pre-process the audio frame data of the in-ear monitoring to implement custom audio effects. After calling `registerAudioFrameObserver` to register the audio observer, set the audio data format in the return value of the `getEarMonitoringAudioParams` callback. The SDK calculates the sampling interval based on the return value of the callback, and triggers the `onEarMonitoringAudioFrame` callback based on the sampling interval.

    **2. Audio capture device test**

    This release adds support for testing local audio capture devices before joining channel. You can call `startRecordingDeviceTest` to start the audio capture device test. After the test is complete, call the `stopPlaybackDeviceTest` method to stop the audio capture device test.

    **3. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use, including UNKNOWN, DISCONNECTED, LAN, WIFI, 2G, 3G, 4G, 5G. When the local network connection type changes, the SDK triggers the `onNetworkTypeChanged` callback to report the current network connection type.

    **4. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports 3 audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; you can contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Meanwhile, Agora supports publishers to choose whether or not the audio streams being published are to be filtered based on volume. Streams that are not filtered will bypass this filter mechanism and transported directly to the receivers. In use-cases where there are a number of publishers, enabling this function helps reducing the bandwidth and device system pressure for the receivers.

    To enable this function, contact [support@agora.io](mailto\:support@agora.io).

    **5. Dual-stream mode**

    This release optimizes the dual-stream mode, you can call `enableDualStreamMode` and `enableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams), you can follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `setRemoteVideoStreamType` or `setRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify the default behavior above, you can call `setDualStreamMode` \[1/2] or `setDualStreamMode` \[2/2] and set the `mode` parameter to `DISABLE_SIMULCAST_STREAM` (always do not send low-quality video streams) or `ENABLE_SIMULCAST_STREAM` (always send low-quality video streams).

    #### Improvements [#improvements-44]

    **1. Video information change callback**

    This release optimizes the trigger logic of `onVideoSizeChanged`, which can also be triggered and report the local video size change when `startPreview` is called separately.

    #### Issues fixed [#issues-fixed-48]

    This release fixed the following issues.

    1. When calling `setVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.
    2. In online meeting use-cases, the local user and the remote user might not hear each other after the local user is interrupted by a call.
    3. After calling `setCloudProxy` to set the cloud proxy, calling `joinChannelEx` to join multiple channels failed.
    4. When using the Agora media player to play videos, after you play and pause the video, and then call the seek method to specify a new position for playback, the video image might remain unchanged; if you call the resume method to resume playback, the video might be played in a speed faster than the original one.

    #### API changes [#api-changes-29]

    **Added**

    * `getEarMonitoringAudioParams`
    * `startRecordingDeviceTest`
    * `stopRecordingDeviceTest`
    * `getNetworkType`
    * `isAudioFilterable` in the `ChannelMediaOptions`
    * `setDualStreamMode` \[1/2]
    * `setDualStreamMode` \[2/2]
    * `setDualStreamModeEx`
    * `SIMULCAST_STREAM_MODE`
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `muteRemoteAudioStream`
    * `SpatialAudioParams`
    * `setHeadphoneEQPreset`
    * `HEADPHONE_EQUALIZER_PRESET`

    **Modified**

    * `enableDualStreamMode` \[1/3]

    * `enableDualStreamMode` \[3/3]

    * `enableDualStreamModeEx`

    **Deprecated**

    * `startEchoTest` \[2/3]

    **Deleted**

    * `enableDualStreamMode` \[2/3]

    ### v4.0.0 [#v400-1]

    v4.0.0 was released on September 15, 2022.

    #### Compatibility changes [#compatibility-changes-22]

    **1. Integration change**

    This release has optimized the implementation of some features, resulting in incompatibility with v3.7.x. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Custom video capture and rendering (Media IO)
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migrate from v3.7.x to v4.0.0](/en/realtime-media/video/reference/migration-guide).

    **2. Callback exception handling**

    To facilitate troubleshooting, as of this release, the SDK no longer catches exceptions that are thrown by your own code implementation when triggering callbacks in the `IRtcEngineEventHandler` class. You need to catch and handle the exceptions yourself; otherwise, it can cause a crash.

    #### New features [#new-features-37]

    **1. Multiple media tracks**

    This release supports one `RtcEngine` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `RtcEngineEx` and `ChannelMediaOptions.`

    After calling `joinChannel` to join the first channel, call `joinChannelEx` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `ChannelMediaOptions` settings.

    Besides, this release adds `createCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured videos in the channel:

    1. Create a custom video track: Call this method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `ChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `pushVideoFrame`, and specify `videoTrackId` as the ID of the custom video track in **step 2** in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Full HD and Ultra HD resolution (Beta)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capturing, encoding, decoding, and rendering. Starting from this version, it supports Full HD (FHD) and Ultra HD (UHD) video resolutions. You can set the `dimensions` parameter to 1920 × 1080 or higher when calling the `setVideoEncoderConfiguration` method. If your device does not support high resolutions, the SDK automatically falls back to an appropriate resolution.

    The UHD resolution (4K, 60 fps) is currently in beta and requires certain device performance and network bandwidth. If you want to enable this feature, contact [technical support](mailto\:support@agora.io).

    High resolution typically means higher performance consumption. To avoid a decrease in experience due to insufficient device performance, Agora recommends that you enable FHD and UHD video resolutions on devices with better performance.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayer` method to create a media player object, you can then call the methods in the `IMediaPlayer` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    **4. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `ULTRA_HIGH_QUALITY_VOICE` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Spatial audio**

    This feature is in experimental status. To enable this feature, contact [support@agora.io](mailto\:support@agora.io). Contact [technical support](mailto\:support@agora.io) if needed.

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `updateSelfPosition` and `updateRemotePosition` to update the spatial coordinates of the local and remote users, respectively, so that the local user can hear the spatial audio effect of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    You can also set the spatial audio for the media player as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio. You need to call `updateSelfPosition` and `updatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    **6. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AUDIO_SCENARIO_CHORUS` enumeration. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **7. Extensions from the Agora extensions marketplace**

    In order to enhance the real-time audio and video interactive activities based on the Agora SDK, this release supports the one-stop solution for the extensions from the [Agora extensions marketplace](https://api-ref.agora.io/en/agora-extensions-marketplace/):

    * Easy to integrate: The integration of modular functions can be achieved simply by calling an API, and the integration efficiency is improved by nearly 95%.
    * Extensibility design: The modular and extensible SDK design style endows the Agora SDK with good extensibility, which enables developers to quickly build real-time interactive apps based on the Agora extensions marketplace ecosystem.
    * Build an ecosystem: A community of real-time audio and video apps has developed that can accommodate a wide range of developers, offering a variety of extension combinations. After integrating the extensions, developers can build richer real-time interactive functions. For details, see [Use an Extension](/en/realtime-media/video/build/customize-audio-processing/use-an-extension).
    * Become a vendor: Vendors can integrate their products with Agora SDK in the form of extensions, display and publish them in the Agora extensions marketplace, and build a real-time interactive ecosystem for developers together with Agora. For details on how to develop and publish extensions, see [Become a Vendor](/en/api-reference/api-ref/extensions-marketplace/provisioning).

    **8. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `ChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `ChannelMediaOptions` when calling `joinChannel` or `joinChannelEx` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelMediaOptions` to update the settings in `ChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **9. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function in the following ways.

    * Call the `startScreenCapture` method before joining a channel, and then call `joinChannel` \[2/2] to join a channel and set `publishScreenCaptureVideo` as `true`.
    * Call the `startScreenCapture` method after joining a channel, and then call `updateChannelMediaOptions` to set `publishScreenCaptureVideo` as `true`.

    **10. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add a user ID that you want to subscribe to in your allowlist, or add a user ID for the streams you do not wish to see to your blocklists. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `RtcEngineEx` interface:

    * `setSubscribeAudioBlacklist`：Set the audio subscription blocklist.
    * `setSubscribeAudioWhitelist`：Set the audio subscription allowlist.
    * `setSubscribeVideoBlacklist`：Set the video subscription blocklist.
    * `setSubscribeVideoWhitelist`：Set the video subscription allowlist.

    If a user is added in a blocklist and a allowlist at the same time, only the blocklist takes effect.

    **11. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `setAudioScenario` method. For example, if you want to change the audio scenario from `AUDIO_SCENARIO_DEFAULT` to `AUDIO_SCENARIO_GAME_STREAMING` when you are in a channel, you can call this method.

    #### Improvements [#improvements-45]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `switchChannel` in v3.7.x through the `leaveChannel` and `joinChannel` methods so that you don't need to take the time to call the `switchChannel` method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `pushExternalVideoFrame` \[1/2] method to push such video frames to the SDK.

    **3. Voice pitch of the local user**
    This release adds `voicePitch` in `AudioVolumeInfo` of `onAudioVolumeIndication`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **4. Device permission management**

    This release adds the `onPermissionError` method, which is automatically reported when the audio capture device or camera does not obtain the appropriate permission. You can enable the corresponding device permission according to the prompt of the callback.

    **5. Video preview**

    This release improves the implementation logic of `startPreview`. You can call the `startPreview` method to enable video preview at any time.

    **6. Video types of subscription**

    You can call the `setRemoteDefaultVideoStreamType` method to choose the video stream type when subscribing to streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="ios">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="ios" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [MetaKit extension](#metakit-extension)
    * [Camera Movement extension](#camera-movement-extension)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-2]

    ### Known issues [#known-issues-2]

    ### v4.6.2 [#v462-2]

    Released on January 19, 2026.

    #### New features [#new-features-38]

    Included in this release:

    * **Support for multitasking camera capture on iOS**

      Starting with iOS 16, the system supports multitasking, allowing users to use multiple apps in parallel. Common multitasking modes include Split views, Slide over, Picture in picture, and Stage manager. Starting from this version, the SDK supports iOS camera multitasking capture capabilities, allowing continuous audio and video capture in multitasking scenarios. In real-time audio and video interaction scenarios, enabling this feature allows use cases such as referencing materials during video calls, displaying courseware side-by-side in interactive teaching, or managing product backends during live streaming. For details, refer to [How can I enable multitasking camera capture on iOS?](/en/api-reference/faq/integration/multitasking).

      Based on Agora Lab testing, the following device models and OS versions support this feature:

      | Device Model                       | Chip | OS            | Split View | Slide Over | Picture in Picture | Stage Manager |
      | ---------------------------------- | ---- | ------------- | :--------: | :--------: | :----------------: | :-----------: |
      | iPad Air 2                         | A8X  | iPadOS 14.7.1 |      —     |      ✔     |          —         |       —       |
      | iPad Pro (10.5-inch)               | A10X | iPadOS 15.0   |      ✔     |      ✔     |          ✔         |       ✔       |
      | iPad mini (5th generation)         | A12  | iPadOS 17.5.1 |      ✔     |      ✔     |          ✔         |       ✔       |
      | iPad Pro (11-inch, 2nd generation) | A12Z | iPadOS 18.4.1 |      ✔     |      ✔     |          ✔         |       ✔       |
      | iPad Pro (11-inch, 3rd generation) | M1   | iPadOS 17.6.1 |      ✔     |      ✔     |          ✔         |       ✔       |
      | iPhone 11                          | A13  | 16.1.1        |      —     |      —     |          ✔         |       —       |

    * **Support for getting audio buffer delay**

      To address the issue where the main vocal and background accompaniment may be out of sync in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module to get the millisecond-level audio buffer delay when playing media files.

    #### Improvements [#improvements-46]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `networkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Adds error codes `AgoraErrorCodePcmSendFormat (200)` and `AgoraErrorCodePcmSendBufferOverflow (201)` to report PCM data transmission errors.

    #### Compatibility changes [#compatibility-changes-23]

    This release introduces the following compatibility changes:

    * **Support for custom encoding frame rate**

      Changes the data type of the `frameRate` parameter in `AgoraVideoEncoderConfiguration` from an enumeration to an `Int`. During integration, refer to the original `AgoraVideoFrameRate` enum values for configuration.

    * **Audio Spectrum removed from Lite and Voice packages**

      To further reduce SDK package size, this version removes the Audio Spectrum feature from the Lite and Voice SDK packages. If you need the Audio Spectrum feature, please integrate the Full package.

    * **Disabled automatic macro mode switching**

      Automatic macro mode switching on the camera may cause video flickering. To prevent this issue, this version disables automatic macro mode switching. You can still manually switch macro mode using private parameters based on your business or scenario needs. If needed, please [contact support](mailto\:support@agora.io).

    * **Decoder plugins built into the SDK**

      The relevant decoder plugins are now built into the SDK to ensure overall decoding compatibility.

    * **armv7 architecture no longer supported by default**

      Starting from this version, the SDK no longer supports the armv7 architecture by default. If you need to support it, please [contact support](mailto\:support@agora.io).

    #### Issues fixed [#issues-fixed-49]

    This release fixed the following issues:

    * Beauty effects did not work in some scenarios.
    * When calling `leaveChannel` and `destroy` on a sub-thread while the UI orientation changed simultaneously, the app crashed.
    * On some iOS 16 devices, when a user joined a channel as a broadcaster with the audio scenario set to `AgoraAudioScenarioChatRoom` and called `enableLocalAudio` to disable local audio capture, the call volume could not be adjusted.
    * When switching video resolution under hardware exceptions, no encoded frames were output, causing the video to freeze.

    ### v4.6.0 [#v460-2]

    Released on August 26, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        The version of the `aosl.xcframework` library in the v4.6.0 SDK is 1.3.0. You can find the library version information in `Info.plist`.
      </CalloutDescription>
    </CalloutContainer>

    #### Compatibility changes [#compatibility-changes-24]

    This version includes SDK behavior changes, API deprecations, and deletions. To ensure your app functions correctly, update your code after upgrading to this version.

    For details on deprecated and deleted APIs in each version, see the [API Sunset Notice](/en/api-reference/api-ref/video/api-sunset).

    * **Deprecation of direct CDN streaming APIs**

      Deprecates the APIs related to direct CDN streaming, which will be removed in a future release. Agora recommends using [Media Push](/en/realtime-media/media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration:`
      * `setDirectCdnStreamingVideoConfiguration:`
      * `startDirectCdnStreaming:publishUrl:mediaOptions:`
      * `stopDirectCdnStreaming`
      * `rtcEngine:didDirectCdnStreamingStateChanged:reason:message:`
      * `AgoraDirectCdnStreamingMediaOptions`
      * `AgoraDirectCdnStreamingStats`
      * `AgoraDirectCdnStreamingState`
      * `AgoraDirectCdnStreamingReason`

    * **Deprecation of virtual metronome APIs**

      Deprecates the APIs for the virtual metronome feature, which will be removed in a future release.

      * `startRhythmPlayer:sound2:config:`
      * `configRhythmPlayer:`
      * `rtcEngine:didRhythmPlayerStateChanged:reason:`

    * **Deprecation of watermark APIs**

      Deprecates the old watermark APIs. Agora recommends using the new watermark APIs introduced in this version.

      * `addVideoWatermark:options:`
      * `addVideoWatermarkEx:options:connection:`

    * **Deletion of redundant APIs**

      Removed the following redundant APIs and parameters:

      * `setLocalPublishFallbackOption:`
      * `rtcEngine:didLocalPublishFallbackToAudioOnly:`
      * `downlinkNetworkInfoUpdate`
      * `wlAccStats`
      * `AgoraWlAccReason`
      * `AgoraWlAccAction`
      * `rtcEngine:wlAccStats:averageStats:`
      * `rtcEngine:wlAccMessage:action:wlAccMsg:`
      * `enableWirelessAccelerate`
      * `receivedFrameRate` (removed from `AgoraRtcRemoteVideoStats`)

    * **Changes to int UID and string UID mapping**

      * Before v4.6.0: If you used `registerLocalUserAccountWithAppID:userAccount:` to register a string UID (for example, `"aa"`) and obtain an int UID (for example, `123`), joining a channel with this int UID automatically mapped it to the original string UID (`"aa"`).
      * From v4.6.0: The SDK no longer automatically maps an int UID to the original string UID. If you need to join the channel with the original string UID, call `joinChannelByUserAccount:token:channelId:joinSuccess:` directly with the string UID. After upgrading, review and update your app logic to ensure users join the channel with the expected identity.

    * **Added domain whitelist**

      If you have upgraded from a previous SDK version to v4.6.0 and are using the domain whitelist feature (set `domainLimit` in `AgoraRtcEngineConfig` to `YES`), add the following domains to the whitelist to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    * **Default log path change**

      This release changes the default log path from `AppSandbox/Library/documents/agorasdk.log` to `AppSandbox/Library/caches/agorasdk.log`. If you upgrade the SDK from v4.3.1 or later to v4.6.0, ensure that you use the new path to access the log file.

    #### New features [#new-features-39]

    * **Simulcasting multi-bitrate video streams (Beta)**

      Added support for sending multiple video streams of different resolutions from a single video source, including in multi-channel scenarios. You can now configure up to four layers: one high-resolution stream and up to three lower-resolution streams. Use configuration options to define resolution, bitrate, and whether to automatically reduce the number of streams when network or device performance drops. Subscribers can choose which stream to receive based on their network conditions. This feature helps developers deliver smooth experiences in scenarios such as conferences, large classes, and interactive live streaming, even when network conditions are poor.

    * **Multipath network transmission**

      Introduced multipath transmission for devices with multiple network interfaces (such as 5G, Wi-Fi, and LAN). This feature improves stability in challenging network environments and is suitable for scenarios such as in-vehicle systems, IoT, trains, and highways. Enable it by setting `enableMultipath` in `AgoraRtcChannelMediaOptions` to `YES`.

      * *Dynamic mode*: Dynamically selects the optimal path based on network conditions. Suitable for scenarios sensitive to data consumption but requiring high quality, such as meetings and educational settings. Optionally set `preferMultipathType` to prioritize a path type.
      * *Duplicate mode*: Sends data simultaneously over all available paths for maximum stability. This mode eliminates the impact of poor network conditions and is suitable for scenarios with extreme quality requirements, such as outdoor broadcasting and parallel control.

      Configure uplink and downlink modes separately with `uplinkMultipathMode` and `downlinkMultipathMode`. Monitor performance with the `rtcEngine:didMultipathStatsChanged:` callback, which reports data usage and other statistics for each path.

    * **Video quality scoring**

      Added the `mosValue` member to `AgoraRtcRemoteVideoStats` to report a score from 1 (poor) to 5 (excellent) for received video quality. This enables real-time monitoring and parameter adjustment. Contact [support@agora.io](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

      Added `addVideoWatermarkWithImageUrl:options:` and `addVideoWatermarkWithImageUrlEx:options:connection:` methods that support multiple watermarks with IDs and layering order. Use `removeVideoWatermark:` to remove a specific watermark.

    * **Asynchronous engine destruction**

      Added the `destroy:` method with an option for asynchronous destruction, triggering the `engineReleasedBlock` callback.

    * **Token renewal result callback**

      Added the `rtcEngine:didRenewTokenResult:` callback and `RENEW_TOKEN_ERROR_CODE` for handling the result of `renewToken:`.

    * **Advanced beauty (Beta)**

      Introduced a brand-new advanced beauty feature, delivering a powerful yet easy-to-use beautification solution.

      * **Precision beauty effects**
        * *Face shaping*: Supports independent fine-tuning of 29 facial areas (for example, slimming face, enlarging eyes, narrowing nose) or one-click natural effects via presets.
        * *Style makeup*: Offers rich effects including eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
        * *Skin enhancement*: Includes professional skin optimizations such as teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.

      * **Unified and simple API**
        Manage all beauty, makeup, and filter functions through three core nodes — `BEAUTY`, `STYLE_MAKEUP`, and `FILTER` — using `IVideoEffectObject` for unified parameter setup and lifecycle control.

      * **Ready-to-use presets**
        Integrates multiple out-of-the-box style templates (for example, "Natural Beauty," "Senior Makeup," "Cool White Filter") for instant polished results.

      * **Dynamic parameter control**
        Enables real-time reading and modification of granular parameters (for example, smoothing strength, lipstick type) via key-value pairs, with support for saving custom configurations and resetting defaults.

      * **Local resource guarantee**
        All beauty resources (effects, filters, makeup) are packaged as local bundle files, ensuring stability and reliability.

    * **Other new features**

      * Added `setPlaybackAudioFrameBeforeMixingParameters:` to configure the format of raw audio frames returned in `onPlaybackAudioFrameBeforeMixing:channelId:uid:`.
      * Added `preloadEffectEx:soundId:` for preloading audio effects in a specific channel, supporting both local and online files.
      * Added `playEffectEx:soundId:filePath:loopCount:pitch:pan:gain:publish:startPos:` for playing audio effects in a specific channel with advanced controls.
      * Added the `position` member in `AgoraContentInspectModule` to choose the capture point for screenshot uploads.
      * Added the `screenColorType` member to `AgoraSegmentationProperty` for specifying or detecting background screen color.

    #### Improvements [#improvements-47]

    * Added support for G.711 and G.722 audio codecs when inter-operating with the Web SDK for better cross-platform audio compatibility.
    * Improved video clarity in screen sharing scenarios involving documents.

    #### Issues fixed [#issues-fixed-50]

    This version fixes the following issues:

    * Online audio effect playback restarted from the beginning when `seekToPosition:` was called.
    * Occasional echoes in media volume mode when a broadcaster published a microphone audio stream while playing an audio effect with `playEffect:filePath:loopCount:pitch:pan:gain:publish:startPos:` and music with `startAudioMixing:loopback:cycle:startPos:`.
    * Missing media metadata observer callback when `setMediaMetadataDelegate:withType:` was called after `setExternalVideoSource:useTexture:sourceType:` (Android, iOS).
    * Occasional crashes (Android, iOS).
    * Media relay occasionally reported `AgoraChannelMediaRelayStateFailure` and `AgoraChannelMediaRelayErrorServerErrorResponse` after the following sequence: join, relay, unpublish, leave, rejoin, and start relay again.

    ### v4.5.2 [#v452-1]

    v4.5.2 was released on April 22, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `aosl.xcframework` library version in Video SDK v4.5.2 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

    #### Issues fixed [#issues-fixed-51]

    This release fixes the following issues:

    * While playing a multi-track media file, noise was heard when adjusting the audio pitch using `setAudioPitch`.
    * When the host called `createCustomAudioTrack:config:` to create a custom audio track with `trackType` set to `AUDIO_TRACK_DIRECT`, then called `pushExternalAudioFrameRawData:samples:sampleRate:channels:trackId:timestamp:` to push custom audio frames to a channel, and finally called `playEffect:filePath:loopCount:pitch:pan:gain:publish:startPos:` to play an audio effect, audience members in the channel heard noise.
    * Apps using the SDK occasionally experienced UI lag caused by main thread blocking during audio and video interactions.
    * Calling `openWithMediaSource:` and setting `isLiveSource` to `YES` in the source parameter to play a video stream caused playback failure.
    * When calling `enableVirtualBackground` to enable the virtual background, the background image appeared enlarged and blurry when the device was rotated.
    * When the sender transmitted multi-channel encoded audio, noise was occasionally heard by the receiver.
    * When the app integrated a media player and called `open` twice to load different media resources consecutively, the second call incorrectly triggered the `AgoraRtcMediaPlayer:infoUpdated:` callback with information from the first media resource.
    * After enabling user volume indication with `enableAudioVolumeIndication:smooth:reportVad:`, the `rtcEngine:reportAudioVolumeIndicationOfSpeakers:totalVolume:` callback reported a local user volume of 0 for both local and remote users.
    * The app occasionally froze during audio and video communication.
    * When you called `enableVideoImageSource:options:` to enable the video image source feature, the sending side appeared to stream successfully, but the `rtcEngine:didVideoPublishStateChange:sourceType:oldState:newState:elapseSinceLastState:` callback reported a publish failure.
    * In multi-channel scenarios, if the app called `setupRemoteVideoEx:connection:` to initialize the remote user's view before successfully calling `joinChannelExByToken:connection:delegate:mediaOptions:joinSuccess:`, the first frame of the remote video occasionally experienced significant delay.

    ### v4.5.1 [#v451-1]

    v4.5.1 was released on March 4, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `aosl.xcframework` library version in Video SDK v4.5.1 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

    #### New Features [#new-features-40]

    1. **AI Conversation Scenario**

       This version introduces the `AgoraAudioScenarioAiClient` audio scenario, specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on the characteristics of AI-generated voices, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. The optimization enhances conversation continuity and reliability, adapting to various challenging network environments.

    #### Improvements [#improvements-48]

    * Reduced SDK initialization time on specific device models.

    #### Issues Fixed [#issues-fixed-52]

    This release resolves the following issues:

    * When joining two or more channels simultaneously and calling `takeSnapshotEx:uid:filePath:` to capture local video stream screenshots consecutively, the first channel's screenshot failed.
    * When using the `pause` method to pause playback, then calling `seekToPosition:` to move to a specific position, and finally calling `play`, the Media Player resumed from the paused position instead of the specified position.
    * When using the Media Player, the file path of the media resource returned by `getPlaySrc` did not update after calling `switchSrc:syncPts:` to switch to a new media resource.
    * Pushing video frames in `i420` format to the channel while using `CVPixelBuffer` to process these frames caused crashes.
    * Calling `setupLocalVideo:` to set up two views and then enabling face detection with `enableFaceDetection:` prevented face information from being detected in the newly assigned views.
    * In screen-sharing scenarios, the receiving user saw a green line on the shared image.
    * In interactive live streaming scenarios, after joining a channel as an audience member using a `string` user ID, audio occasionally became unsynchronized with video.
    * AI noise suppression and AI echo cancellation plugins sometimes failed when used together.

    ### v4.5.0 [#v450-2]

    v4.5.0 was released on November 27, 2024.

    #### Compatibility changes [#compatibility-changes-25]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="warning">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        As of v4.5.0, both Video SDK and Signaling SDK (v2.2.0 and above) include the `aosl.xcframework` library. If you manually integrate Video SDK via CDN and also use Signaling SDK, delete the earlier version of the `aosl.xcframework` library to avoid conflicts. The `aosl.xcframework` library version in Video SDK v4.5.0 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

    1. **Changes in strong video noise suppression**

       This version adjusts the implementation of strong video noise suppression. The `AgoraVideoDenoiserLevel` removes `AgoraVideoDenoiserLevelStrength`. Instead, after enabling video noise suppression by calling [`setVideoDenoiserOptions:options:`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setvideodenoiseroptions\(_\:options:\)), you can call the [`setBeautyEffectOptions:options:`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setbeautyeffectoptions\(_\:options:\)) method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in [`setVideoDenoiserOptions:options:`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setvideodenoiseroptions\(_\:options:\)).

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, you need to enable video noise suppression first and use specific settings as detailed in [`setLowlightEnhanceOptions:options:`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setlowlightenhanceoptions\(_\:options:\)).

    2. **Changes in video encoding preferences**

       To enhance the user's video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`AgoraCompressionPreference`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoracompressionpreference) enumeration class, a new `AgoraCompressionAuto` (-1) enumeration is added, replacing the original `AgoraCompressionQuality` (1) as the default value. In this mode, the SDK will automatically choose between `AgoraCompressionLowLatency` or `AgoraCompressionQuality` based on your video scene settings to achieve the best user experience.
       * In the [`AgoraDegradationPreference`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoradegradationpreference) enumeration class, a new `AgoraDegradationMaintainAuto` (-1) enumeration is added, replacing the original `AgoraDegradationMaintainQuality` (1) as the default value. In this mode, the SDK will automatically choose between `AgoraDegradationMaintainFramerate`, `AgoraDegradationBalanced`, or `AgoraDegradationMaintainResolution` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    #### New features [#new-features-41]

    1. **Live show scenario**

       This version adds the `AgoraApplicationLiveShowScenario`(3) (Live Show) enumeration to [`AgoraApplicationScenarioType`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraapplicationscenariotype). You can call `setVideoScenario:` to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency for better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the `setLocalRenderTargetFps` and `setRemoteRenderTargetFps` methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (for example, screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the `setFilterEffectOptions:options:sourceType:` method. You can pass a cube map file (`.cube`) in the `config` parameter to apply custom filter effects such as whitening, vivid, cool, black and white, and others. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file to quickly apply a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the `startLocalAudioMixer` method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * When using the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **Color space settings**

       This version adds the `colorSpace` parameter to [`AgoraOutputVideoFrame`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraoutputvideoframe) and [`AgoraVideoFrame`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoravideoframe). You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    #### Improvements [#improvements-49]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the `takeSnapshotWithConfig:config:` and `takeSnapshotExWithConfig:uid:config:` methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AgoraAudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudiotrackconfig), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `NO`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency.
       * This version optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * After calling `enableLocalAudio:` to disable local audio capture within the channel, the mute side button on the phone can be used to mute the background sound effects played by the app.
       * When calling `switchSrc:syncPts:` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `AgoraRtcMediaPlayer:didOccurEvent:elapsedTime:message:` callback will report the `AgoraMediaPlayerEventSwitchError` event, indicating that an error has occurred during media resource switching.
       * When calling `setPlaybackSpeed:` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Bug fixes [#bug-fixes-3]

    This version fixes the following issues:

    * When the video source of the sender is in the JPEG format, the frame rate on the receiving end occasionally falls below expectations.
    * Occasional instances where the receiving end cannot hear the sender during audio and video interaction.
    * During audio and video interaction, if the sender's device system version is iOS 17, the receiving end occasionally cannot hear the sender.
    * In live streaming use-cases, the time taken to reconnect to the live room after the audience end disconnects due to network switching is longer than expected.
    * No sound when playing online media resources using the media player after the app starts.
    * Occasional instances of no sound in audio capture after resuming from being interrupted by other system apps.
    * Calling `startAudioMixing:loopback:cycle:` and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.

    ### v4.4.0 [#v440-2]

    v4.4.0 was released on August 5, 2024.

    #### Compatibility changes [#compatibility-changes-26]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        Starting from v4.4.0, the SDK provides an API sunset notice, which includes information about deprecated and removed APIs in each version. See [API sunset notice](/en/api-reference/api-ref/video/api-sunset).
      </CalloutDescription>
    </CalloutContainer>

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds new corresponding callbacks that contain context information (see table below). You can identify the extension name, the user ID, and the service provider name through `AgoraExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onEvent`            | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    2. Prior to v4.4.0, when a user was set to the audience role and `setAudioScenario` was called with `AgoraAudioScenarioChatRoom`, the system displayed the microphone-in-use indicator.
       Starting with v4.4.0, the SDK uses native iOS APIs to manage the microphone. As a result, audience users in a chatroom scenario no longer see the indicator.

    3. This version renames the `receiveMetadata` callback to `didMetadataReceived` and removes the `data` and `timeStamp` parameters. You can get metadata-related information, including `timeStamp` (timestamp of the sent data), `uid` (user ID), and `channelId` (channel name) through the newly-added `metadata` parameter.

    #### New features [#new-features-42]

    1. **Lite SDK**

       Starting from this version, Agora introduces Lite SDK, which includes only the basic audio and video capabilities and partially cuts advanced features, effectively reducing the app size after integrating the SDK.

       * Lite SDK supports manual integration or third-party repository integration.
       * For information on dynamic libraries included in the Lite SDK, see [App size optimization](/en/realtime-media/video/build/optimize-and-operate/app-size-optimization).
       * For the list of APIs supported by Lite SDK, see [API reference](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit).
       * For the limitations and precautions when using the Lite SDK to play media files, refer to [Which audio file formats does the Agora Video SDK support?](/en/api-reference/faq/product/audio_format)

    2. **Alpha transparency effects**

       This version introduces the Alpha transparency effects feature, supporting the transmission and rendering of Alpha channel data in video frames for SDK capture and custom capture use-cases, enabling transparent gift effects, custom backgrounds on the receiver end, and so on:

       * `AgoraOutputVideoFrame` and `AgoraVideoFrame` add the `alphaBuffer` member, which sets the Alpha channel data.
       * `AgoraVideoFrame` adds the `fillAlphaBuffer` member. For BGRA or RGBA formatted video data, it sets whether to automatically extract the Alpha channel data and fill it into `alphaBuffer`.
       * `AgoraOutputVideoFrame` and `AgoraVideoFrame` add the `alphaStitchMode` member, which sets the relative position of `alphaBuffer` and video frame stitching.

       Additionally, `AgoraAdvancedVideoOptions` adds a new member `encodeAlpha`, which is used to set whether to encode and send Alpha information to the remote end. By default, the SDK does not encode and send Alpha information; if you need to encode and send Alpha information to the remote end (for example, when virtual background is enabled), explicitly call `setVideoEncoderConfiguration` to set the video encoding properties and set `encodeAlpha` to `YES`.

    3. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method and passing in the sound effect types supported in the `AgoraVoiceAITunerType` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-50]

    1. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    2. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * Deprecates redundant enumeration values `AgoraClientRoleChangeFailedRequestTimeout` and `AgoraClientRoleChangeFailedConnectionFailed` in `AgoraClientRoleChangeFailedReason`.

    #### Issues fixed [#issues-fixed-53]

    This release fixes the following issues:

    * Occasional app crashes occurred when multiple remote users joined a channel simultaneously during real-time interaction.
    * Remote video occasionally froze or displayed corrupted images when the app returned to the foreground after being in the background for a while.
    * After the sender called `startDirectCdnStreaming` to start direct CDN streaming, frequent switching or toggling of the network occasionally resulted in a black screen on the receiver's end without a streaming failure callback on the sender's end.
    * Audio playback failed when pushing external audio data using `pushExternalAudioFrameRawData` and the sample rate was not set as a recommended value, such as 22050 Hz and 11025 Hz.

    ### v4.3.2 [#v432-1]

    v4.3.2 was released on June 4, 2024.

    #### Improvements [#improvements-51]

    1. This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setremotesubscribefallbackoption\(_:\)) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    2. The Agora media player supports playing mp4 files with an Alpha channel.

    #### Issues fixed [#issues-fixed-54]

    This version fixed the following issues:

    * The remote video froze or became pixelated when the app returned to the foreground after being in the background for a long time.
    * The local preview image rotated by 90° on some iPad devices, which did not meet expectations.
    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app occasionally crashed when remote users left the channel.
    * When playing an audio file using \[startAudioMixing [1/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/startaudiomixing\(_\:loopback\:cycle:\)) and the playing finished, the SDK sometimes failed to trigger the [audioMixingStateChanged](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:audiomixingstatechanged\:reasoncode:\)) (`AgoraAudioMixingStateTypeStopped`, `AgoraAudioMixingReasonAllLoopsCompleted`) callback which reports that the playing is completed.
    * When calling the \[playEffect [3/3\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/playeffect\(_\:filepath\:loopcount\:pitch\:pan\:gain\:publish\:startpos:\)) method to play sound effect files shorter than 1 second with `loopCount` set to `0`, there was no sound.
    * When using the Agora media player to play a video and stopping it during playing, sometimes there was no sound for a short time after the playback was resumed.

    ### v4.3.1 [#v431-1]

    v4.3.1 was released on April 29, 2024.

    #### New features [#new-features-43]

    1. **Privacy manifest file**

       To meet Apple's safety compliance requirements for app publication, the SDK now includes a privacy manifest file, `PrivacyInfo.xcprivacy`, detailing the SDK's API calls that access or use user data, along with a description of the types of data collected.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    If you need to publish an app with SDK versions prior to v4.3.1 to the Apple App Store, manually add the `PrivacyInfo.xcprivacy` file to your Xcode project. For more details, see [How can I add a privacy manifest to my iOS app?](/en/api-reference/faq/other/ios_privacy_manifest)
    \:::

    1. **Portrait center stage**

       To enhance the presentation effect in online meetings, shows, and online education use-cases, this version introduces the [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecameracenterstage\(_:\)) method to activate the Portrait center stage. This ensures that presenters, regardless of movement, always remain centered in the video frame, achieving better presentation effects.

       Before enabling portrait center stage, it is recommended to verify whether your current device supports this feature by calling [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/iscameracenterstagesupported\(\)). A list of supported devices can be found in the API documentation at [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecameracenterstage\(_:\)).

    2. **Camera stabilization**

       To improve video stability in mobile filming, low-light environments, and hand-held shooting use-cases, this version introduces a camera stabilization feature. You can activate this feature and select an appropriate stabilization mode by calling [setCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setcamerastabilizationmode\(_:\)), achieving more stable and clearer video footage.

    3. **Wide and ultra-wide cameras**

       To allow users to capture a broader field of view and more complete scene content, this release introduces support for wide and ultra-wide cameras. You can first call [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/querycamerafocallengthcapability\(\)) to check the device's focal length capabilities, and then call [setCameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setcameracapturerconfiguration\(_:\)) and set `cameraFocalLengthType` to the supported focal length types, including wide and ultra-wide.

    4. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [AgoraEncryptionConfig](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraencryptionconfig) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableencryption\(_\:encryptionconfig:\)). If there are issues causing failures in data stream encryption or decryption, these can be identified by the newly added `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE` and `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE` enumerations.

    5. **Local video rendering**

       This version adds the following member to [AgoraRtcVideoCanvas](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcvideocanvas) to support more local rendering capabilities:

       * `enableAlphaMask`: This member enables the receiving end to initiate Alpha mask rendering. Alpha mask rendering can create images with transparent effects or extract human figures from video content.

    6. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate the dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode \[2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setdualstreammode\(_\:streamconfig:\)), the SDK defaults to the following behaviors:

       * The default encoding resolution for low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the small streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    7. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableencryptionex\(_\:encryptionconfig\:connection:\)) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\)) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/getcallidex\(_:\)) is introduced for retrieving call IDs in multi-channel use-cases.

    8. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-52]

    1. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure, especially around the fingers, are more stable, significantly reducing flickering at the edges.

    2. **Custom audio capture optimization**

       To enhance the flexibility of custom audio capture, this release deprecates [pushExternalAudioFrameSampleBuffer \[1/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\)) and introduces [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_\:samplerate\:channels\:trackid:\)). Compared to the deprecated method, the new method adds parameters such as `sampleRate`, `channels`, and `trackId`. These support pushing external CMSampleBuffer audio data to the channel via custom audio tracks, and allow for the setting of sample rates and channel counts for external audio sources.

    3. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `AgoraEarMonitoringFilterReusePostProcessingFilter` in `AgoraEarMonitoringFilterType`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    4. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen-sharing use-cases to save system performance overhead.
       * Improved stability in processing video by the raw video frame observer.
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * In [AgoraAudioEffectPreset](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudioeffectpreset), a new enumeration `AgoraAudioEffectPresetRoomAcousticsChorus` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [AgoraRtcRemoteAudioStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcremoteaudiostats), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending end to when the audio is played on the receiving end.

    #### Issues fixed [#issues-fixed-55]

    This version fixed the following issue:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-30]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecameracenterstage\(_:\))
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/iscameracenterstagesupported\(\))
    * [setCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setcamerastabilizationmode\(_:\))
    * [AgoraCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoracamerastabilizationmode)
    * The `enableAlphaMask` member in [AgoraRtcVideoCanvas](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcvideocanvas)
    * [setFaceInfoDelegate](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setfaceinfodelegate\(_:\))
    * [AgoraFaceInfoDelegate](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorafaceinfodelegate)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorafaceinfodelegate/onfaceinfo\(_:\))
    * The `publishLipSyncTrack` member in [AgoraRtcChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcchannelmediaoptions)
    * [AgoraMediaSourceType](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoramediasourcetype) adds `AgoraMediaSourceTypeSpeechDriven`
    * [AgoraVideoSourceType](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoravideosourcetype) adds `AgoraVideoSourceTypeSpeechDriven`
    * [AgoraEncryptionConfig](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraencryptionconfig) adds `datastreamEncryptionEnabled`
    * [AgoraEncryptionErrorType](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraencryptionerrortype) adds the following enumerations:
      * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
      * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [AgoraRtcRemoteAudioStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcremoteaudiostats) adds `e2eDelay`
    * [AgoraErrorCode](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraerrorcode) adds `AgoraErrorCodeDatastreamDecryptionFailed`
    * [AgoraAudioEffectPreset](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudioeffectpreset) adds `AgoraAudioEffectPresetRoomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/getcallidex\(_:\))
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableencryptionex\(_\:encryptionconfig\:connection:\))
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\))
    * [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/querycamerafocallengthcapability\(\))
    * [AgoraFocalLengthInfo](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorafocallengthinfo)
    * [AgoraFocalLength](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorafocallength)
    * [AgoraCameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoracameracapturerconfiguration) adds a new member `cameraFocalLengthType`
    * [AgoraEarMonitoringFilterType](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraearmonitoringfiltertype) adds a new enumeration `AgoraEarMonitoringFilterBuiltInAudioFilters`
    * [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_\:samplerate\:channels\:trackid:\))

    **Deprecated**

    * [pushExternalAudioFrameSampleBuffer \[1/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\))

    ### v4.3.0 [#v430-2]

    v4.3.0 was released on February 22, 2024.

    #### Compatibility changes [#compatibility-changes-27]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, you need to update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Please modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `localAudioStateChanged`           | `error`                 | `reason`           |
       | `localVideoStateChanged`           | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `didChangedToState`                | `error`                 | `reason`           |
       | `rtmpStreamingChangedToState`      | `errCode`               | `reason`           |

       | Original enumeration class     | New enumeration class           |
       | ------------------------------ | ------------------------------- |
       | `AgoraAudioLocalError`         | `AgoraAudioLocalReason`         |
       | `AgoraLocalVideoStreamError`   | `AgoraLocalVideoStreamReason`   |
       | `AgoraDirectCdnStreamingError` | `AgoraDirectCdnStreamingReason` |
       | `AgoraMediaPlayerError`        | `AgoraMediaPlayerReason`        |
       | `AgoraRtmpStreamingError`      | `AgoraRtmpStreamingReason`      |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                              | Alternative methods and callbacks  |
       | ---------------------------------------------------------- | ---------------------------------- |
       | * `startChannelMediaRelay`
       * `updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | - `startChannelMediaRelayEx`
       - `updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `didReceiveChannelMediaRelayEvent`                         | `channelMediaRelayStateDidChange`  |

    3. **Custom video source**

       Since this release, `pushExternalVideoFrame`\[1/2] is migrated from `AgoraRtcEngineKit(Ex)` to `AgoraRtcEngineKit`.

    4. **Audio route**

       Starting with this release, `AgoraAudioOutputRoutingBluetooth` in [AgoraAudioOutputRouting](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudiooutputrouting) is renamed to `AgoraAudioOutputRoutingBluetoothDeviceHfp`, representing a Bluetooth device using the HFP protocol. `AgoraAudioOutputRoutingBluetoothDeviceA2dp`(10) is added to represent the audio route to a Bluetooth device using the A2DP protocol.

    5. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [AgoraLocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoralocalvideostreamreason) class:

       * The `AgoraLocalVideoStreamErrorEncodeFailure` enumeration has been changed to `AgoraLocalVideoStreamReasonCodecNotSupport`.

    6. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    #### New features [#new-features-44]

    1. **Custom mixed video layout on the receiving end**

       To facilitate customized layout of mixed video stream at the receiver end, this release introduces the [`didTranscodedStreamLayoutInfoUpdatedWithUserId`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:didtranscodedstreamlayoutinfoupdatedwithuserid\:videolayoutinfo:\)) callback. When the receiver receives the channel's mixed video stream sent by the video mixing server, this callback is triggered, reporting the layout information of the mixed video stream and the layout information of each sub-video stream in the mixed stream. The receiver can set a separate `view` for rendering the sub-video stream (distinguished by `subviewUid`) in the mixed video stream when calling the [setupRemoteVideo](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setupremotevideo\(_:\)) method, achieving a custom video layout effect.

       When the layout of the sub-video streams in the mixed video stream changes, this callback will also be triggered to report the latest layout information in real time.

       Through this feature, the receiver end can flexibly adjust the local view layout. When applied in a multi-person video use-case, the receiving end only needs to receive and decode a mixed video stream, which can effectively reduce the CPU usage and network bandwidth when decoding multiple video streams on the receiving end.

    2. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setuplocalvideo\(_:\)) to set the first view: Set the `position` parameter to `AgoraVideoModulePositionPostCaptureOrigin` (introduced in this release) in `AgoraRtcVideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setuplocalvideo\(_:\)) to set the second view: Set the `position` parameter to `AgoraVideoModulePositionPostCapture` in `AgoraRtcVideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    3. **Query Device Score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/querydevicescore\(\)) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    4. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/selectmultiaudiotrack\(_\:publishtrackindex:\)) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the `openWithMediaSource` method and enable this function by setting the `enableMultiAudioTrack` parameter in [AgoraMediaSource](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoramediasource).

    5. **Device test for audio capturing and playback**

       This release introduces the following methods to test whether the audio capturing or playback devices work properly before joining a channel:

       * [startRecordingDeviceTest](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/startrecordingdevicetest\(_:\)): Tests whether the local audio capturing device, such as the speaker, is working properly. After calling this method, the SDK triggers a callback at the time interval set in this method, which reports uid = 0 and the volume information of the capturing device. After the test is completed, you need to call the newly added [stopRecordingDeviceTest](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/stoprecordingdevicetest\(\)) method to stop the test.
       * [startPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/startplaybackdevicetest\(_:\)): Tests whether the local audio playback device is working properly. You can specify the audio file to be played through the `testAudioFilePath` parameter and see if your audio device works properly. After the test is completed, you need to call the newly added [stopPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/stopplaybackdevicetest\(\)) method to stop the test.

    6. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of the SDK v4.x.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setremotesubscribefallbackoption\(_:\)): Sets fallback option for the subscribed video stream in weak network conditions.
       * [didRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:didremotesubscribefallbacktoaudioonly\:byuid:\)): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * \[setPlayerOption [1/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/setplayeroption\(_\:value:\)) and \[setPlayerOption [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/setplayeroptionstring\(_\:value:\)): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\)): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-53]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setinearmonitoringvolume\(_:\)).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraspatialaudiokitbase/setzones\(_:\)) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling methods in [AgoraLocalSpatialAudioKit](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoralocalspatialaudiokit).
       * This release introduces the [updateSelfTransform](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraspatialaudiokitbase/updateselftransform\(_:\)) method, designed to pass position vectors for direct rendering in iOS native frameworks such as SceneKit or RealityKit.

    4. **Local audio state changed callback optimization**

       This release introduces the following enumeration in [AgoraAudioLocalReason](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudiolocalreason), enabling users to obtain more details about local audio errors through the `localAudioStateChanged` callback:

       * `AgoraAudioLocalReasonInterrupted`: The local audio capture is interrupted by system calls, Siri, or alarm clocks. Remind your users to end the phone call, Siri, or alarm clock if the local audio capture is required.

    5. **Optimization of video pre-processing methods**

       This release adds overloaded methods with the `sourceType` parameter for the following 5 video preprocessing methods, which support specifying the media source type for applying video preprocessing effects by passing in `sourceType` (for example, applying on a custom video capture media source):

       * \[setBeautyEffectOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setbeautyeffectoptions\(_\:options\:sourcetype:\))
       * \[setLowlightEnhanceOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setlowlightenhanceoptions\(_\:options\:sourcetype:\))
       * \[setVideoDenoiserOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setvideodenoiseroptions\(_\:options\:sourcetype:\))
       * \[setColorEnhanceOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setcolorenhanceoptions\(_\:options\:sourcetype:\))
       * \[enableVirtualBackground [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablevirtualbackground\(_\:backdata\:segdata\:sourcetype:\))

    6. **Other Improvements**

       This release also includes the following improvements:

       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [AgoraRtcLocalAudioStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartclocalaudiostats) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [cacheStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:cachestats:\)) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [playbackStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:playbackstats:\)) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through `AgoraMediaPlayerPlaybackStats`.

    #### Issues fixed [#issues-fixed-56]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [localVideoStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:localvideostats\:sourcetype:\)) callback is 0, which is not as expected.

    #### API changes [#api-changes-31]

    **Added**

    * [`didTranscodedStreamLayoutInfoUpdatedWithUserId`](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:didtranscodedstreamlayoutinfoupdatedwithuserid\:videolayoutinfo:\))
    * [AgoraVideoLayoutInfo](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoravideolayoutinfo)
    * The `subviewUid` member in [AgoraRtcVideoCanvas](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcvideocanvas)
    * [updateSelfTransform](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraspatialaudiokitbase/updateselftransform\(_:\))
    * The `AgoraAudioLocalReasonInterrupted` enumeration in [AgoraAudioLocalReason](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudiolocalreason)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\))
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/querydevicescore\(\))
    * The `AgoraMediaSourceTypeCustomVideo` enumeration in [AgoraMediaSourceType](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoramediasourcetype)
    * \[setBeautyEffectOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setbeautyeffectoptions\(_\:options\:sourcetype:\))
    * \[setLowlightEnhanceOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setlowlightenhanceoptions\(_\:options\:sourcetype:\))
    * \[setVideoDenoiserOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setvideodenoiseroptions\(_\:options\:sourcetype:\))
    * \[setColorEnhanceOptions [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setcolorenhanceoptions\(_\:options\:sourcetype:\))
    * \[enableVirtualBackground [2/2\]](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablevirtualbackground\(_\:backdata\:segdata\:sourcetype:\))
    * The `AgoraAudioOutputRoutingBluetoothDeviceA2dp` enumeration in [AgoraAudioOutputRouting](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoraaudiooutputrouting)
    * Adds the `earMonitorDelay` and `aecEstimatedDelay` in [AgoraRtcLocalAudioStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartclocalaudiostats)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/selectmultiaudiotrack\(_\:publishtrackindex:\))
    * [cacheStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:cachestats:\))
    * [playbackStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:playbackstats:\))
    * [AgoraMediaPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agoramediaplayerplaybackstats)
    * [startPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/startplaybackdevicetest\(_:\))
    * [stopPlaybackDeviceTest](https://api-ref.agora.io/en/video-sdk/ios/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/stopplaybackdevicetest\(\))

    **Modified**

    * `pushExternalVideoFrame`\[1/2] is migrated from `AgoraRtcEngineKit(Ex)` to `AgoraRtcEngineKit`
    * `AgoraAudioOutputRoutingBluetooth` is renamed as `AgoraAudioOutputRoutingBluetoothDeviceHfp`
    * All `Error` fields in the following enumerations are changed to `Reason`:
      * `AgoraAudioLocalErrorOK`
      * `AgoraAudioLocalErrorFailure`
      * `AgoraAudioLocalErrorDeviceNoPermission`
      * `AgoraAudioLocalErrorDeviceBusy`
      * `AgoraAudioLocalErrorRecordFailure`
      * `AgoraAudioLocalErrorEncodeFailure`
      * `AgoraLocalVideoStreamErrorOK`
      * `AgoraLocalVideoStreamErrorFailure`
      * `AgoraLocalVideoStreamErrorDeviceNoPermission`
      * `AgoraLocalVideoStreamErrorDeviceBusy`
      * `AgoraLocalVideoStreamErrorCaptureFailure`
      * `AgoraLocalVideoStreamErrorCodecNotSupport`
      * `AgoraLocalVideoStreamErrorCaptureInBackGround`
      * `AgoraLocalVideoStreamErrorCaptureMultipleForegroundApps`
      * `AgoraLocalVideoStreamErrorCaptureNoDeviceFound`
      * `AgoraLocalVideoStreamErrorCaptureDeviceDisconnected`
      * `AgoraLocalVideoStreamErrorCaptureDeviceInvalidId`
      * `AgoraDirectCdnStreamingErrorOK`
      * `AgoraDirectCdnStreamingErrorFailed`
      * `AgoraDirectCdnStreamingErrorAudioPublication`
      * `AgoraDirectCdnStreamingErrorVideoPublication`
      * `AgoraDirectCdnStreamingErrorNetConnect`
      * `AgoraDirectCdnStreamingErrorBadName`
      * `AgoraMediaPlayerErrorNone`
      * `AgoraMediaPlayerErrorInvalidArguments`
      * `AgoraMediaPlayerErrorInternal`
      * `AgoraMediaPlayerErrorNoSource`
      * `AgoraMediaPlayerErrorInvalidMediaSource`
      * `AgoraMediaPlayerErrorUnknowStreamType`
      * `AgoraMediaPlayerErrorObjNotInitialized`
      * `AgoraMediaPlayerErrorCodecNotSupported`
      * `AgoraMediaPlayerErrorVideoRenderFailed`
      * `AgoraMediaPlayerErrorInvalidState`
      * `AgoraMediaPlayerErrorUrlNotFound`
      * `AgoraMediaPlayerErrorInvalidConnectState`
      * `AgoraMediaPlayerErrorSrcBufferUnderflow`
      * `AgoraMediaPlayerErrorInterrupted`
      * `AgoraMediaPlayerErrorNotSupported`
      * `AgoraMediaPlayerErrorTokenExpired`
      * `AgoraMediaPlayerErrorUnknown`
      * `AgoraRtmpStreamingErrorOK`
      * `AgoraRtmpStreamingErrorInvalidParameters`
      * `AgoraRtmpStreamingErrorEncryptedStreamNotAllowed`
      * `AgoraRtmpStreamingErrorConnectionTimeout`
      * `AgoraRtmpStreamingErrorInternalServerError`
      * `AgoraRtmpStreamingErrorRtmpServerError`
      * `AgoraRtmpStreamingErrorTooOften`
      * `AgoraRtmpStreamingErrorReachLimit`
      * `AgoraRtmpStreamingErrorNotAuthorized`
      * `AgoraRtmpStreamingErrorStreamNotFound`
      * `AgoraRtmpStreamingErrorFormatNotSupported`
      * `AgoraRtmpStreamingErrorNotBroadcaster`
      * `AgoraRtmpStreamingErrorTranscodingNoMixStream`
      * `AgoraRtmpStreamingErrorNetDown`
      * `AgoraRtmpStreamingErrorInvalidPrivilege`
      * `AgoraRtmpStreamingErrorUnpublishOK`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    ### v4.2.6 [#v426-1]

    v4.2.6 was released on November 17, 2023.

    #### Issues fixed [#issues-fixed-57]

    This release fixed the following issues:

    * When using an iOS 16 or later device with Bluetooth headphones connected before joining the channel, the audio routing after joining the channel was not as expected: Audio was played from the speaker, not the Bluetooth headphones.

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v4.2.3 [#v423-1]

    v4.2.3 was released on October 11, 2023.

    #### New features [#new-features-45]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `AgoraContentInspectTypeImageModeration` enumeration is added in `AgoraContentInspectType` which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `AgoraContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       In addition, this version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperformed, the error code -4 is returned, indicating the device does not support the feature.

    #### Improvements [#improvements-54]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10% (specific values may vary depending on the device model and platform).

    **Other improvements**

    This release includes the following additional improvements:

    * Optimizes the logic of handling invalid parameters. When you call the `setPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code -2, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crash when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-58]

    This release fixed the following issues:

    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `playEffect [3/3]` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * Calling `takeSnapshotEx` once receives the `snapshotTaken` callback for multiple times.

    #### API changes [#api-changes-32]

    **Added**

    * `enableContentInspectEx`
    * `AgoraContentInspectTypeImageModeration` in `AgoraContentInspectType`.
    * `serverConfig` in `AgoraContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `AgoraFeatureType`

    ### v4.2.2 [#v422-1]

    v4.2.2 was released on July 27, 2023.

    #### New features [#new-features-46]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/deploy-token-server#generate-wildcard-tokens).

       <CalloutContainer type="info">
         <CalloutDescription>
           All 4.x SDKs support using wildcard tokens.
         </CalloutDescription>
       </CalloutContainer>

    2. **Preloading channels**

       This release adds `preloadChannelByToken [1/2]` and `preloadChannelByToken [2/2]` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/deploy-token-server#generate-wildcard-tokens).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `AgoraRtcVideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    4. **Video source types for local preview**

       To allow users in selecting different types of video sources for local video preview, this release introduces `startPreview [2/2]` and `stopPreview [2/2]`. You can call `startPreview [2/2]` and specify the type of video source to be previewed by setting the `sourceType` parameter, and call `stopPreview [2/2]` to stop the video preview.

       <CalloutContainer type="info">
         <CalloutDescription>
           The video source type specified in this method must match the video source type set in the `AgoraRtcVideoCanvas` of the `setupLocalVideo` method.
         </CalloutDescription>
       </CalloutContainer>

    #### Improvements [#improvements-55]

    1. **Improved camera capture effect**

       This release has improved camera capture effect in the following aspects:

       1. Support for camera exposure adjustment

          This release adds `isCameraExposureSupported` to query whether the device supports exposure adjustment and `setCameraExposureFactor` to set the exposure ratio of the camera.

       2. Optimization of default camera selection

          Since this release, the default camera selection behavior of the SDK is aligned with that of the iOS system camera. If the device has multiple rear cameras, better shooting perspectives, zooming capabilities, low-light performance, and depth sensing can be achieved during video capture, thereby improving the quality of video capture.

    2. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    3. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    4. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapAgoraVideoCodecCapInfoInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. The SDK automatically adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    2. To help users understand the reasons for more types of remote video state changes, the `AgoraVideoRemoteReasonCodecNotSupport` enumeration has been added to the `remoteVideoStateChangedOfUid` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-59]

    This release fixed the following issues:

    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.

    #### API changes [#api-changes-33]

    **Added**

    * `startPreview [2/2]`
    * `stopPreview [2/2]`
    * `setCameraExposureFactor`
    * `isCameraExposureSupported`
    * `preloadChannelByToken [1/2]`
    * `preloadChannelByToken [2/2]`
    * `updatePreloadChannelToken`
    * The following members in `AgoraRtcChannelMediaOptions`:
      * `publishThirdCameraTrack`
      * `publishFourthCameraTrack`
      * `publishThirdScreenTrack`
      * `publishFourthScreenTrack`
    * `AgoraVideoCodecCapLevels`
    * `AgoraVideoCodecCapabilityLevel`
    * `backgroundColor` in `AgoraRtcVideoCanvas`
    * `codecLevels` in `CodecCapAgoraVideoCodecCapInfoInfo`
    * `AgoraVideoRemoteReasonCodecNotSupport` in `AgoraVideoRemoteReason`

    ### v4.2.1 [#v421-2]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-56]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-60]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * Occasional crash after calling the `destroyMediaPlayer` method.

    ### v4.2.0 [#v420-2]

    v4.2.0 was released on May 23, 2023.

    #### Compatibility changes [#compatibility-changes-28]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture**

    This release optimizes the APIs for camera and screen capture function. As of v4.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter.

    | Deleted Methods               | Alternative Methods  |
    | :---------------------------- | :------------------- |
    | `startSecondaryCameraCapture` | `startCameraCapture` |
    | `stopSecondaryCameraCapture`  | `stopCameraCapture`  |

    **2. Video data acquisition**

    * The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.
    * The following callbacks are deleted. Get the video source type through the `sourceType` parameter in the `onPreEncodeVideoFrame` and `onCaptureVideoFrame` callbacks.
      * `onScreenCaptureVideoFrame`
      * `onPreEncodeScreenVideoFrame`

    **3. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `AgoraRtcChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `AgoraRtcChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **4. Miscellaneous**

    * `didApiCallExecute` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `enableDualStreamMode`\[1/2] and `enableDualStreamMode`\[2/2] are depredated. Use `setDualStreamMode`\[1/2] and `setDualStreamMode`\[2/2] instead.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx` and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-47]

    **1. AI noise suppression**

    This release introduces the AI noise suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode as balance, aggressive or low latency according to your use-case.

    **2. Enhanced virtual background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the virtual background feature. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak network technologies to enhance the capability and performance of low-quality video streams in meeting scenarios where high bitrates are required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    This release adds the local video mixing feature. You can use the `startLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `updateLocalTranscoderConfiguration` method and the `didLocalVideoTranscoderErrorWithStream` callback. After enabling local video mixing, you can use the `updateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `didLocalVideoTranscoderErrorWithStream` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    #### Improvements [#improvements-57]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced screen share**

    This release adds the `queryScreenCaptureCapability` method, which is used to query the screen capture capabilities of the current device. To ensure optimal screen sharing performance, particularly in enabling high frame rates like 60 fps, Agora recommends you to query the device's maximum supported frame rate using this method beforehand.

    This release also adds the `setScreenCaptureScenario` method, which is used to set the scenario type for screen sharing. The SDK automatically adjusts the smoothness and clarity of the shared screen based on the scenario type you set.

    **3. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **4. Multi-camera capture**

    This release introduces `startCameraCapture`. By calling this method multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras need to be connected.

    **5. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **6. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    #### Issues fixed [#issues-fixed-61]

    This release fixed the following issues:

    * When the host frequently switching the user role between broadcaster and audience in a short period of time, the audience members cannot hear the audio of the host.
    * Occasional loss of the `firstRemoteVideoFrameOfUid` callback during channel media relay.
    * The receiver actively subscribed to the high-quality stream but unexpectedly received a low-quality stream.
    * Abnormal client status cased by an exception in the `onRemoteAudioStateChanged` callback.

    #### API changes [#api-changes-34]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `didLocalVideoTranscoderErrorWithStream`
    * `startLocalVideoTranscoder`
    * `updateLocalTranscoderConfiguration`
    * `queryScreenCaptureCapability`
    * `setScreenCaptureScenario`
    * `setAINSMode`
    * `createCustomAudioTrack`
    * `destroyCustomAudioTrack`
    * `AudioTrackConfig`
    * `AgoraAudioTrackType`
    * `AgoraApplicationScenarioType`
    * `AgoraScreenCaptureFrameRateCapability`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `AgoraRtcEngineConfig`
    * The `channelId` and `uid` parameters in `stateDidChanged` and `informationDidUpdated` callbacks
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `AgoraVirtualBackgroundNone` and `AgoraVirtualBackgroundVideo` enumerators in `AgoraVirtualBackgroundSourceType`

    **Deprecated**

    * `enableDualStreamMode`\[1/2]
    * `enableDualStreamMode`\[2/2]
    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    **Deleted**

    * `startSecondaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `didApiCallExecute`
    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions`
    * `onScreenCaptureVideoFrame`
    * `onPreEncodeScreenVideoFrame`

    ### v4.1.1 [#v411-2]

    v4.1.1 was released on January xx, 2023.

    #### Compatibility changes [#compatibility-changes-29]

    **1. Default video encoding resolution**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    You can call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    <CalloutContainer type="info">
      <CalloutDescription>
        The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Options for subscribing to remote video streams**
    This release changes the name of `setRemoteVideo` to `setRemoteVideoSubscriptionOptions`, and the name of `setRemoteVideoEx` to `setRemoteVideoSubscriptionOptionsEx`. If you upgrade the SDK to this version or later, to avoid affecting your service, ensure that you modify the names of these two methods.

    #### New features [#new-features-48]

    **1. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **2. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `videoRenderingTracingResultOfUid` callback.

    Agora recommends that you use this method in conjunction with the UI settings (such as buttons and sliders) in your app. For example, call this method at the moment when the user clicks the "Join Channel" button, and then get the indicators in the video frame rendering process through the `videoRenderingTracingResultOfUid` callback. This enables developers to facilitate developers to optimize the indicators to improve the user experience.

    #### Improvements [#improvements-58]

    **1. Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode:

    * When the video processing mode is `AgoraVideoFrameProcessModeReadOnly`, the return value is reserved for future use.
    * When the video processing mode is `AgoraVideoFrameProcessModeReadWrite`, the SDK receives the video frame when the return value is `YES`; the video frame is discarded when the return value is `NO`.

    **2. Super resolution**

    This release improves the performance of super resolution. To optimize the usability of super resolution, this release removes `enableRemoteSuperResolution`. Super resolution is now included in the online strategies of video quality enhancement which does not require extra configuration.

    #### Issues fixed [#issues-fixed-62]

    This release fixed the following issues:

    * Playing audio files with a sample rate of 48 kHz failed.
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.
    * At the moment when a user left a channel, a request for leaving was not sent to the server and the leaving behavior was incorrectly determined by the server as timed out.

    #### API changes [#api-changes-35]

    **Added**

    * `enableInstantMediaRendering`
    * `startMediaRenderingTracing`
    * `startMediaRenderingTracingEx`
    * `videoRenderingTracingResultOfUid`
    * `AgoraMediaRenderTraceEvent`
    * `VideoRenderingTracingInfo`

    **Modified**

    * `setRemoteVideo` to `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoEx` to `setRemoteVideoSubscriptionOptionsEx`

    **Deleted**

    * `enableRemoteSuperResolution`
    * Deleted `superResolutionType` in `AgoraRtcRemoteVideoStats`

    ### v4.1.0 [#v410-2]

    v4.1.0 was released on November xx, 2022.

    #### New features [#new-features-49]

    #### **1. Multiple cameras for video capture** [#1-multiple-cameras-for-video-capture]

    This release supports multi-camera video capture. You can call `enableMultiCamera` to enable multi-camera capture mode, call `startSecondaryCameraCapture` to start capturing video from the second camera, and then publish the captured video to the second channel.

    To stop using multi-camera capture, you need to call `stopSecondaryCameraCapture` to stop the second camera capture, then call `enableMultiCamera` and set `enabled` to `NO`.

    **2. Headphone equalization effect**

    This release adds the `setHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call setHeadphoneEQParameters to adjust the EQ.

    **3. Encoded video frame observer**

    This release adds the `setRemoteVideo` method in the `AgoraRtcEngineKit` and `AgoraRtcEngineKitEx` classes. When you call the `setEncodedVideoFrameDelegate` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the API reference.

    **4. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    > To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **5. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `AgoraCameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **6. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * Adds the `leaveChannelEx` \[2/2] method. Compared with the `leaveChannelEx` \[1/2] method, a new `options` parameter is added, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **7. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advancedVideoOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `compressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `encodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **8. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `didClientRoleChanged` callback. The value of this parameter is as follows:

    * `AgoraAudienceLatencyLevelLowLatency` (1): Low latency.
    * `AgoraAudienceLatencyLevelUltraLowLatency` (2): Ultra-low latency.

    #### Improvements [#improvements-59]

    **1. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `AgoraChannelMediaRelayEventUpdateDestinationChannelRefused`(8), and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **2. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **3. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    #### **Other improvements** [#other-improvements-1]

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `AgoraAudioScenarioMeeting` scenario.
    * Improves the smoothness of SDK video rendering.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network scenarios.

    #### **Issues fixed** [#issues-fixed-63]

    This release fixed the following issues:

    * Calling `startAudioMixing` to play music files in the `ipod-library://item` path failed.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
    * Different timestamps for audio and video data were obtained simultaneously and separately via `onRecordAudioFrame` and `onCaptureVideoFrame` callbacks.
    * The call `getExtensionProperty` failed and returned an empty string.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.

    #### **API changes** [#api-changes-36]

    **Added**

    * `enableMultiCamera`
    * `startSecondaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `setHeadphoneEQParameters`
    * `setRemoteVideo`
    * `AgoraVideoSubscriptionOptions`
    * `muteLocalAudioStreamEx`
    * `muteLocalVideoStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `muteAllRemoteVideoStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`
    * `followEncodeDimensionRatio` in `AgoraCameraCapturerConfiguration`
    * `hwEncoderAccelerating` in `AgoraRtcLocalVideoStats`
    * `leaveChannelEx` \[2/2]
    * `advancedVideoOptions` in `AgoraVideoEncoderConfiguration`
    * `newRoleOptions` in `didClientRoleChanged`
    * `adjustUserPlaybackSignalVolumeEx`
    * `enableAudioVolumeIndicationEx`

    **Deprecated**

    * `didApiCallExecute`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes deprecated member parameters `backgroundImage` and `watermark` in `AgoraLiveTranscoding` class.
    * Removes `AgoraChannelMediaRelayEventUpdateDestinationChannelRefused`(8) in `didReceiveChannelMediaRelayEvent`.

    ### v4.0.0 [#v400-2]

    v4.0.0 was released on September 15, 2022.

    #### New features [#new-features-50]

    **2. Full HD and Ultra HD resolution**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capturing, encoding, decoding and rendering. Starting from this version, it supports Full HD (FHD) and Ultra HD (UHD) video resolutions. You can set the `dimensions` parameter to 1920 × 1080 or higher resolution when calling the `setVideoEncoderConfiguration` method. If your device does not support high resolutions, the SDK will automatically fall back to an appropriate resolution.

    <CalloutContainer type="info">
      <CalloutDescription>
        The UHD resolution (4K, 60 fps) is currently in beta and requires certain device performance and network bandwidth. If you want to experience this feature, contact [technical support](mailto\:support@agora.io).

        High resolution typically means higher performance consumption. To avoid a decrease in experience due to insufficient device performance, Agora recommends that you enable FHD and UHD video resolutions on devices with better performance.

        The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    ### v4.2.2 [#v422-2]

    v4.2.2 was released on july 27, 2023.

    #### New features [#new-features-51]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info">
         <CalloutDescription>
           All 4.x SDKs support using wildcard tokens.
         </CalloutDescription>
       </CalloutContainer>

    2. **Preloading channels**

       This release adds `preloadChannelByToken[1/2]` and `preloadChannelByToken[2/2]` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `AgoraRtcVideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    4. **Video source types for local preview**

       To allow users in selecting different types of video sources for local video preview, this release introduces `startPreview[2/2]` and `stopPreview[2/2]`. You can call `startPreview[2/2]` and specify the type of video source to be previewed by setting the `sourceType` parameter, and call `stopPreview[2/2]` to stop the video preview.

       <CalloutContainer type="info">
         <CalloutDescription>
           The video source type specified in this method must match the video source type set in the `AgoraRtcVideoCanvas` of the `setupLocalVideo` method.
         </CalloutDescription>
       </CalloutContainer>

    #### Improvements [#improvements-60]

    1. **Improved camera capture effect**

       This release has improved camera capture effect in the following aspects:

       1. Support for camera exposure adjustment

          This release adds `isCameraExposureSupported` to query whether the device supports exposure adjustment and `setCameraExposureFactor` to set the exposure ratio of the camera.

       2. Optimization of default camera selection

          Since this release, the default camera selection behavior of the SDK is aligned with that of the iOS system camera. If the device has multiple rear cameras, better shooting perspectives, zooming capabilities, low-light performance, and depth sensing can be achieved during video capture, thereby improving the quality of video capture.

    2. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    3. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    4. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapAgoraVideoCodecCapInfoInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. The SDK automacially adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    2. To help users understand the reasons for more types of remote video state changes, the `AgoraVideoRemoteReasonCodecNotSupport` enumeration has been added to the `remoteVideoStateChangedOfUid` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-64]

    This release fixed the following issues:

    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.

    #### API changes [#api-changes-37]

    **Added**

    * `startPreview [2/2]`
    * `stopPreview [2/2]`
    * `setCameraExposureFactor`
    * `isCameraExposureSupported`
    * `preloadChannelByToken [1/2]`
    * `preloadChannelByToken [2/2]`
    * `updatePreloadChannelToken`
    * The following members in `AgoraRtcChannelMediaOptions`:
      * `publishThirdCameraTrack`
      * `publishFourthCameraTrack`
      * `publishThirdScreenTrack`
      * `publishFourthScreenTrack`
    * `AgoraVideoCodecCapLevels`
    * `AgoraVideoCodecCapabilityLevel`
    * `backgroundColor` in `AgoraRtcVideoCanvas`
    * `codecLevels` in `CodecCapAgoraVideoCodecCapInfoInfo`
    * `AgoraVideoRemoteReasonCodecNotSupport` in `AgoraVideoRemoteReason`

    ### v4.2.1 [#v421-3]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-61]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-65]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * Occasional crash after calling the `destroyMediaPlayer` method.

    ### v4.2.0 [#v420-3]

    v4.2.0 was released on May 24, 2023.

    #### Compatibility changes [#compatibility-changes-30]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture**

    This release optimizes the APIs for camera and screen capture function. As of v4.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter.

    | Deleted Methods               | Alternative Methods  |
    | :---------------------------- | :------------------- |
    | `startSecondaryCameraCapture` | `startCameraCapture` |
    | `stopSecondaryCameraCapture`  | `stopCameraCapture`  |

    **2. Video data acquisition**

    The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.

    **3. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `AgoraRtcChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `AgoraRtcChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **4. Miscellaneous**

    * `didApiCallExecute` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `enableDualStreamMode`\[1/2] and `enableDualStreamMode`\[2/2] are deprecated. Use `setDualStreamMode`\[1/2] and `setDualStreamMode`\[2/2] instead.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-52]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode as balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background function. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting scenarios where high bitrates are required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    This release adds the local video mixing feature. You can use the `startLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `updateLocalTranscoderConfiguration` method and the `didLocalVideoTranscoderErrorWithStream` callback. After enabling local video mixing, you can use the `updateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `didLocalVideoTranscoderErrorWithStream` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    #### Improvements [#improvements-62]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced screen share**

    This release adds the `queryScreenCaptureCapability` method, which is used to query the screen capture capabilities of the current device. To ensure optimal screen sharing performance, particularly in enabling high frame rates like 60 fps, Agora recommends you to query the device's maximum supported frame rate using this method beforehand.

    This release also adds the `setScreenCaptureScenario` method, which is used to set the scenario type for screen sharing. The SDK automatically adjusts the smoothness and clarity of the shared screen based on the scenario type you set.

    **3. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **4. Multi-camera capture**

    This release introduces `startCameraCapture`. By calling this method multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras need to be connected.

    **5. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **6. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    #### Issues fixed [#issues-fixed-66]

    This release fixed the following issues:

    * When the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.
    * Occasional loss of the `firstRemoteVideoFrameOfUid` callback during channel media relay.
    * The receiver actively subscribed to the high-quality stream but unexpectedly received a low-quality stream.
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback.

    #### API changes [#api-changes-38]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `didLocalVideoTranscoderErrorWithStream`
    * `startLocalVideoTranscoder`
    * `updateLocalTranscoderConfiguration`
    * `queryScreenCaptureCapability`
    * `setScreenCaptureScenario`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AgoraAudioTrackType`
    * `AgoraApplicationScenarioType`
    * `AgoraScreenCaptureFrameRateCapability`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `AgoraRtcEngineConfig`
    * The `channelId` and `uid` parameters in `stateDidChanged` and `informationDidUpdated` callbacks
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `AgoraVirtualBackgroundNone` and `AgoraVirtualBackgroundVideo` enumerators in `AgoraVirtualBackgroundSourceType`

    **Deprecated**

    * `enableDualStreamMode`\[1/2]
    * `enableDualStreamMode`\[2/2]
    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    **Deleted**

    * `startSecondaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `didApiCallExecute`
    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions`

    ### v4.1.1 [#v411-3]

    v4.1.1 was released on February 8, 2023.

    #### Compatibility changes [#compatibility-changes-31]

    **1. Default video encoding resolution**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    <CalloutContainer type="info">
      <CalloutDescription>
        The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Options for subscribing to remote video streams**

    This release changes the name of `setRemoteVideo` to `setRemoteVideoSubscriptionOptions`, and the name of `setRemoteVideoEx` to `setRemoteVideoSubscriptionOptionsEx`. If you upgrade the SDK to this version or later, to avoid affecting your service, ensure that you modify the names of these two methods.

    #### New features [#new-features-53]

    **1. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **2. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `videoRenderingTracingResultOfUid` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks **Join Channel** and then get the indicators in the video frame rendering process through the `videoRenderingTracingResultOfUid` callback.
    This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-63]

    **1. Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode:

    * When the video processing mode is `AgoraVideoFrameProcessModeReadOnly`, the return value is reserved for future use.
    * When the video processing mode is `AgoraVideoFrameProcessModeReadWrite`, the SDK receives the video frame when the return value is `YES`. The video frame is discarded when the return value is `NO`.

    **2. Super resolution**

    This release improves the performance of super resolution. To optimize the usability of super resolution, this release removes `enableRemoteSuperResolution`. Super resolution is now included in the online strategies of video quality enhancement which does not require extra configuration.

    #### Issues fixed [#issues-fixed-67]

    This release fixed the following issues:

    * Playing audio files with a sample rate of 48 kHz failed.
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.

    #### API changes [#api-changes-39]

    **Added**

    * `enableInstantMediaRendering`
    * `startMediaRenderingTracing`
    * `startMediaRenderingTracingEx`
    * `videoRenderingTracingResultOfUid`
    * `AgoraMediaRenderTraceEvent`
    * `VideoRenderingTracingInfo`

    **Modified**

    * `setRemoteVideo` to `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoEx` to `setRemoteVideoSubscriptionOptionsEx`

    **Deleted**

    * `enableRemoteSuperResolution`
    * `superResolutionType` in `AgoraRtcRemoteVideoStats`

    ### v4.1.0 [#v410-3]

    v4.1.0 was released on December 15, 2022.

    #### New features [#new-features-54]

    #### **1. Multiple cameras for video capture** [#1-multiple-cameras-for-video-capture-1]

    This release supports multi-camera video capture. You can call `enableMultiCamera` to enable multi-camera capture mode, call `startSecondaryCameraCapture` to start capturing video from the second camera, and then publish the captured video to the second channel.

    To stop using multi-camera capture, you need to call `stopSecondaryCameraCapture` to stop the second camera capture, then call `enableMultiCamera` and set `enabled` to `NO`.

    **2. Headphone equalization effect**

    This release adds the `setHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call `setHeadphoneEQParameters` to adjust the EQ.

    **3. Encoded video frame observer**

    This release adds the `setRemoteVideo` method in the `AgoraRtcEngineKit` and `AgoraRtcEngineKitEx` classes. When you call the `setEncodedVideoFrameDelegate` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the API reference.

    **4. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **5. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `AgoraCameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **6. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * Adds the `leaveChannelEx` \[2/2] method. Compared with the `leaveChannelEx` \[1/2] method, a new `options` parameter is added, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **7. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advancedVideoOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `compressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `encodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **8. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `didClientRoleChanged` callback. The value of this parameter is as follows:

    * `AgoraAudienceLatencyLevelLowLatency` (1): Low latency.
    * `AgoraAudienceLatencyLevelUltraLowLatency` (2): Ultra-low latency.

    **9. Brand-new AI Noise Suppression**

    The SDK supports a new version of AI noise reduction (in comparison to the basic AI noise reduction in v3.7.x). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option. To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    **10. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense of presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user, respectively, by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation`, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`, and the receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the hearing of the headphones.

    #### Improvements [#improvements-64]

    **1. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `AgoraChannelMediaRelayEventUpdateDestinationChannelRefused`(8), and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **2. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **3. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `AgoraAudioScenarioMeeting` scenario.
    * Improves the smoothness of SDK video rendering.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network scenarios.

    #### **Issues fixed** [#issues-fixed-68]

    This release fixed the following issues:

    * Calling `startAudioMixing` to play music files in the `ipod-library://item` path failed.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
    * Different timestamps for audio and video data were obtained simultaneously and separately via `onRecordAudioFrame` and `onCaptureVideoFrame` callbacks.
    * The call `getExtensionProperty` failed and returned an empty string.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.

    #### **API changes** [#api-changes-40]

    **Added**

    * `enableMultiCamera`
    * `startSecondaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `setHeadphoneEQParameters`
    * `setRemoteVideo`
    * `AgoraVideoSubscriptionOptions`
    * `muteLocalAudioStreamEx`
    * `muteLocalVideoStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `muteAllRemoteVideoStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`
    * `followEncodeDimensionRatio` in `AgoraCameraCapturerConfiguration`
    * `hwEncoderAccelerating` in `AgoraRtcLocalVideoStats`
    * `leaveChannelEx` \[2/2]
    * `advancedVideoOptions` in `AgoraVideoEncoderConfiguration`
    * `newRoleOptions` in `didClientRoleChanged`
    * `adjustUserPlaybackSignalVolumeEx`
    * `enableAudioVolumeIndicationEx`

    **Deprecated**

    * `didApiCallExecute`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes deprecated member parameters `backgroundImage` and `watermark` in `AgoraLiveTranscoding` class.
    * Removes `AgoraChannelMediaRelayEventUpdateDestinationChannelRefused`(8) in `didReceiveChannelMediaRelayEvent`.

    ### v4.0.1 [#v401-2]

    v4.0.1 was released on September 29, 2022.

    #### Compatibility changes [#compatibility-changes-32]

    1. To improve code usability, this release changes the parameters in optional type in the following classes to basic data types such as ` bool` and `int`:

    * `isAgoraSource` and `isLiveSource` in `AgoraMediaSource` is changed from optional to bool.
    * All parameter types in `AgoraRtcChannelMediaOptions` are changed from `optional` to `bool` or `int`.

    #### New features [#new-features-55]

    **1. In-ear monitoring**

    This release adds `getEarMonitoringAudioParams` callback to set the audio data format of the in-ear monitoring. You can use your own audio effect processing module to pre-process the audio frame data of the in-ear monitoring to implement custom audio effects. After calling `setAudioFrameDelegate` to register the audio observer, set the audio data format in the return value of the `getEarMonitoringAudioParams` callback. The SDK calculates the sampling interval based on the return value of the callback, and triggers the `onEarMonitoringAudioFrame` callback based on the sampling interval.

    **2. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use, including UNKNOWN, DISCONNECTED, LAN, WIFI, 2G, 3G, 4G, 5G. When the local network connection type changes, the SDK triggers the `networkTypeChangedToType` callback to report the current network connection type.

    **3. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports 3 audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; you can contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Meanwhile, Agora supports publishers to choose whether or not the audio streams being published are to be filtered based on volume. Streams that are not filtered will bypass this filter mechanism and transported directly to the receivers. In use-cases where there are a number of publishers, enabling this function helps reducing the bandwidth and device system pressure for the receivers.

    To enable this function, contact [support@agora.io](mailto\:support@agora.io).

    #### API changes [#api-changes-41]

    **Added**

    * `getEarMonitoringAudioParams`

    * `getNetworkType`

    * `isAudioFilterable` in the `ChannelMediaOptions`

    * `setZones`

    * `setPlayerAttenuation`

    * `setRemoteAudioAttenuation`

    * `muteRemoteAudioStream`

    * `SpatialAudioParams`

    * `setHeadphoneEQPreset`

    * `AgoraHeadphoneEQPreset`

    **Deprecated**

    * `startEchoTest` \[2/3]

    ### v4.0.0 [#v400-3]

    v4.0.0 was released on September 15, 2022.

    #### Compatibility changes [#compatibility-changes-33]

    **1. Integration change**

    This release has optimized the implementation of some features, resulting in incompatibility with v3.7.x. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Custom video capture and rendering (Media IO)
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migrate from v3.7.x to v4.0.0](/en/realtime-media/video/reference/migration-guide).

    #### New features [#new-features-56]

    **1. Multiple media tracks**

    This release supports one `AgoraRtcEngineKit` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `AgoraRtcEngineKit(Ex)` and `AgoraRtcChannelMediaOptions`.

    * After calling `joinChannelByToken` to join the first channel, call `joinChannelExByToken` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `AgoraRtcChannelMediaOptions` settings.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).

    **2. Full HD and Ultra HD resolution (Beta)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capturing, encoding, decoding and rendering. Starting from this version, it supports Full HD (FHD) and Ultra HD (UHD) video resolutions. You can set the `dimensions` parameter to 1920 × 1080 or higher resolution when calling the `setVideoEncoderConfiguration` method. If your device does not support high resolutions, the SDK will automatically fall back to an appropriate resolution.

    The UHD resolution (4K, 60 fps) is currently in beta and requires certain device performance and network bandwidth. If you want to enable this feature, contact [technical support](mailto\:support@agora.io).

    High resolution typically means higher performance consumption. To avoid a decrease in experience due to insufficient device performance, Agora recommends that you enable FHD and UHD video resolutions on devices with better performance.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayerWithDelegate` method to create a media player object, you can then call the methods in the `AgoraRtcMediaPlayerProtocol` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    **4. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `AgoraVoiceBeautifierUltraHighQuality` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Spatial audio**

    This feature is in experimental status. To enable this feature, contact [support@agora.io](mailto\:support@agora.io). Contact [Technical Support](mailto\:support@agora.io) if needed.

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `AgoraLocalSpatialAudioKit` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `updateSelfPosition` and `updateRemotePosition` to update the spatial coordinates of the local and remote users, respectively, so that the local user can hear the spatial audio effect of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    You can also set the spatial audio for the media player as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `AgoraLocalSpatialAudioKit` class to implement spatial audio. You need to call `updateSelfPosition` and `updatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    **6. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AgoraAudioScenarioChorus` enumeration in `AgoraAudioScenario`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **7. Extensions from the Agora extensions marketplace**

    In order to enhance the real-time audio and video interactive activities based on the Agora SDK, this release supports the one-stop solution for the extensions from the [Agora extensions marketplace](https://api-ref.agora.io/en/agora-extensions-marketplace/):

    * Easy to integrate: The integration of modular functions can be achieved simply by calling an API, and the integration efficiency is improved by nearly 95%.
    * Extensibility design: The modular and extensible SDK design style endows the Agora SDK with good extensibility, which enables developers to quickly build real-time interactive apps based on the Agora extensions marketplace ecosystem.
    * Build an ecosystem: A community of real-time audio and video apps has developed that can accommodate a wide range of developers, offering a variety of extension combinations. After integrating the extensions, developers can build richer real-time interactive functions. For details, see [Use an Extension](/en/realtime-media/video/build/customize-audio-processing/use-an-extension).
    * Become a vendor: Vendors can integrate their products with Agora SDK in the form of extensions, display and publish them in the Agora extensions marketplace, and build a real-time interactive ecosystem for developers together with Agora. For details on how to develop and publish extensions, see [Become a Vendor](/en/api-reference/api-ref/extensions-marketplace/provisioning).

    **8. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `AgoraRtcChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio sources.
    * Sets or switches channel profile and user role.
    * Controls audio publishing delay.

    Set `AgoraRtcChannelMediaOptions` when calling `joinChannelByToken` or `joinChannelExByToken` to specify the publishing and subscription behavior of a media stream, for example, whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelWithMediaOptions` to update the settings in `AgoraRtcChannelMediaOptions` at any time, for example, to switch the published audio sources.

    **9. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function in the following ways.

    * Call the `StartScreenCapture` method before joining a channel, and then call `JoinChannelByToken` \[2/4] to join a channel and set `publishScreenCaptureVideo` as `YES`.
    * Call the `StartScreenCapture` method after joining a channel, and then call `updateChannelWithMediaOptions` to set `publishScreenCaptureVideo` as `YES`.

    **10. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio streams. You can add a user ID that you want to subscribe to in your allowlist, or add a user ID for the streams you do not wish to see to your blocklists. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `AgoraRtcEngineKit(Ex)` interface:

    * `setSubscribeAudioBlacklist`：Set the audio subscription blocklist.
    * `setSubscribeAudioWhitelist`：Set the audio subscription allowlist.

    If a user is added in a blocklist and a allowlist at the same time, only the blocklist takes effect.

    **11. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `setAudioScenario` method. For example, if you want to change the audio scenario from `AgoraAudioScenarioDefault` to `AgoraAudioScenarioGameStreaming` when you are in a channel, you can call this method.

    #### Improvements [#improvements-65]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `switchChannelByToken` in v3.7.x through the `leaveChannel` and `joinChannelByToken` methods so that you don't need to take the time to call the `switchChannelByToken` method.

    **2. Voice pitch of the local user**
    This release adds `voicePitch` in `AgoraRtcAudioVolumeInfo` of `reportAudioVolumeIndicationOfSpeakers`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="macos">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="macos" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-3]

    ### Known issues [#known-issues-3]

    ### v4.6.2 [#v462-3]

    Released on January 19, 2026.

    #### New features [#new-features-57]

    Included in this release:

    * **Support for getting audio buffer delay**

      To address the issue where the main vocal and background accompaniment may be out of sync in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module to get the millisecond-level audio buffer delay when playing media files.

    #### Improvements [#improvements-66]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `networkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **Support for window foreground sharing**

      Fixes an issue where window foreground sharing did not work on macOS 14 and above. Add the `NSAccessibilityUsageDescription` permission in your project's `plist`. After adding, the system prompts the user to grant accessibility access, enabling window foreground sharing.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Adds error codes `AgoraErrorCodePcmSendFormat (200)` and `AgoraErrorCodePcmSendBufferOverflow (201)` to report PCM data transmission errors.

    #### Compatibility changes [#compatibility-changes-34]

    This release introduces the following compatibility changes:

    * **Support for custom encoding frame rate**

      The data type of the `frameRate` parameter in `AgoraVideoEncoderConfiguration` changed from an enumeration to an `Int`. During integration, refer to the original `AgoraVideoFrameRate` enum values for configuration.

    * **Decoder plugins built into the SDK**

      The relevant decoder plugins are now built into the SDK to ensure overall decoding compatibility.

    ### v4.6.0 [#v460-3]

    Released on August 26, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        The version of the aosl.xcframework library in the v4.6.0 SDK is 1.3.0. You can find the library version information in Info.plist.
      </CalloutDescription>
    </CalloutContainer>

    #### Compatibility changes [#compatibility-changes-35]

    This version includes SDK behavior changes, API deprecations, and deletions. To ensure your app functions correctly, update your code after upgrading to this version.

    For details on deprecated and deleted APIs in each version, see the [API Sunset Notice](/en/api-reference/api-ref/video/api-sunset).

    * **Deprecation of direct CDN streaming APIs**

      Deprecates the APIs related to direct CDN streaming, which will be removed in a future release. Agora recommends using [Media Push](/en/realtime-media/media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration:`
      * `setDirectCdnStreamingVideoConfiguration:`
      * `startDirectCdnStreaming:publishUrl:mediaOptions:`
      * `stopDirectCdnStreaming`
      * `rtcEngine:didDirectCdnStreamingStateChanged:reason:message:`
      * `AgoraDirectCdnStreamingMediaOptions`
      * `AgoraDirectCdnStreamingStats`
      * `AgoraDirectCdnStreamingState`
      * `AgoraDirectCdnStreamingReason`

    * **Deprecation of virtual metronome APIs**

      Deprecates the APIs for the virtual metronome feature, which will be removed in a future release.

      * `startRhythmPlayer:sound2:config:`
      * `configRhythmPlayer:`
      * `rtcEngine:didRhythmPlayerStateChanged:reason:`

    * **Deprecation of watermark APIs**

      Deprecates the old watermark APIs. Agora recommends using the new watermark APIs introduced in this version.

      * `addVideoWatermark:options:`
      * `addVideoWatermarkEx:options:connection:`

    * **Deletion of redundant APIs**

      Removed the following redundant APIs and parameters:

      * `setLocalPublishFallbackOption:`
      * `rtcEngine:didLocalPublishFallbackToAudioOnly:`
      * `downlinkNetworkInfoUpdate`
      * `wlAccStats`
      * `AgoraWlAccReason`
      * `AgoraWlAccAction`
      * `rtcEngine:wlAccStats:averageStats:`
      * `rtcEngine:wlAccMessage:action:wlAccMsg:`
      * `enableWirelessAccelerate`
      * `receivedFrameRate` (removed from `AgoraRtcRemoteVideoStats`)

    * **Changes to int UID and string UID mapping**

      * Before v4.6.0: If `registerLocalUserAccountWithAppID:userAccount:` was used to register a string UID (for example, "aa") and obtain an int UID (for example, 123), joining a channel later with the int UID automatically mapped it to the original string UID ("aa").
      * From v4.6.0: The SDK no longer automatically maps an int UID to the original string UID. If `registerLocalUserAccountWithAppID:userAccount:` was called to get an int UID but the channel needs to be joined with the original string UID, call `joinChannelByUserAccount:token:channelId:joinSuccess:` directly with the string UID. After upgrading, review and update app logic to ensure users join the channel with the expected identity.

    * **Added domain whitelist**

      If you have upgraded from a previous SDK version to v4.6.0 and are using the domain whitelist feature (set `domainLimit` in `AgoraRtcEngineConfig` to `YES`), add the following domains to the whitelist to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    #### New features [#new-features-58]

    * **Simulcasting multi-bitrate video streams (Beta)**

      Added support for sending multiple video streams of different resolutions from a single video source, including in multi-channel scenarios. You can now configure up to four layers: one high-resolution stream and up to three lower-resolution streams. Use configuration options to define resolution, bitrate, and whether to automatically reduce the number of streams when network or device performance drops. Subscribers can choose which stream to receive based on their network conditions. This feature helps developers deliver smooth experiences in scenarios such as conferences, large classes, and interactive live streaming, even when network conditions are poor.

    * **Multipath network transmission**

    Introduced multipath transmission for devices with multiple network interfaces (for example, 5G, Wi-Fi, and LAN). This feature effectively reduces or eliminates experience degradation caused by poor network conditions, making it suitable for real-time audio and video communication scenarios that demand high transmission stability, such as in-vehicle systems, IoT, trains, and highways. Enable it by setting `enableMultipath` in `AgoraRtcChannelMediaOptions` to `YES`.

    * *Dynamic mode*: Dynamically selects the optimal path based on network conditions. Optionally set `preferMultipathType` to prioritize a path type. If not set, all path types have the same default weight.
    * *Duplicate mode*: Sends data simultaneously over all available paths for maximum stability. This mode incurs additional costs and eliminates the impact of poor network conditions.

    Configure uplink and downlink modes separately with `uplinkMultipathMode` and `downlinkMultipathMode`. Monitor performance with the `rtcEngine:didMultipathStatsChanged:` callback, which reports real-time transmission statistics for each path, including data consumption. Contact [support@agora.io](mailto\:support@agora.io) to enable duplicate mode.

    * **Video quality scoring**

    Added the `mosValue` member to `AgoraRtcRemoteVideoStats` to report a score from 1 (extremely poor with severe blurring) to 5 (excellent with clear image and no artifacts) for received video quality. This enables real-time monitoring of the subjective quality of remote video streams, which helps in dynamically adjusting video parameters for quality monitoring and alerting. Contact [support@agora.io](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

    Introduced `addVideoWatermarkWithImageUrl:options:` and `addVideoWatermarkWithImageUrlEx:options:connection:`, which support multiple watermarks with IDs and layering order. Remove a specific watermark using `removeVideoWatermark:`.

    * **Asynchronous engine destruction**

    Added the `destroy:` method, supporting synchronous or asynchronous engine destruction. In asynchronous mode, the SDK triggers the `engineReleasedBlock` callback.

    * **Token renewal result callback**

    Added the `rtcEngine:didRenewTokenResult:` callback and `RENEW_TOKEN_ERROR_CODE` to report the result of `renewToken:`. This allows developers to handle Token renewal failures promptly within the callback.

    * **Advanced beauty (Beta)**

    Introduced a brand-new advanced beauty feature, delivering a powerful yet easy-to-use beautification solution.

    * **Precision beauty effects**
      * *Face shaping*: Supports independent fine-tuning of 29 facial areas (for example, slimming face, enlarging eyes, narrowing nose) or one-click natural effects via presets.
      * *Style makeup*: Offers rich effects including eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
      * *Skin enhancement*: Includes professional skin optimizations such as teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.

    * **Unified and simple API**
      Manage all beauty, makeup, and filter functions through three core nodes — `BEAUTY`, `STYLE_MAKEUP`, and `FILTER` — using `IVideoEffectObject` for unified parameter setup and lifecycle control.

    * **Ready-to-use presets**
      Integrates multiple out-of-the-box style templates (for example, "Natural Beauty," "Senior Makeup," "Cool White Filter") for instant polished results.

    * **Dynamic parameter control**
      Enables real-time reading and modification of granular parameters (for example, smoothing strength, lipstick type) via key-value pairs, with support for saving custom configurations and resetting defaults.

    * **Local resource guarantee**
      All beauty resources (effects, filters, makeup) are packaged as local bundle files, ensuring stability and reliability.

    * **Other new features**

    * Added `setPlaybackAudioFrameBeforeMixingParameters:` to configure the format of raw audio frames returned in `onPlaybackAudioFrameBeforeMixing:channelId:uid:`, including sample rate, number of channels, and the number of samples per callback.

    * Added `preloadEffectEx:soundId:` to preload audio effects into a specific channel. Supports both local and online audio files, enabling faster playback later and is suitable for multi-channel scenarios.

    * Added `playEffectEx:soundId:filePath:loopCount:pitch:pan:gain:publish:startPos:` for advanced audio effect playback in a specific channel with parameters such as loop count, pitch, spatial position, volume, whether to publish to the channel, and the starting playback position.

    * Added the `position` member in `AgoraContentInspectModule` to choose the capture point for screenshot uploads from either the raw video data or the video stream before or after effects processing.

    * Added the `screenColorType` member to `AgoraSegmentationProperty` for specifying or auto-detecting background screen color (green, blue, or auto-detect) to improve the accuracy and stability of portrait segmentation when using virtual backgrounds.

    #### Improvements [#improvements-67]

    * Added support for G.711 and G.722 audio codecs when interoperating with the Web SDK for improved cross-platform audio compatibility and clarity.
    * Improved video clarity in screen sharing scenarios involving documents.

    #### Issues fixed [#issues-fixed-69]

    This version fixes the following issues:

    * Online audio effect playback restarted from the beginning when `seekToPosition:` was called.
    * Occasional echoes in media volume mode when publishing a microphone stream while simultaneously playing effects with `playEffect:filePath:loopCount:pitch:pan:gain:publish:startPos:` and music with `startAudioMixing:loopback:cycle:startPos:`.
    * Missing media metadata observer callback in cases where `setMediaMetadataDelegate:withType:` was called after `setExternalVideoSource:useTexture:sourceType:`.
    * Occasional crashes.
    * Media relay occasionally reported `AgoraChannelMediaRelayStateFailure` and `AgoraChannelMediaRelayErrorServerErrorResponse` after the following sequence: join, relay, unpublish, leave, rejoin, and start relay again.

    ### v4.5.2 [#v452-2]

    v4.5.2 was released on April 22, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `aosl.xcframework` library version in Video SDK v4.5.2 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

    #### Issues fixed [#issues-fixed-70]

    This release fixes the following issues:

    * While playing a multi-track media file, noise was heard after adjusting the audio pitch using `setAudioPitch`.
    * When the host called `createCustomAudioTrack:config:` to create a custom audio track with `trackType` set to `AUDIO_TRACK_DIRECT`, then called `pushExternalAudioFrameRawData:samples:sampleRate:channels:trackId:timestamp:` to push custom audio frames to a channel, and finally called `playEffect:filePath:loopCount:pitch:pan:gain:publish:startPos:` to play an audio effect, audience members in the channel heard noise.
    * Apps using the SDK occasionally experienced UI lag caused by main thread blocking during audio and video interactions.
    * Calling `openWithMediaSource:` and setting `isLiveSource` to `YES` in the source parameter to play a video stream caused playback failure.
    * When the sender transmitted multi-channel encoded audio, noise was occasionally heard by the receiver.
    * When the app integrated a media player and called `open` twice to load different media resources consecutively, the second call incorrectly triggered the `AgoraRtcMediaPlayer:infoUpdated:` callback with information from the first media resource.
    * After enabling user volume indication with `enableAudioVolumeIndication:smooth:reportVad:`, the `rtcEngine:reportAudioVolumeIndicationOfSpeakers:totalVolume:` callback reported a local user volume of 0 for both local and remote users.
    * When you called `enableVideoImageSource:options:` to enable the video image source feature, the sender streamed successfully but the `rtcEngine:didVideoPublishStateChange:sourceType:oldState:newState:elapseSinceLastState:` callback occasionally did not return the expected result.
    * In multi-channel scenarios, if the app called `setupRemoteVideoEx:connection:` to initialize the remote user's view before successfully calling `joinChannelExByToken:connection:delegate:mediaOptions:`, the view failed to display correctly.

    ### v4.5.1 [#v451-2]

    v4.5.1 was released on March 4, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `aosl.xcframework` library version in Video SDK v4.5.1 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

    #### New Features [#new-features-59]

    1. **AI Conversation Scenario**

       This version introduces the `AgoraAudioScenarioAiClient` audio scenario, specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on the characteristics of AI-generated voices, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. The optimization enhances conversation continuity and reliability, adapting to various challenging network environments.

    #### Issues Fixed [#issues-fixed-71]

    This release resolves the following issues:

    * When joining two or more channels simultaneously and calling `takeSnapshotEx:uid:filePath:` to capture local video stream screenshots consecutively, the first channel's screenshot failed.
    * When using the `pause` method to pause playback, then calling `seekToPosition:` to move to a specific position, and finally calling `play`, the Media Player resumed from the paused position instead of the specified position.
    * When using the Media Player, the file path of the media resource returned by `getPlaySrc` did not update after calling `switchSrc:syncPts:` to switch to a new media resource.
    * In interactive live streaming scenarios, after joining a channel as an audience member using a `string` user ID, audio occasionally became unsynchronized with video.
    * AI noise suppression and AI echo cancellation plugins sometimes failed when used together.

    ### v4.5.0 [#v450-3]

    v4.5.0 was released on November 27, 2024.

    #### Compatibility changes [#compatibility-changes-36]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="warning">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        As of v4.5.0, both Video SDK and Signaling SDK (v2.2.0 and above) include the `aosl.xcframework` library. If you manually integrate Video SDK via CDN and also use Signaling SDK, delete the earlier version of the `aosl.xcframework` library to avoid conflicts. The `aosl.xcframework` library version in Video SDK v4.5.0 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

    1. **Automatic installation of virtual sound card**

       Starting from this version, the SDK supports the automatic installation of a virtual sound card. When you call [`enableLoopbackRecording:deviceName:`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableloopbackrecording\(_\:devicename:\)) for the first time, the SDK will automatically install the AgoraALD, a virtual sound card developed by Agora. Once the installation is successful, the audio routing will automatically switch to the virtual sound card, and the virtual sound card will be used for audio capture.

    2. **Changes in strong video noise suppression**

       This version adjusts the implementation of strong video noise suppression.[`AgoraVideoDenoiserLevel`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoravideodenoiserlevel) removes `AgoraVideoDenoiserLevelStrength`. Instead, after enabling video noise suppression by calling [`setVideoDenoiserOptions:options:`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setvideodenoiseroptions\(_\:options:\)), you can call the [`setBeautyEffectOptions:options:`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setbeautyeffectoptions\(_\:options:\)) method to enable the beauty skin smoothing feature. Using both together will help achieve better noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions:options:`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, you need to enable video noise suppression first and use specific settings as detailed in [`setLowlightEnhanceOptions:options:`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setlowlightenhanceoptions\(_\:options:\)).

    3. **Changes in camera plug and unplug status**

       In previous versions, the camera would not automatically resume capture after being unplugged and replugged. Starting from this version, the camera will automatically resume capture after being replugged.

    4. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`AgoraCompressionPreference`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoracompressionpreference) enumeration class, a new `AgoraCompressionAuto` (-1) enumeration is added, replacing the original `AgoraCompressionQuality` (1) as the default value. In this mode, the SDK will automatically choose between `AgoraCompressionLowLatency` or `AgoraCompressionQuality` based on your video scene settings to achieve the best user experience.
       * In the [`AgoraDegradationPreference`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoradegradationpreference) enumeration class, a new `AgoraDegradationMaintainAuto` (-1) enumeration is added, replacing the original `AgoraDegradationMaintainQuality` (1) as the default value. In this mode, the SDK will automatically choose between `AgoraDegradationMaintainFramerate`, `AgoraDegradationBalanced`, or `AgoraDegradationMaintainResolution` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    #### New features [#new-features-60]

    1. **Live show scenario**

       This version adds the `AgoraApplicationLiveShowScenario`(3) (Live Show) enumeration to [`AgoraApplicationScenarioType`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraapplicationscenariotype). You can call [`setVideoScenario:`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setvideoscenario\(_:\)) to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency for better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the `setLocalRenderTargetFps` and `setRemoteRenderTargetFps` methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (for example, screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the `setFilterEffectOptions:options:sourceType:` method. You can pass a cube map file (`.cube`) in the `config` parameter to apply custom filter effects such as whitening, vivid, cool, black and white, and others. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file to quickly apply a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the `startLocalAudioMixer` method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * When using the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **Color space settings**

       This version adds the `colorSpace` parameter to [`AgoraOutputVideoFrame`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraoutputvideoframe) and [`AgoraVideoFrame`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoravideoframe). You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    6. **Others**

       * The `rtcEngine:device:type:stateChanged:` callback supports reporting that the device has been plugged in.

    #### Improvements [#improvements-68]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the `takeSnapshotWithConfig:config:` and `takeSnapshotExWithConfig:uid:config:` methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AgoraAudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraaudiotrackconfig), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `NO`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * This version optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * When calling `switchSrc:syncPts:` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `AgoraRtcMediaPlayer:didOccurEvent:elapsedTime:message:` callback will report the `AgoraMediaPlayerEventSwitchError` event, indicating that an error occurred during media resource switching.
       * When calling `setPlaybackSpeed:` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Bug fixes [#bug-fixes-4]

    This version fixes the following issue:

    * Calling `startAudioMixing:loopback:cycle:` and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.

    ### v4.4.0 [#v440-3]

    v4.4.0 was released on August 5, 2024.

    #### Compatibility changes [#compatibility-changes-37]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        Starting from v4.4.0, the SDK provides an API sunset notice, which includes information about deprecated and removed APIs in each version. See [API sunset notice](/en/api-reference/api-ref/video/api-sunset).
      </CalloutDescription>
    </CalloutContainer>

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see table below). You can identify the extension name, the user ID, and the service provider name through `AgoraExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onEvent`            | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    2. This version renames the `receiveMetadata` callback to `didMetadataReceived` and removes the `data` and `timeStamp` parameters. You can get metadata-related information, including `timeStamp` (timestamp of the sent data), `uid` (user ID), and `channelId` (channel name) through the newly-added `metadata` parameter.

    #### New features [#new-features-61]

    1. **Alpha transparency effects**

       This version introduces the Alpha transparency effects feature, supporting the transmission and rendering of Alpha channel data in video frames for SDK capture and custom capture use-cases, enabling transparent gift effects, custom backgrounds on the receiver end, and so on:

       * `AgoraOutputVideoFrame` and `AgoraVideoFrame` add the `alphaBuffer` member, which sets the Alpha channel data.
       * `AgoraVideoFrame` adds the `fillAlphaBuffer` member. For BGRA or RGBA formatted video data, it sets whether to automatically extract the Alpha channel data and fill it into `alphaBuffer`.
       * `AgoraOutputVideoFrame` and `AgoraVideoFrame` add the `alphaStitchMode` member, which sets the relative position of `alphaBuffer` and video frame stitching.

       Additionally, `AgoraAdvancedVideoOptions` adds a new member `encodeAlpha`, which is used to set whether to encode and send Alpha information to the remote end. By default, the SDK does not encode and send Alpha information; if you need to encode and send Alpha information to the remote end (for example, when virtual background is enabled), explicitly call `setVideoEncoderConfiguration` to set the video encoding properties and set `encodeAlpha` to `YES`.

    2. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method and passing in the sound effect types supported in the `AgoraVoiceAITunerType` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-69]

    1. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    2. **Other improvements**

       This version also includes the following improvements:

       * Optimizes transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * The `AgoraLocalVideoStreamReasonScreenCaptureDisplayDisconnected` enumerator is added in `localVideoStateChangedOfState` callback, indicating that the display used for screen capture has been disconnected.
       * Optimizes the video link for window sharing, reducing CPU usage.
       * Deprecates redundant enumeration values `AgoraClientRoleChangeFailedRequestTimeout` and `AgoraClientRoleChangeFailedConnectionFailed` in `AgoraClientRoleChangeFailedReason`.

    ### v4.3.2 [#v432-2]

    v4.3.2 was released on June 4, 2024.

    #### Improvements [#improvements-70]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setremotesubscribefallbackoption\(_:\)) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    #### Issues fixed [#issues-fixed-72]

    This version fixed the following issues:

    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app occasionally crashed when remote users left the channel.

    ### v4.3.1 [#v431-2]

    v4.3.1 was released on April 29, 2024.

    #### New features [#new-features-62]

    1. **Portrait center stage**

       To enhance the presentation effect in online meetings, shows, and online education use-cases, this version introduces the [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecameracenterstage\(_:\)) method to activate the portrait center stage. This ensures that presenters, regardless of movement, always remain centered in the video frame, achieving better presentation effects.

       Before enabling the portrait center stage, it is recommended to verify whether your current device supports this feature by calling [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/iscameracenterstagesupported\(\)). A list of supported devices can be found in the API documentation at [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecameracenterstage\(_:\)).

    2. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [AgoraEncryptionConfig](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraencryptionconfig) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableencryption\(_\:encryptionconfig:\)). If there are issues causing failures in data stream encryption or decryption, these can be identified by the newly added `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE` and `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE` enumerations.

    3. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate the dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode \[2/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setdualstreammode\(_\:streamconfig:\)), the SDK defaults to the following behaviors:

       * The default encoding resolution for low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the small streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    4. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableencryptionex\(_\:encryptionconfig\:connection:\)) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\)) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/getcallidex\(_:\)) is introduced for retrieving call IDs in multi-channel use-cases.

    5. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-71]

    1. **Optimization of local video status callbacks**

       To facilitate understanding of the specific reasons for changes in local video status, this version adds the following enumerations to the [localVideoStateChangedOf](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:localvideostatechangedof\:reason\:sourcetype:\)) callback's [AgoraLocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoralocalvideostreamreason) enumeration class:

       * `AgoraLocalVideoStreamReasonScreenCaptureRecoverFromMinimized`(27): The window being captured for screen sharing has recovered from a minimized state.

    2. **Audio device type detection**

       This version adds the `deviceTypeName` member to `AgoraRtcDeviceInfo`, used to identify the type of audio devices, such as built-in, USB, HDMI, etc.

    3. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure (especially around the fingers) are more stable, significantly reducing flickering at the edges.

    4. **Custom audio capture optimization**

       To enhance the flexibility of custom audio capture, this release deprecates [pushExternalAudioFrameSampleBuffer \[1/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\)) and introduces [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_\:samplerate\:channels\:trackid:\)). Compared to the deprecated method, the new method adds parameters such as `sampleRate`, `channels`, and `trackId`. These support pushing external CMSampleBuffer audio data to the channel via custom audio tracks, and allow for the setting of sample rates and channel counts for external audio sources.

    5. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `AgoraEarMonitoringFilterReusePostProcessingFilter` in `AgoraEarMonitoringFilterType`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    6. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen-sharing use-cases to save system performance overhead.
       * For macOS 14 and above, optimization of [getScreenCaptureSourcesWithThumbSize](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/getscreencapturesources\(withthumbsize\:iconsize\:includescreen:\)) behavior. From this version onward, the method automatically filters out widget windows from the list of available window resources.
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * In [AgoraAudioEffectPreset](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraaudioeffectpreset), a new enumeration `AgoraAudioEffectPresetRoomAcousticsChorus` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [AgoraRtcRemoteAudioStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcremoteaudiostats), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending end to when the audio is played on the receiving end.

    #### Issues fixed [#issues-fixed-73]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * When a user plugged and unplugged a Bluetooth or wired headset once, the audio state change callback `stateChanged` was triggered multiple times.
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-42]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecameracenterstage\(_:\))
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/iscameracenterstagesupported\(\))
    * The following enumeration in [AgoraLocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoralocalvideostreamreason):
      * `AgoraLocalVideoStreamReasonScreenCaptureRecoverFromMinimized`
    * [setFaceInfoDelegate](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setfaceinfodelegate\(_:\))
    * [AgoraFaceInfoDelegate](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorafaceinfodelegate)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorafaceinfodelegate/onfaceinfo\(_:\))
    * The `publishLipSyncTrack` member in [AgoraRtcChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcchannelmediaoptions)
    * [AgoraMediaSourceType](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoramediasourcetype) adds `AgoraMediaSourceTypeSpeechDriven`
    * [AgoraVideoSourceType](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoravideosourcetype) adds `AgoraVideoSourceTypeSpeechDriven`
    * [AgoraEncryptionConfig](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraencryptionconfig) adds `datastreamEncryptionEnabled`
    * [AgoraEncryptionErrorType](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraencryptionerrortype) adds the following enumerations:
      * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
      * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [AgoraRtcDeviceInfo](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcdeviceinfo) adds `deviceTypeName`
    * [AgoraRtcRemoteAudioStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcremoteaudiostats) adds `e2eDelay`
    * [AgoraErrorCode](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraerrorcode) adds `AgoraErrorCodeDatastreamDecryptionFailed`
    * [AgoraAudioEffectPreset](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraaudioeffectpreset) adds `AgoraAudioEffectPresetRoomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/getcallidex\(_:\))
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableencryptionex\(_\:encryptionconfig\:connection:\))
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\))
    * [AgoraEarMonitoringFilterType](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraearmonitoringfiltertype) adds a new enumeration `AgoraEarMonitoringFilterBuiltInAudioFilters`
    * [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_\:samplerate\:channels\:trackid:\))

    **Deprecated**

    * [pushExternalAudioFrameSampleBuffer \[1/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\))

    ### v4.3.0 [#v430-3]

    v4.3.0 was released on February 22, 2024.

    #### Compatibility changes [#compatibility-changes-38]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, you need to update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Please modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `localAudioStateChanged`           | `error`                 | `reason`           |
       | `localVideoStateChanged`           | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `didChangedToState`                | `error`                 | `reason`           |
       | `rtmpStreamingChangedToState`      | `errCode`               | `reason`           |

       | Original enumeration class     | New enumeration class           |
       | ------------------------------ | ------------------------------- |
       | `AgoraAudioLocalError`         | `AgoraAudioLocalReason`         |
       | `AgoraLocalVideoStreamError`   | `AgoraLocalVideoStreamReason`   |
       | `AgoraDirectCdnStreamingError` | `AgoraDirectCdnStreamingReason` |
       | `AgoraMediaPlayerError`        | `AgoraMediaPlayerReason`        |
       | `AgoraRtmpStreamingError`      | `AgoraRtmpStreamingReason`      |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                              | Alternative methods and callbacks  |
       | ---------------------------------------------------------- | ---------------------------------- |
       | `startChannelMediaRelay`<br />`updateChannelMediaRelay`    | `startOrUpdateChannelMediaRelay`   |
       | * `startChannelMediaRelayEx`
       * `updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `didReceiveChannelMediaRelayEvent`                         | `channelMediaRelayStateDidChange`  |

    3. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [AgoraLocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoralocalvideostreamreason) class:

       * The `AgoraLocalVideoStreamErrorEncodeFailure` enumeration has been changed to `AgoraLocalVideoStreamReasonCodecNotSupport`.

    4. **Audio loopback capturing**

       * Before v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/disableaudiospectrummonitor\(\)) method to disable the audio module, audio loopback capturing will not be disabled.
       * As of v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/disableaudiospectrummonitor\(\)) method to disable the audio module, audio loopback capturing will be disabled as well. If you need to enable audio loopback capturing, you need to enable the audio module by calling the [enableAudio](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableaudio\(\)) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enableloopbackrecording\(_\:devicename:\)).

    5. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    #### New features [#new-features-63]

    1. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setuplocalvideo\(_:\)) to set the first view: Set the `position` parameter to `AgoraVideoModulePositionPostCaptureOrigin` (introduced in this release) in `AgoraRtcVideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setuplocalvideo\(_:\)) to set the second view: Set the `position` parameter to `AgoraVideoModulePositionPostCapture` in `AgoraRtcVideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    2. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/querydevicescore\(\)) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    3. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/selectmultiaudiotrack\(_\:publishtrackindex:\)) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the `openWithMediaSource` method and enable this function by setting the `enableMultiAudioTrack` parameter in [AgoraMediaSource](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoramediasource).

    4. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setremotesubscribefallbackoption\(_:\)): Sets fallback option for the subscribed video stream in weak network conditions.
       * [didRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:didremotesubscribefallbacktoaudioonly\:byuid:\)): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * \[setPlayerOption [1/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/setplayeroption\(_\:value:\)) and \[setPlayerOption [2/2\]](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/setplayeroptionstring\(_\:value:\)): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\)): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-72]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/setinearmonitoringvolume\(_:\)).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraspatialaudiokitbase/setzones\(_:\)) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling methods in [AgoraLocalSpatialAudioKit](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoralocalspatialaudiokit).

    4. **Local audio state changed callback optimization**

       This release introduces the following enumerations in [AgoraAudioLocalReason](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraaudiolocalreason), enabling users to obtain more details about local audio errors through the [localAudioStateChanged](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:localaudiostatechanged\:reason:\)) callback:

       * `AgoraAudioLocalReasonNoRecordingDevice`: No recording device is available. Remind your users to check whether the microphone is connected to the device properly in the control plane of the device or if the microphone is working properly.
       * `AgoraAudioLocalReasonNoPlayoutDevice`: No playback device is available. Remind your users to check whether the speaker is connected to the device properly in the control plane of the device or if the speaker is working properly.

    5. **Other improvements**

       This release also includes the following improvements:

       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [AgoraRtcLocalAudioStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartclocalaudiostats) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * When using the sound card for recording, it supports capturing audio data in stereo.
       * The [cacheStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:cachestats:\)) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [playbackStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:playbackstats:\)) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file.

    #### Issues fixed [#issues-fixed-74]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [localVideoStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginedelegate/rtcengine\(_\:localvideostats\:sourcetype:\)) callback is 0, which is not as expected.

    #### API changes [#api-changes-43]

    **Added**

    * The `subviewUid` member in [AgoraRtcVideoCanvas](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcvideocanvas)
    * The following enumerations in [AgoraAudioLocalReason](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraaudiolocalreason):
      * `AgoraAudioLocalReasonNoRecordingDevice`
      * `AgoraAudioLocalReasonNoPlayoutDevice`
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\))
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcenginekit/querydevicescore\(\))
    * The `AgoraMediaSourceTypeCustomVideo` enumeration in [AgoraMediaSourceType](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoramediasourcetype)
    * The `AgoraAudioOutputRoutingBluetoothDeviceA2dp` enumeration in [AgoraAudioOutputRouting](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agoraaudiooutputrouting)
    * Adds the `earMonitorDelay` and `aecEstimatedDelay` in [AgoraRtcLocalAudioStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartclocalaudiostats)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerprotocol/selectmultiaudiotrack\(_\:publishtrackindex:\))
    * [cacheStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:cachestats:\))
    * [playbackStats](https://api-ref.agora.io/en/video-sdk/macos/4.x/documentation/agorartckit/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:playbackstats:\))

    **Modified**

    * All `Error` fields in the following enumerations are changed to `Reason`:
      * `AgoraAudioLocalErrorOK`
      * `AgoraAudioLocalErrorFailure`
      * `AgoraAudioLocalErrorDeviceNoPermission`
      * `AgoraAudioLocalErrorDeviceBusy`
      * `AgoraAudioLocalErrorRecordFailure`
      * `AgoraAudioLocalErrorEncodeFailure`
      * `AgoraLocalVideoStreamErrorOK`
      * `AgoraLocalVideoStreamErrorFailure`
      * `AgoraLocalVideoStreamErrorDeviceNoPermission`
      * `AgoraLocalVideoStreamErrorDeviceBusy`
      * `AgoraLocalVideoStreamErrorCaptureFailure`
      * `AgoraLocalVideoStreamErrorCodecNotSupport`
      * `AgoraLocalVideoStreamErrorCaptureInBackGround`
      * `AgoraLocalVideoStreamErrorCaptureMultipleForegroundApps`
      * `AgoraLocalVideoStreamErrorCaptureNoDeviceFound`
      * `AgoraLocalVideoStreamErrorCaptureDeviceDisconnected`
      * `AgoraLocalVideoStreamErrorCaptureDeviceInvalidId`
      * `AgoraDirectCdnStreamingErrorOK`
      * `AgoraDirectCdnStreamingErrorFailed`
      * `AgoraDirectCdnStreamingErrorAudioPublication`
      * `AgoraDirectCdnStreamingErrorVideoPublication`
      * `AgoraDirectCdnStreamingErrorNetConnect`
      * `AgoraDirectCdnStreamingErrorBadName`
      * `AgoraMediaPlayerErrorNone`
      * `AgoraMediaPlayerErrorInvalidArguments`
      * `AgoraMediaPlayerErrorInternal`
      * `AgoraMediaPlayerErrorNoSource`
      * `AgoraMediaPlayerErrorInvalidMediaSource`
      * `AgoraMediaPlayerErrorUnknowStreamType`
      * `AgoraMediaPlayerErrorObjNotInitialized`
      * `AgoraMediaPlayerErrorCodecNotSupported`
      * `AgoraMediaPlayerErrorVideoRenderFailed`
      * `AgoraMediaPlayerErrorInvalidState`
      * `AgoraMediaPlayerErrorUrlNotFound`
      * `AgoraMediaPlayerErrorInvalidConnectState`
      * `AgoraMediaPlayerErrorSrcBufferUnderflow`
      * `AgoraMediaPlayerErrorInterrupted`
      * `AgoraMediaPlayerErrorNotSupported`
      * `AgoraMediaPlayerErrorTokenExpired`
      * `AgoraMediaPlayerErrorUnknown`
      * `AgoraRtmpStreamingErrorOK`
      * `AgoraRtmpStreamingErrorInvalidParameters`
      * `AgoraRtmpStreamingErrorEncryptedStreamNotAllowed`
      * `AgoraRtmpStreamingErrorConnectionTimeout`
      * `AgoraRtmpStreamingErrorInternalServerError`
      * `AgoraRtmpStreamingErrorRtmpServerError`
      * `AgoraRtmpStreamingErrorTooOften`
      * `AgoraRtmpStreamingErrorReachLimit`
      * `AgoraRtmpStreamingErrorNotAuthorized`
      * `AgoraRtmpStreamingErrorStreamNotFound`
      * `AgoraRtmpStreamingErrorFormatNotSupported`
      * `AgoraRtmpStreamingErrorNotBroadcaster`
      * `AgoraRtmpStreamingErrorTranscodingNoMixStream`
      * `AgoraRtmpStreamingErrorNetDown`
      * `AgoraRtmpStreamingErrorInvalidPrivilege`
      * `AgoraRtmpStreamingErrorUnpublishOK`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    ### v4.2.6 [#v426-2]

    v4.2.6 was released on November 17, 2023.

    #### Issues fixed [#issues-fixed-75]

    This release fixed the following issue:

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v4.2.3 [#v423-2]

    v4.2.3 was released on October 11, 2023.

    #### New features [#new-features-64]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `AgoraContentInspectTypeImageModeration` enumeration is added in `AgoraContentInspectType` which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `AgoraContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       In addition, this version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperformed, the error code -4 is returned, indicating the device does not support the feature.

    #### Improvements [#improvements-73]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10% (specific values may vary depending on the device model and platform).

    **Other Improvements**

    This release includes the following additional improvements:

    * Optimizes the logic of handling invalid parameters. When you call the `setPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code -2, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crash when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-76]

    This release fixed the following issues:

    * Occasional crashes when joining a channel.
    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `playEffect [3/3]` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * Calling `takeSnapshotEx` once receives the `snapshotTaken` callback for multiple times.

    #### API changes [#api-changes-44]

    **Added**

    * `enableContentInspectEx`
    * `AgoraContentInspectTypeImageModeration` in `AgoraContentInspectType`.
    * `serverConfig` in `AgoraContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `AgoraFeatureType`

    ### v4.2.2 [#v422-3]

    v4.2.2 was released on july 27, 2023.

    #### New features [#new-features-65]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info" />

    All 4.x SDKs support using wildcard tokens.
    \:::

    2. **Preloading channels**

       This release adds `preloadChannelByToken[1/2]` and `preloadChannelByToken[2/2]` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `AgoraRtcVideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    4. **Video source types for local preview**

       To allow users in selecting different types of video sources for local video preview, this release introduces `startPreview [2/2]` and `stopPreview [2/2]`. You can call `startPreview [2/2]` and specify the type of video source to be previewed by setting the `sourceType` parameter, and call `stopPreview [2/2]` to stop the video preview.

       <CalloutContainer type="info" />

    The video source type specified in this method must match the video source type set in the `AgoraRtcVideoCanvas` of the `setupLocalVideo` method.
    \:::

    5. **Publishing video streams from different sources**

       This release adds the following members in `AgoraRtcChannelMediaOptions` to allow you publish video streams captured from the third and fourth camera or screen:

       * `publishThirdCameraTrack`: Publishing the video stream captured from the third camera.
       * `publishFourthCameraTrack`: Publishing the video stream captured from the fourth camera.
       * `publishThirdScreenTrack`: Publishing the video stream captured from the third screen.
       * `publishFourthScreenTrack`: Publishing the video stream captured from the fourth screen.

    <CalloutContainer type="info">
      <CalloutDescription>
        For one `AgoraRtcConnection`, Agora supports publishing multiple audio streams and
        one video stream at the same time.
      </CalloutDescription>
    </CalloutContainer>

    #### Improvements [#improvements-74]

    1. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    2. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    3. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapAgoraVideoCodecCapInfoInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. The SDK automatically adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    2. To help users understand the reasons for more types of remote video state changes, the `AgoraVideoRemoteReasonCodecNotSupport` enumeration has been added to the `remoteVideoStateChangedOfUid` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-77]

    This release fixed the following issues:

    * Occasionally, noise occurred when the local user listened to their own and remote audio after joining the channel.
    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.

    #### API changes [#api-changes-45]

    **Added**

    * `startPreview [2/2]`
    * `stopPreview [2/2]`
    * `preloadChannelByToken [1/2]`
    * `preloadChannelByToken [2/2]`
    * `updatePreloadChannelToken`
    * The following members in `AgoraRtcChannelMediaOptions`:
      * `publishThirdCameraTrack`
      * `publishFourthCameraTrack`
      * `publishThirdScreenTrack`
      * `publishFourthScreenTrack`
    * `AgoraVideoCodecCapLevels`
    * `AgoraVideoCodecCapabilityLevel`
    * `backgroundColor` in `AgoraRtcVideoCanvas`
    * `codecLevels` in `CodecCapAgoraVideoCodecCapInfoInfo`
    * `AgoraVideoRemoteReasonCodecNotSupport` in `AgoraVideoRemoteReason`

    ### v4.2.1 [#v421-4]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-75]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-78]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * After enabling the screen sharing function on the sending end, there was high delay until the receiving end could see the shared screen.

    ### v4.2.0 [#v420-4]

    v4.2.0 was released on May 24, 2023.

    #### Compatibility changes [#compatibility-changes-39]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video data acquisition**

    The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.

    **2. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `AgoraRtcChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `AgoraRtcChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **3. Virtual sound card**

    As of v4.2.0, Agora supports third-party virtual sound cards. You can use a third-party virtual sound card as the audio input or output device for the SDK. You can use the `stateChanged` callback to see whether the current input or output device selected by the SDK is a virtual sound card.

    <CalloutContainer type="info">
      <CalloutDescription>
        If you set AgoraALD or Soundflower as the default input or output device when joining a channel, you will not hear audio.
      </CalloutDescription>
    </CalloutContainer>

    **4. Miscellaneous**

    * `didApiCallExecute` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `enableDualStreamMode`\[1/2] and `enableDualStreamMode`\[2/2] are deprecated. Use `setDualStreamMode`\[1/2] and `setDualStreamMode`\[2/2] instead.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-66]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode as balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background function. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.
    * Segment the portrait in the remote video, transmit it locally, and customize the display. This feature is available via private APIs. Contact [support@agora.io](mailto\:support@agora.io) to enable this feature.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting use-cases where high bitrates are required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    This release adds the local video mixing feature. You can use the `startLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `updateLocalTranscoderConfiguration` method and the `didLocalVideoTranscoderErrorWithStream` callback. After enabling local video mixing, you can use the `updateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `didLocalVideoTranscoderErrorWithStream` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    #### Improvements [#improvements-76]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **3. Multi-camera capture and multi-screen capture**

    This release introduces `startCameraCapture` and `startScreenCapture`\[2/2]. By calling these methods multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras and screens for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras and displays need to be connected.

    **4. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **5. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    #### Issues fixed [#issues-fixed-79]

    This release fixed the following issues:

    * When the host frequently switching the user role between broadcaster and audience in a short period of time, the audience members cannot hear the audio of the host.
    * The receiver was receiving the low-quality stream originally, and automatically switched to high-quality stream after a few seconds.
    * Incorrect information in the `type` field of the return value after calling `getDefaultAudioDevice`.
    * Occasional screen jittering during screen sharing.

    #### API changes [#api-changes-46]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startScreenCapture[2/2]`
    * `stopScreenCapture[2/2]`
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `didLocalVideoTranscoderErrorWithStream`
    * `startLocalVideoTranscoder`
    * `updateLocalTranscoderConfiguration`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AgoraAudioTrackType`
    * `AgoraApplicationScenarioType`
    * `AgoraScreenCaptureFrameRateCapability`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `AgoraRtcEngineConfig`
    * The `channelId` and `uid` parameters in `stateDidChanged` and `informationDidUpdated` callbacks
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `AgoraVirtualBackgroundNone` and `AgoraVirtualBackgroundVideo` enumerators in `AgoraVirtualBackgroundSourceType`

    **Deprecated**

    * `enableDualStreamMode`\[1/2]
    * `enableDualStreamMode`\[2/2]
    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    **Deleted**

    * `didApiCallExecute`
    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions`

    ### v4.1.1 [#v411-4]

    v4.1.1 was released on February 8, 2023.

    #### Compatibility changes [#compatibility-changes-40]

    **1. Default video encoding resolution**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    <CalloutContainer type="info">
      <CalloutDescription>
        The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Options for subscribing to remote video streams**

    This release changes the name of `setRemoteVideo` to `setRemoteVideoSubscriptionOptions`, and the name of `setRemoteVideoEx` to `setRemoteVideoSubscriptionOptionsEx`. If you upgrade the SDK to this version or later, to avoid affecting your service, ensure that you modify the names of these two methods.

    #### New features [#new-features-67]

    **1. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **2. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `videoRenderingTracingResultOfUid` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks **Join Channel** and then get the indicators in the video frame rendering process through the `videoRenderingTracingResultOfUid` callback.
    This enables developers to optimize the indicators to improve the user experience.

    #### Improvements [#improvements-77]

    **Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode:

    * When the video processing mode is `AgoraVideoFrameProcessModeReadOnly`, the return value is reserved for future use.
    * When the video processing mode is `AgoraVideoFrameProcessModeReadWrite`, the SDK receives the video frame when the return value is `YES`. The video frame is discarded when the return value is `NO`.

    #### Issues fixed [#issues-fixed-80]

    This release fixed the following issues:

    * Playing audio files with a sample rate of 48 kHz failed.
    * If the rendering view of the player was set as a `UIViewController`'s view, the video was zoomed from the bottom-left corner to the middle of the screen when entering full-screen mode.
    * When joining a channel and accessing an external camera, calling `setDevice` to specify the video capture device as the external camera did not take effect.
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.

    #### API changes [#api-changes-47]

    **Added**

    * `enableInstantMediaRendering`
    * `startMediaRenderingTracing`
    * `startMediaRenderingTracingEx`
    * `videoRenderingTracingResultOfUid`
    * `AgoraMediaRenderTraceEvent`
    * `VideoRenderingTracingInfo`

    **Modified**

    * `setRemoteVideo` to `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoEx` to `setRemoteVideoSubscriptionOptionsEx`

    **Deleted**

    * `enableRemoteSuperResolution`
    * `superResolutionType` in `AgoraRtcRemoteVideoStats`

    ### v4.1.0 [#v410-4]

    v4.1.0 was released on December 15, 2022.

    #### New features [#new-features-68]

    **1. Headphone equalization effect**

    This release adds the `setHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call setHeadphoneEQParameters to adjust the EQ.

    **2. Encoded video frame observer**

    This release adds the `setRemoteVideo` method in the `AgoraRtcEngineKit` and `AgoraRtcEngineKitEx` classes. When you call the `setEncodedVideoFrameDelegate` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the API reference.

    **3. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **4. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `AgoraCameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **5. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * Adds the `leaveChannelEx` \[2/2] method. Compared with the `leaveChannelEx` \[1/2] method, a new `options` parameter is added, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **6. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advancedVideoOptions` member in `AgoraVideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `compressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `encodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **7. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `didClientRoleChanged` callback. The value of this parameter is as follows:

    * `AgoraAudienceLatencyLevelLowLatency` (1): Low latency.
    * `AgoraAudienceLatencyLevelUltraLowLatency` (2): Ultra-low latency.

    **8. Brand-new AI Noise Suppression**

    The SDK supports a new version of AI noise reduction (in comparison to the basic AI noise reduction in v3.7.x). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option. To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    **9. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense of presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user, respectively, by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation`, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`, and the receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the hearing of the headphones.

    #### Improvements [#improvements-78]

    **1. Screen sharing**

    In addition to the usability enhancements detailed in the fixed issued section, this release includes a number of functional improvements to screen sharing, as follows:

    * Compatibility with additional devices and use-cases, including: dual graphics devices and screen sharing using external screens.
    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a 2021 16" M1 Macbook Pro or better.

    **2. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `AgoraChannelMediaRelayEventUpdateDestinationChannelRefused`(8), and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **3. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **4. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `AgoraAudioScenarioMeeting` scenario.
    * Improves the smoothness of SDK video rendering.
    * Reduces the CPU usage and power consumption of the local device when the host calls the `muteLocalVideoStream` method.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network scenarios.

    #### **Issues fixed** [#issues-fixed-81]

    This release fixed the following issues:

    * In screen sharing use-cases on Mac devices, when the user minimized or closed a shared application window, another window of the same application was automatically shared.
    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * In screen sharing use-cases, the shared window of a split screen was not highlighted correctly.
    * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
    * The uplink network quality reported by the `networkQuality` callback was inaccurate for the user who was sharing a screen.
    * After starting and stopping the audio capture device test, there was no sound when the audio playback device was subsequently started.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
    * The `didVideoPublishStateChange` callback reported an inaccurate video source type.
    * The call `getExtensionProperty` failed and returned an empty string.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.

    #### **API changes** [#api-changes-48]

    **Added**

    * `setHeadphoneEQParameters`
    * `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoSubscriptionOptionsEx`
    * `AgoraVideoSubscriptionOptions`
    * `muteLocalAudioStreamEx`
    * `muteLocalVideoStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `muteAllRemoteVideoStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`
    * `followEncodeDimensionRatio` in `AgoraCameraCapturerConfiguration`
    * `hwEncoderAccelerating` in `AgoraRtcLocalVideoStats`
    * `leaveChannelEx` \[2/2]
    * `advancedVideoOptions` in `AgoraVideoEncoderConfiguration`
    * `newRoleOptions` in `didClientRoleChanged`
    * `adjustUserPlaybackSignalVolumeEx`
    * `enableAudioVolumeIndicationEx`

    **Deprecated**

    * `didApiCallExecute`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes deprecated member parameters `backgroundImage` and `watermark` in `AgoraLiveTranscoding` class.
    * Removes `AgoraChannelMediaRelayEventUpdateDestinationChannelRefused`(8) in `didReceiveChannelMediaRelayEvent` callback.

    ### v4.0.1 [#v401-3]

    v4.0.1 was released on September 29, 2022.

    #### Compatibility changes [#compatibility-changes-41]

    1. To improve code usability, this release changes the parameters in optional type in the following classes to basic data types such as ` bool` and `int`:

    * The parameter types of `publishCameraTrack`, `publishMicrophoneTrack`, `publishCustomAudioTrack`, `publishCustomVideoTrack`, and `publishMediaPlayerAudioTrack` in `AgoraDirectCdnStreamingMediaOptions` are changed from `optional` to `bool`.
    * `isAgoraSource` and `isLiveSource` in `AgoraMediaSource` is changed from optional to bool.
    * All parameter types in `AgoraRtcChannelMediaOptions` are changed from `optional` to `bool` or `int`.

    2. The `position` parameter in the `destroyCustomVideoTrack` method is changed to `trackid`.

    3. This release deletes the `sourceType` parameter in `enableDualStreamMode` \[3/3] and `enableDualStreamModeEx`, and the `enableDualStreamMode` \[2/3] method, because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK, you don't need to specify the video source type any more.

    #### New features [#new-features-69]

    **1. In-ear monitoring**

    This release adds support for in-ear monitoring. You can call `enableInEarMonitoring` to enable the in-ear monitoring function.

    After successfully enabling the in-ear monitoring function, you can call `setAudioFrameDelegate` to register the audio observer, and the SDK triggers the `onEarMonitoringAudioFrame` callback to report the audio frame data. You can use your own audio effect processing module to pre-process the audio frame data of the in-ear monitoring to implement custom audio effects. Agora recommends that you choose one of the following two methods to set the audio data format of the in-ear monitoring:

    * Call the `setEarMonitoringAudioFrameParametersWithSampleRate` method to set the audio data format of in-ear monitoring. The SDK calculates the sampling interval based on the parameters in this method, and triggers the `onEarMonitoringAudioFrame` callback based on the sampling interval.
    * Set the audio data format in the return value of the `getEarMonitoringAudioParams` callback. The SDK calculates the sampling interval based on the return value of the callback, and triggers the onEarMonitoringAudioFrame callback based on the sampling interval.

    To adjust the in-ear monitoring volume, you can call `setInEarMonitoringVolume`.

    **2. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use, including UNKNOWN, DISCONNECTED, LAN, WIFI, 2G, 3G, 4G, 5G. When the local network connection type changes, the SDK triggers the `networkTypeChangedToType` callback to report the current network connection type.

    **3. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports 3 audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; you can contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Meanwhile, Agora supports publishers to choose whether or not the audio streams being published are to be filtered based on volume. Streams that are not filtered will bypass this filter mechanism and transported directly to the receivers. In use-cases where there are a number of publishers, enabling this function helps reducing the bandwidth and device system pressure for the receivers.

    To enable this function, contact [support@agora.io](mailto\:support@agora.io).

    **4. Dual-stream mode**

    This release optimizes the dual-stream mode, you can call `enableDualStreamMode` and `enableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams), you can follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `setRemoteVideoStream` or `setRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify the default behavior above, you can call `setDualStreamMode`\[1/2] or `setDualStreamMode`\[2/2] and set the `mode` parameter to `AgoraDisableSimulcastStream` (always do not send low-quality video streams) or `AgoraEnableSimulcastStream` (always send low-quality video streams).

    #### Improvements [#improvements-79]

    **1. Video information change callback**

    This release optimizes the trigger logic of `videoSizeChangedOfUid`, which can also be triggered and report the local video size change when `startPreview` is called separately.

    #### Issues fixed [#issues-fixed-82]

    This release fixed the following issues.

    * When capturing video through the camera, if the video aspect ratio set in `AgoraCameraCapturerConfiguration` was inconsistent with that set in `setVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.

    * When calling `setVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.

    * When using the Agora media player to play videos, after you play and pause the video, and then call the seek method to specify a new position for playback, the video image might remain unchanged; if you call the resume method to resume playback, the video might be played in a speed faster than the original one.

    #### API changes [#api-changes-49]

    **Added**

    * `getEarMonitoringAudioParams`

    * `getNetworkType`

    * `isAudioFilterable` in the `ChannelMediaOptions`

    * `setDualStreamMode` \[1/2]

    * `setDualStreamMode` \[2/2]

    * `setDualStreamModeEx`

    * `AgoraSimulcastStreamMode`

    * `setZones`

    * `setPlayerAttenuation`

    * `setRemoteAudioAttenuation`

    * `muteRemoteAudioStream`

    * `SpatialAudioParams`

    * `setHeadphoneEQPreset`

    * `AgoraHeadphoneEQPreset`

    **Modified**

    * `enableDualStreamMode` \[1/3]
    * `enableDualStreamMode` \[3/3]
    * `enableDualStreamModeEx`

    **Deprecated**

    * `startEchoTest` \[2/3]

    **Deleted**

    * `enableDualStreamMode` \[2/3]

    ### v4.0.0 [#v400-4]

    v4.0.0 was released on September 15, 2022.

    #### Compatibility changes [#compatibility-changes-42]

    **1. Integration change**

    This release has optimized the implementation of some features, resulting in incompatibility with v3.7.x. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Custom video capture and rendering (Media IO)
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migrate from v3.7.x to v4.0.0](/en/realtime-media/video/reference/migration-guide).

    #### New features [#new-features-70]

    **1. Multiple media tracks**

    This release supports one `AgoraRtcEngineKit` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `AgoraRtcEngineKit(Ex)` and `AgoraRtcChannelMediaOptions`.

    * After calling `joinChannelByToken` to join the first channel, call `joinChannelExByToken` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `AgoraRtcChannelMediaOptions` settings.

    This release adds `createCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured video in the channel:

    1. Create a custom video track: Call this method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `AgoraRtcChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `pushVideoFrame`, and specify `customVideoTrackId` as the ID of the custom video track in step 2 in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Ultra HD resolution (Beta)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capture, encoding, decoding and rendering, and now supports 4K resolution. The improved FEC (Forward Error Correction) algorithm enables adaptive switches according to the frame rate and number of video frame packets, which further reduces the video stuttering rate in 4K scenes.

    Additionally, you can set the encoding resolution to 4K (3840 × 2160) and the frame rate to 60 fps when calling `setVideoEncoderConfiguration`. The SDK supports automatic fallback to the appropriate resolution and frame rate if your device does not support 4K.

    This feature has certain requirements with regards to device performance and network bandwidth, and the supported upstream and downstream frame rates vary on different platforms. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayerWithDelegate` method to create a media player object, you can then call the methods in the `AgoraRtcMediaPlayerProtocol` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    **4. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `AgoraVoiceBeautifierUltraHighQuality` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Spatial audio**

    This feature is in experimental status. To enable this feature, contact [support@agora.io](mailto\:support@agora.io). Contact [Technical Support](mailto\:support@agora.io) if needed.

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `AgoraLocalSpatialAudioKit` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `updateSelfPosition` and `updateRemotePosition` to update the spatial coordinates of the local and remote users, respectively, so that the local user can hear the spatial audio effect of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    You can also set the spatial audio for the media player as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `AgoraLocalSpatialAudioKit` class to implement spatial audio. You need to call `updateSelfPosition` and `updatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    **6. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AgoraAudioScenarioChorus` enumeration in `AgoraAudioScenario`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **7. Extensions from the Agora extensions marketplace**

    In order to enhance the real-time audio and video interactive activities based on the Agora SDK, this release supports the one-stop solution for the extensions from the [Agora extensions marketplace](https://api-ref.agora.io/en/agora-extensions-marketplace/):

    * Easy to integrate: The integration of modular functions can be achieved simply by calling an API, and the integration efficiency is improved by nearly 95%.
    * Extensibility design: The modular and extensible SDK design style endows the Agora SDK with good extensibility, which enables developers to quickly build real-time interactive apps based on the Agora extensions marketplace ecosystem.
    * Build an ecosystem: A community of real-time audio and video apps has developed that can accommodate a wide range of developers, offering a variety of extension combinations. After integrating the extensions, developers can build richer real-time interactive functions. For details, see [Use an Extension](/en/realtime-media/video/build/customize-audio-processing/use-an-extension).
    * Become a vendor: Vendors can integrate their products with Agora SDK in the form of extensions, display and publish them in the Agora extensions marketplace, and build a real-time interactive ecosystem for developers together with Agora. For details on how to develop and publish extensions, see [Become a Vendor](/en/api-reference/api-ref/extensions-marketplace/provisioning).

    **8. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `AgoraRtcChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `AgoraRtcChannelMediaOptions` when calling `joinChannelByToken` or `joinChannelExByToken` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelWithMediaOptions` to update the settings in `AgoraRtcChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **9. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function in the following ways.

    * Call the `startScreenCaptureByDisplayId` method before joining a channel, and then call `joinChannelByToken` \[2/4] to join a channel and set `publishScreenTrack` as `true`.
    * Call the `startScreenCaptureByDisplayId` method after joining a channel, and then call `updateChannelMediaOptions` to set `publishScreenTrack` as `true`.

    **10. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add a user ID that you want to subscribe to in your allowlist, or add a user ID for the streams you do not wish to see to your blocklists. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `AgoraRtcEngineKit(Ex)` interface:

    * `setSubscribeAudioBlacklist`：Set the audio subscription blocklist.
    * `setSubscribeAudioWhitelist`：Set the audio subscription allowlist.
    * `setSubscribeVideoBlacklist`：Set the video subscription blocklist.
    * `setSubscribeVideoWhitelist`：Set the video subscription allowlist.

    If a user is added in a blocklist and a allowlist at the same time, only the blocklist takes effect.

    **11. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `setAudioScenario` method. For example, if you want to change the audio scenario from `AgoraAudioScenarioDefault` to `AgoraAudioScenarioGameStreaming` when you are in a channel, you can call this method.

    **12. Replace video feeds with images**

    This release supports replacing video feeds with images when publishing video streams. You can call the `enableVideoImageSource` method to enable this function and choose your own images through the `options` parameter. If you disable this function, the remote users see the video feeds that you publish.

    #### Improvements [#improvements-80]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `switchChannelByToken` in v3.7.x through the `leaveChannel` and `joinChannelByToken` methods so that you don't need to take the time to call the `switchChannelByToken` method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `pushExternalVideoFrame` method to push such video frames to the SDK.

    **3. Voice pitch of the local user**
    This release adds `voicePitch` in `AgoraRtcAudioVolumeInfo` of `reportAudioVolumeIndicationOfSpeakers`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **4. Video preview**

    This release improves the implementation logic of `startPreview`. You can call the `startPreview `method to enable video preview at any time.

    **5. Video types of subscription**

    You can call the `setRemoteDefaultVideoStreamType` method to choose the video stream type when subscribing to streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="windows">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="windows" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-4]

    ### Known issues [#known-issues-4]

    ### v4.6.2 [#v462-4]

    Released on January 19, 2026.

    #### New features [#new-features-71]

    Included in this release:

    * **Support for getting audio buffer delay**

      To address the issue where the main vocal and background accompaniment may be out of sync in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module to get the millisecond-level audio buffer delay when playing media files.

    #### Improvements [#improvements-81]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Window exclusion support for second screen sharing**

      In versions prior to 4.6.2, when using `startScreenCaptureByDisplayId` to share a screen by screen ID, it was not possible to configure excluded windows (`excludeWindowList` in `ScreenCaptureParameters`) in multi-screen scenarios. This version adds support for this configuration to improve the screen sharing experience. Additionally, a new enum value `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_EXCLUDE_WINDOW_FAILED (34)` is added to `LOCAL_VIDEO_STREAM_REASON` to report failures in excluding windows during screen capture.

    * **Optimized timing for `onVideoDeviceStateChanged` callback**

      This version optimizes the trigger timing of the `onVideoDeviceStateChanged` callback. In previous versions, this callback was only triggered after joining a channel. Starting from this version, it is triggered once after `RtcEngine` is initialized, and continues to be available after joining a channel.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `onNetworkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

    #### Compatibility changes [#compatibility-changes-43]

    This release introduces the following compatibility changes:

    * **Removed `uid` from `EncodedVideoFrameInfo` struct**

      The `uid` parameter is removed from the `EncodedVideoFrameInfo` struct. You can retrieve the `uid` directly from the `onEncodedVideoFrameReceived` callback. Update your integration logic accordingly.

    * **Decoder plugins built into the SDK**

      The relevant decoder plugins are now built into the SDK to ensure overall decoding compatibility.

    #### Issues fixed [#issues-fixed-83]

    This release fixed the following issues:

    * The second call to `enumerateVideoDevices` did not return the device list.
    * On Windows 7 devices, when sharing a PPT window in full-screen auto-play mode with many animations, the remote side saw flickering.

    ### v4.6.0 [#v460-4]

    Released on August 26, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        The version of the libaosl.dll library in the v4.6.0 SDK is 1.3.0. You can find the library version information by checking the properties of the libaosl.dll file.
      </CalloutDescription>
    </CalloutContainer>

    #### Compatibility changes [#compatibility-changes-44]

    This version includes SDK behavior changes, API deprecations, and deletions. To ensure your app functions correctly, update your code after upgrading to this version.

    For details on deprecated and deleted APIs in each version, see the [API Sunset Notice](/en/api-reference/api-ref/video/api-sunset).

    * **Deprecation of direct CDN streaming APIs**

      Deprecates the APIs related to direct CDN streaming, which will be removed in a future release. Agora recommends using [Media Push](/en/realtime-media/media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration`
      * `setDirectCdnStreamingVideoConfiguration`
      * `startDirectCdnStreaming`
      * `stopDirectCdnStreaming`
      * `updateDirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingStats`
      * `DIRECT_CDN_STREAMING_STATE`
      * `DIRECT_CDN_STREAMING_REASON`

    * **Deprecation of virtual metronome APIs**

      Deprecates the APIs for the virtual metronome feature, which will be removed in a future release.

      * `startRhythmPlayer`
      * `configRhythmPlayer`
      * `onRhythmPlayerStateChanged`

    * **Deprecation of watermark APIs**

      Deprecates the old watermark APIs. Agora recommends using the new watermark APIs introduced in this version.

      * `addVideoWatermark2`
      * `addVideoWatermarkEx`

    * **Deletion of redundant APIs**

      Removed the following redundant APIs and parameters:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `WlAccStats`
      * `onWlAccMessage`
      * `WLACC_MESSAGE_REASON`
      * `WLACC_SUGGEST_ACTION`
      * `enableWirelessAccelerate`

    * **Behavior changes in dual-stream mode**

      * Before v4.6.0: When the sender enabled adaptive stream mode (`AUTO_SIMULCAST_STREAM`), the low stream was not sent proactively. The sender only started sending the low stream after receiving a request from a host-role receiver calling `setRemoteVideoStreamType`.
      * Starting from v4.6.0: When the sender enables adaptive low-stream mode (`AUTO_SIMULCAST_STREAM`), the SDK automatically decides whether to send or stop sending streams based on the downlink network quality of subscribing users. If you set `mode` to another sending mode or explicitly configure the width, height, bitrate, or frame rate, this adaptive behavior is disabled.

    * **Changes to int UID and string UID mapping**

      * Before v4.6.0: If `registerLocalUserAccount` was used to register a string UID (for example, "aa") and obtain an int UID (for example, 123), joining a channel later with the int UID automatically mapped it to the original string UID ("aa").
      * From v4.6.0: The SDK no longer automatically maps an int UID to the original string UID. If `registerLocalUserAccount` was called to get an int UID but the channel needs to be joined with the original string UID, call `joinChannelWithUserAccount` directly with the string UID. After upgrading, review and update app logic to ensure users join the channel with the expected identity.

    * **Added domain whitelist**

      If you have upgraded from a previous SDK version to v4.6.0 and are using the domain whitelist feature (set `domainLimit` to `true` in `RtcEngineConfig`), add the following domains to the whitelist to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    #### New features [#new-features-72]

    * **Simulcasting multi-bitrate video streams (Beta)**

      Added support for sending multiple video streams of different resolutions from a single video source, including in multi-channel scenarios. You can now configure up to four layers: one high-resolution stream and up to three lower-resolution streams. Use configuration options to define resolution, bitrate, and whether to automatically reduce the number of streams when network or device performance drops. Subscribers can choose which stream to receive based on their network conditions. This feature helps developers deliver smooth experiences in scenarios such as conferences, large classes, and interactive live streaming, even when network conditions are poor.

    * **Multipath network transmission**

      Introduced multipath transmission for devices with multiple network interfaces (for example, 5G, Wi-Fi, and LAN). This feature effectively reduces or eliminates experience degradation caused by poor network conditions, making it suitable for real-time audio and video communication scenarios that demand high transmission stability, such as in-vehicle systems, IoT, trains, and highways. Enable it by setting `enableMultipath` in `ChannelMediaOptions` to `true`.

    * *Dynamic mode*: Dynamically selects the optimal path based on network conditions. Optionally set `preferMultipathType` to prioritize a path type. If not set, all path types have the same default weight.

    * *Duplicate mode*: Sends data simultaneously over all available paths for maximum stability. This mode incurs additional costs and eliminates the impact of poor network conditions.

    Configure uplink and downlink modes separately with `uplinkMultipathMode` and `downlinkMultipathMode`. Monitor performance with the `onMultipathStats` callback, which reports real-time transmission statistics for each path, including data consumption. Contact [support@agora.io](mailto\:support@agora.io) to enable duplicate mode.

    * **Video quality scoring**

    Added the `mosValue` member to `RemoteVideoStats` to report a score from 1 (extremely poor with severe blurring) to 5 (excellent with clear image and no artifacts) for received video quality. This enables real-time monitoring of the subjective quality of remote video streams, which helps in dynamically adjusting video parameters for quality monitoring and alerting. Contact [support@agora.io](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

    Introduced `addVideoWatermark3` and `addVideoWatermarkEx1`, which support multiple watermarks with IDs and layering order. Remove a specific watermark using `removeVideoWatermark`.

    * **Asynchronous engine destruction**

    Added the `release` method with a `callback` parameter, supporting synchronous or asynchronous engine destruction. In asynchronous mode, the SDK triggers the `RtcEngineReleaseCallback` callback.

    * **Token renewal result callback**

    Added the `onRenewTokenResult` callback and `RENEW_TOKEN_ERROR_CODE` to report the result of `renewToken`. This allows developers to handle Token renewal failures promptly within the callback.

    * **Advanced beauty (Beta)**

    Introduced a brand-new advanced beauty feature, delivering a powerful yet easy-to-use beautification solution.

    * **Precision beauty effects**
      * *Face shaping*: Supports independent fine-tuning of 29 facial areas (for example, slimming face, enlarging eyes, narrowing nose) or one-click natural effects via presets.
      * *Style makeup*: Offers rich effects including eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
      * *Skin enhancement*: Includes professional skin optimizations such as teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.

    * **Unified and simple API**
      Manage all beauty, makeup, and filter functions through three core nodes — `BEAUTY`, `STYLE_MAKEUP`, and `FILTER` — using `IVideoEffectObject` for unified parameter setup and lifecycle control.

    * **Ready-to-use presets**
      Integrates multiple out-of-the-box style templates (for example, "Natural Beauty," "Senior Makeup," "Cool White Filter") for instant polished results.

    * **Dynamic parameter control**
      Enables real-time reading and modification of granular parameters (for example, smoothing strength, lipstick type) via key-value pairs, with support for saving custom configurations and resetting defaults.

    * **Local resource guarantee**
      All beauty resources (effects, filters, makeup) are packaged as local bundle files, ensuring stability and reliability.

    * **Other new features**

    * Added `setPlaybackAudioFrameBeforeMixingParameters2` to configure the format of raw audio frames returned in `onPlaybackAudioFrameBeforeMixing`, including sample rate, number of channels, and the number of samples per callback.

    * Added `preloadEffectEx` to preload audio effects into a specific channel. Supports both local and online audio files, enabling faster playback later and is suitable for multi-channel scenarios.

    * Added `playEffectEx` for advanced audio effect playback in a specific channel with parameters such as loop count, pitch, spatial position, volume, whether to publish to the channel, and the starting playback position.

    * Added the `position` member in `ContentInspectModule` to choose the capture point for screenshot uploads from either the raw video data or the video stream before or after effects processing.

    * Added the `screenColorType` member to `SegmentationProperty` for specifying or auto-detecting background screen color (green, blue, or auto-detect) to improve the accuracy and stability of portrait segmentation when using virtual backgrounds.

    #### Improvements [#improvements-82]

    * Optimized permission requests on Windows 11 24H2 and later versions to avoid unnecessarily acquiring location information.
    * Added support for G.711 and G.722 audio codecs when interoperating with the Web SDK for improved cross-platform audio compatibility and clarity.
    * Improved video clarity in screen sharing scenarios involving documents.

    #### Issues fixed [#issues-fixed-84]

    This version fixes the following issues:

    * Online audio effect playback restarted from the beginning when `seek` was called.
    * Occasional echoes in media volume mode when publishing a microphone stream while simultaneously playing effects with `playEffect3` and music with `startAudioMixing2`.
    * SDK crashed on Windows when handling file paths containing Chinese characters due to an encoding conversion error.
    * Media relay occasionally reported `RELAY_STATE_FAILURE` and `RELAY_ERROR_SERVER_ERROR_RESPONSE` after join, relay, unpublish, leave, rejoin, and relay again sequences.
    * Receivers occasionally heard echoes when the sender shared their screen and audio from certain laptop models with power-saving mode enabled.
    * In online education scenarios, the teacher's local view of multiple students' video and audio was occasionally out of sync.

    ### v4.5.2 [#v452-3]

    v4.5.2 was released on April 22, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `aosl.dll` library version in Video SDK v4.5.2 is 1.2.13.
      </CalloutDescription>
    </CalloutContainer>

    #### Issues fixed [#issues-fixed-85]

    This release fixes the following issues:

    * When playing a multi-track media file, you could hear noise after calling the `setAudioPitch` method to adjust the pitch.
    * After the host called `createCustomAudioTrack` with `trackType` set to `AUDIO_TRACK_DIRECT`, pushed custom audio frames using `pushAudioFrame`, and played audio effects with `playEffect`, audience members heard noise.
    * Apps integrated with the SDK occasionally experienced UI lag due to main thread blocking during audio and video interactions.
    * The local preview of a shared screen flickered after calling `startScreenCapture [2/2]`, enabling `enableHighLight` in `ScreenCaptureParameters`, placing the shared window on the top layer, and maximizing it.
    * When using `startScreenCaptureByDisplayId` with `excludeWindowList` in `ScreenCaptureParameters`, some windows failed to be excluded as expected.
    * The app crashed after sharing video from an external screen and then disconnecting the screen.
    * Calling `openWithMediaSource` and setting `isLiveSource` to `true` failed to play the video stream.
    * When sending multi-channel encoded audio, the receiver occasionally heard noise.
    * When the app integrated a media player and called `open` twice to load different media resources in succession, the `onPlayerInfoUpdated [1/2]` callback incorrectly returned info for the first resource.
    * After calling `enableAudioVolumeIndication`, the `rtcEngine:reportAudioVolumeIndicationOfSpeakers:totalVolume:` callback returned a local user volume of 0 for both local and remote users.
    * In scenarios involving audio/video communication and screen sharing on a 21:9 ultra-wide display, setting a high resolution such as 3840×2160 resulted in the shared screen image being cropped in both the local preview and on the receiver's display.
    * When the app called `enableVideoImageSource` to enable the video image source feature, the sender appeared to stream successfully, but the `onVideoPublishStateChanged` callback did not return as expected.
    * In multi-channel scenarios, if the app called `setupRemoteVideoEx` to initialize the remote user’s view before successfully calling `joinChannelEx`, the first frame of the remote video was significantly delayed.

    ### v4.5.1 [#v451-3]

    v4.5.1 was released on March 4, 2025.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        The `aosl.dll` library version in Video SDK v4.5.1 is 1.2.13.
      </CalloutDescription>
    </CalloutContainer>

    #### New Features [#new-features-73]

    **AI Conversation Scenario**

    This version introduces the `AUDIO_SCENARIO_AI_CLIENT` audio scenario, specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on the characteristics of AI-generated voices, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. The optimization enhances conversation continuity and reliability, adapting to various challenging network environments.

    #### Issues Fixed [#issues-fixed-86]

    This release resolves the following issues:

    * When joining two or more channels simultaneously and calling `takeSnapshotEx` to capture local video stream screenshots consecutively, the first channel's screenshot failed.
    * When using the `pause` method to pause playback, then calling `seek` to move to a specific position, and finally calling `play`, the Media Player resumed from the paused position instead of the specified position.
    * When using the Media Player, the file path of the media resource returned by `getPlaySrc` did not update after calling `switchSrc` to switch to a new media resource.
    * In interactive live streaming scenarios, after joining a channel as an audience member using a `string` user ID, audio occasionally became unsynchronized with video.
    * AI noise suppression and AI echo cancellation plugins sometimes failed when used together.

    ### v4.5.0 [#v450-4]

    This version was released on November 27, 2024.

    #### Compatibility changes [#compatibility-changes-45]

    This version includes optimizations to some features, including changes to SDK behavior, API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="warning">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        As of v4.5.0, both Video SDK and Signaling SDK (v2.2.0 and above) include the `aosl.dll` library. If you manually integrate Video SDK via CDN and also use Signaling SDK, delete the earlier version of the `aosl.dll` library to avoid conflicts. The `aosl.dll` library version in Video SDK v4.5.0 is 1.2.13. You can check the version by viewing the `aosl.dll` file properties.
      </CalloutDescription>
    </CalloutContainer>

    1. **Member parameter type changes**

       To enhance the adaptability of various frameworks to the SDK, this version has made the following modifications to some API members or parameters:

       | API                             | Members/Parameters                   | Change                                                                                                               |
       | ------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
       | `startScreenCaptureByDisplayId` | **displayId**                        | Changed from `uint32_t` to `int64_t`                                                                                 |
       | `startScreenCaptureByWindowId`  | **windowId**                         | Changed from `view_t` to `int64_t`                                                                                   |
       | `ScreenCaptureConfiguration`    | * **displayId**
       * **windowId**       | - **displayId**: Changed from `uint32_t` to `int64_t`
       - **windowId**: Changed from `view_t` to `int64_t`             |
       | `ScreenCaptureSourceInfo`       | * **sourceDisplayId**
       * **sourceId** | - **sourceDisplayId**： Changed from `view_t` to `int64_t`
       - **sourceId**：Default value changed from `nullptr` to `0` |

    2. **Changes in strong video noise suppression**

       This version adjusts the implementation of strong video noise suppression. `VIDEO_DENOISER_LEVEL_STRENGTH` in `VIDEO_DENOISER_LEVEL` is removed. Instead, after enabling video noise suppression by calling [`setVideoDenoiserOptions`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setvideodenoiseroptions), you can call the [`setBeautyEffectOptions`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setbeautyeffectoptions) method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, enable video noise suppression first and use specific settings as detailed in [`setLowlightEnhanceOptions`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setlowlightenhanceoptions).

    3. **Changes in camera plug and unplug status**

       In previous versions, when the camera was unplugged and replugged, the `onVideoDeviceStateChanged` callback would report the device status as `MEDIA_DEVICE_STATE_ACTIVE`(1) (device in use). Starting from this version, after the camera is replugged, the device status will change to `MEDIA_DEVICE_STATE_IDLE`(0) (device ready).

    4. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`COMPRESSION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_compressionpreference.html) enumeration class, a new `PREFER_COMPRESSION_AUTO` (-1) enumeration is added, replacing the original `PREFER_QUALITY` (1) as the default value. In this mode, the SDK will automatically choose between `PREFER_LOW_LATENCY` or `PREFER_QUALITY` based on your video scene settings to achieve the best user experience.
       * In the [`DEGRADATION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_degradationpreference.html) enumeration class, a new `MAINTAIN_AUTO` (-1) enumeration is added, replacing the original `MAINTAIN_QUALITY` (1) as the default value. In this mode, the SDK will automatically choose between `MAINTAIN_FRAMERATE`, `MAINTAIN_BALANCED`, or `MAINTAIN_RESOLUTION` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    #### New features [#new-features-74]

    1. **Live show scenario**

       This version adds the `APPLICATION_SCENARIO_LIVESHOW`(3) (Live Show) enumeration to the [`VIDEO_APPLICATION_SCENARIO_TYPE`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_videoapplicationscenariotype.html). You can call [`setVideoScenario`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setvideoscenario) to set the video business scenario to showroom. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency for better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the [`setLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (for example, screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`setFilterEffectOptions`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (`.cube`) in the `config` parameter to apply custom filter effects such as whitening, vivid, cool, black and white, and others. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file to quickly apply a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the [`startLocalAudioMixer`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_startlocalaudiomixer) method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **Color space settings**

       This version adds the **colorSpace** parameter to [`VideoFrame`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_videoframe.html) and [`ExternalVideoFrame`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_externalvideoframe.html). You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    6. **Others**

       * [`onLocalVideoStateChanged`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback adds the `LOCAL_VIDEO_STREAM_REASON_DEVICE_DISCONNECTED` enumeration, indicating that the currently used video capture device has been disconnected (for example, unplugged).
       * [`MEDIA_DEVICE_STATE_TYPE`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_mediadevicestatetype.html) adds the `MEDIA_DEVICE_STATE_PLUGGED_IN` enumeration, indicating that the device has been plugged in.

    #### Improvements [#improvements-83]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`takeSnapshot [2/2]`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotEx [2/2]`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * This version optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * Supports using virtual cameras in YV12 format as video capture devices.
       * When calling `switchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `onPlayerEvent` callback will report the `PLAYER_EVENT_SWITCH_ERROR` event, indicating that an error has occurred during media resource switching.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Bug fixes [#bug-fixes-5]

    This version fixes the following issues:

    * When calling `startScreenCaptureByWindowId` to share the screen, the window capture area specified by `regionRect` is inaccurate, resulting in incorrect width and height of the screen sharing window seen by the receiving end.
    * Occasional errors of not finding system files during audio and video interaction on Windows 7 systems.
    * When calling `followSystemRecordingDevice` or `followSystemPlaybackDevice` to set the audio capture or playback device used by the SDK to not follow the system default audio playback device, the local audio state callback `onLocalAudioStateChanged` is not triggered when the audio device is removed.
    * Calling `startAudioMixing [1/2]` and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.

    ### v4.4.0 [#v440-4]

    v4.4.0 was released on August 5, 2024.

    #### Compatibility changes [#compatibility-changes-46]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    <CalloutContainer type="info">
      <CalloutTitle>
        Note
      </CalloutTitle>

      <CalloutDescription>
        Starting from v4.4.0, the SDK provides an API sunset notice, which includes information about deprecated and removed APIs in each version. See [API Sunset Notice](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/rtc_api_sunset.html).
      </CalloutDescription>
    </CalloutContainer>

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onExtensionEvent`   | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    2. This version renames the following members in `ExternalVideoFrame`:

       * `d3d11_texture_2d` is renamed to `d3d11Texture2d`.
       * `texture_slice_index` is renamed to `textureSliceIndex`.
       * `metadata_buffer` is renamed to `metadataBuffer`.
       * `metadata_size` is renamed to `metadataSize`.

    #### New features [#new-features-75]

    1. **Alpha transparency effects**

       This version introduces the Alpha transparency effects feature, supporting the transmission and rendering of Alpha channel data in video frames for SDK capture and custom capture use-cases, enabling transparent gift effects, custom backgrounds on the receiver end, and so on:

       * `VideoFrame` and `ExternalVideoFrame` add the `alphaBuffer` member, which sets the Alpha channel data.
       * `ExternalVideoFrame` adds the `fillAlphaBuffer` member. For BGRA or RGBA formatted video data, it sets whether to automatically extract the Alpha channel data and fill it into `alphaBuffer`.
       * `VideoFrame` and `ExternalVideoFrame` add the `alphaStitchMode` member, which sets the relative position of `alphaBuffer` and video frame stitching.

       Additionally, `AdvanceOptions` adds a new member `encodeAlpha`, which is used to set whether to encode and send Alpha information to the remote end. By default, the SDK does not encode and send Alpha information; if you need to encode and send Alpha information to the remote end (for example, when virtual background is enabled), explicitly call `setVideoEncoderConfiguration` to set the video encoding properties and set `encodeAlpha` to `true`.

    2. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method and passing in the sound effect types supported in the `VOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-84]

    1. **Adaptive hardware decoding support**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and effectively reducing system load.

    2. **Rendering performance enhancement**

       DirectX 11 renderer is now enabled by default on Windows devices, providing high-performance and high-quality graphics rendering capabilities.

    3. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    4. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * The `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_DISPLAY_DISCONNECTED` enumerator is added in `onLocalVideoStateChanged` callback, indicating that the display used for screen capture has been disconnected.
       * Improves echo cancellation for screen sharing use-cases.
       * Adds the `channelId` parameter to `Metadata`, which is used to get the channel name from which the metadata is sent.
       * Deprecates redundant enumeration values `CLIENT_ROLE_CHANGE_FAILED_REQUEST_TIME_OUT` and `CLIENT_ROLE_CHANGE_FAILED_CONNECTION_FAILED` in `CLIENT_ROLE_CHANGE_FAILED_REASON`.

    ### v4.3.2 [#v432-3]

    v4.3.2 was released on June 4, 2024.

    #### Improvements [#improvements-85]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    #### Issues fixed [#issues-fixed-87]

    This version fixed the following issues:

    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app occasionally crashed when remote users left the channel.
    * The screen occasionally flickered on the receiver's side when sharing a PPT window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and playing PPT animations.
    * The window border did not retain its original size after exiting the presentation and then maximizing the PPT window when sharing a WPS PPT window on Windows 7 using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_screencaptureparameters.html) to `true`.
    * The specified window could not be brought to the foreground if it was covered by other windows when sharing a window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `windowFocus` and `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_screencaptureparameters.html) to `true`.
    * Clicking on the desktop widget caused the outlined part to flicker when sharing and highlighting a window on a Windows 7 device.

    ### v4.3.1 [#v431-3]

    v4.3.1 was released on April 29, 2024.

    #### New features [#new-features-76]

    1. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_encryptionconfig.html) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enableencryption). If there are issues causing failures in data stream encryption or decryption, these can be identified by the newly added `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE` and `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE` enumerations.

    2. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode \[2/2\]](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setdualstreammode2), the SDK defaults to the following behaviors:

       * The default encoding resolution for low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the small streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    3. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    4. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-86]

    1. **Optimization for game use-case screen sharing**

       This version specifically optimizes screen sharing for game use-cases, enhancing performance, stability, and clarity in ultra-high definition (4K, 60 fps) game scenarios, resulting in a clearer, smoother, and more stable gaming experience for players.

    2. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure (especially around the fingers) are more stable, significantly reducing flickering at the edges.

    3. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `EAR_MONITORING_FILTER_REUSE_POST_PROCESSING_FILTER` in `EAR_MONITORING_FILTER_TYPE`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    4. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen sharing use-cases to save system performance overhead.
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * In [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_audioeffectpreset.html), a new enumeration `ROOM_ACOUSTICS_CHORUS` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_remoteaudiostats.html), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending end to when the audio is played on the receiving end.

    #### Issues fixed [#issues-fixed-88]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * In screen sharing use-cases, when the app enabled sound card capture with [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording) to capture audio from the shared screen, the transmission of sound card captured audio failed after a local user manually disabled the local audio capture device, causing remote users to not hear the shared screen's audio.
    * When a user plugged and unplugged a Bluetooth or wired headset once, the audio state change callback [onAudioDeviceStateChanged](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onaudiodevicestatechanged) was triggered multiple times.
    * During interactions, when a local user set the system default playback device to speakers using [setDevice](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_iaudiodevicecollection.html#api_iaudiodevicecollection_setdevice), there was no sound from the remote end.
    * When sharing an Excel document window, remote users occasionally saw a green screen.
    * On devices using Intel graphics cards, occasionally there was a performance regression when publishing a small video stream.
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-50]

    **Added**

    * [registerFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * The `publishLipSyncTrack` member in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_channelmediaoptions.html)
    * [MEDIA\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_mediasourcetype.html) adds `SPEECH_DRIVEN_VIDEO_SOURCE`
    * [VIDEO\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_videosourcetype.html) adds `VIDEO_SOURCE_SPEECH_DRIVEN`
    * [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [ENCRYPTION\_ERROR\_TYPE](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
      * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ERROR\_CODE\_TYPE](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_errorcodetype.html) adds `ERR_DATASTREAM_DECRYPTION_FAILED`
    * [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_audioeffectpreset.html) adds `ROOM_ACOUSTICS_CHORUS`, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [EAR\_MONITORING\_FILTER\_TYPE](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_earmonitoringfiltertype.html) adds a new enumeration `EAR_MONITORING_FILTER_BUILT_IN_AUDIO_FILTERS`

    ### v4.3.0 [#v430-4]

    v4.3.0 was released on February 22, 2024.

    #### Compatibility changes [#compatibility-changes-47]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, you need to update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Please modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `onLocalAudioStateChanged`         | `error`                 | `reason`           |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `onPlayerSourceStateChanged`       | `ec`                    | `reason`           |
       | `onRtmpStreamingStateChanged`      | `errCode`               | `reason`           |

       | Original enumeration class   | New enumeration class         |
       | ---------------------------- | ----------------------------- |
       | `LOCAL_AUDIO_STREAM_ERROR`   | `LOCAL_AUDIO_STREAM_REASON`   |
       | `LOCAL_VIDEO_STREAM_ERROR`   | `LOCAL_VIDEO_STREAM_REASON`   |
       | `DIRECT_CDN_STREAMING_ERROR` | `DIRECT_CDN_STREAMING_REASON` |
       | `MEDIA_PLAYER_ERROR`         | `MEDIA_PLAYER_REASON`         |
       | `RTMP_STREAM_PUBLISH_ERROR`  | `RTMP_STREAM_PUBLISH_REASON`  |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                              | Alternative methods and callbacks  |
       | ---------------------------------------------------------- | ---------------------------------- |
       | * `startChannelMediaRelay`
       * `updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | - `startChannelMediaRelayEx`
       - `updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `onChannelMediaRelayEvent`                                 | `onChannelMediaRelayStateChanged`  |

    3. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [LOCAL\_VIDEO\_STREAM\_ERROR](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_localvideostreamerror.html) class:

       * The value of `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_PAUSED` (formerly `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`) has been changed from 23 to 28.
       * The value of `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_RESUMED` (formerly `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`) has been changed from 24 to 29.
       * The `LOCAL_VIDEO_STREAM_ERROR_CODEC_NOT_SUPPORT` enumeration has been changed to `LOCAL_VIDEO_STREAM_REASON_CODEC_NOT_SUPPORT`.

    4. **Audio loopback capturing**

       * Before v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will not be disabled.

       * As of v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will be disabled as well. If you need to enable audio loopback capturing, you need to enable the audio module by calling the [enableAudio](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

    5. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    #### New features [#new-features-77]

    1. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the first view: Set the `position` parameter to `POSITION_POST_CAPTURER_ORIGIN` (introduced in this release) in `VideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the second view: Set the `position` parameter to `POSITION_POST_CAPTURER` in `VideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    2. **Query Device Score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    3. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the [openWithMediaSource](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaplayer.html#api_imediaplayer_openwithmediasource) method and enable this function by setting the `enableMultiAudioTrack` parameter in [MediaSource](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_mediasource.html).

    4. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption): Sets fallback option for the subscribed video stream in weak network conditions.
       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onremotesubscribefallbacktoaudioonly): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * [setPlaybackDeviceVolume](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_setplaybackdevicevolume): Sets the volume of the audio playback device.
       * [getRecordingDeviceVolume](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdevicevolume): Sets the volume of the audio capturing device.
       * [setPlayerOption](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-87]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setinearmonitoringvolume).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_ibasespatialaudioengine.html#api_ibasespatialaudioengine_setzones) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling the methods in [ILocalSpatialAudioEngine](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) class.

    4. **Other Improvements**

       This release also includes the following improvements:

       * The [onLocalVideoStateChanged](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback is improved with the inclusion of the `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_AUTO_FALLBACK` enumeration, signaling unexpected errors during the screen sharing process (potentially due to window blocking failure), resulting in performance degradation without impacting the screen sharing process itself.
       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_playerplaybackstats.html).

    #### Issues fixed [#issues-fixed-89]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [onLocalVideoStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.
    * When sharing in a specified screen area, the mouse coordinates within the shared area are inaccurate. When the mouse is near the border of the shared area, the mouse may not be visible in the shared screen.
    * The SDK failed to detect any changes in the audio routing after plugging in and out 3.5mm earphones.

    #### API changes [#api-changes-51]

    **Added**

    * The `subviewUid` member in [VideoCanvas](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_videocanvas.html)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CUSTOM_VIDEO_SOURCE` enumeration in [MEDIA\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_mediasourcetype.html)
    * The `ROUTE_BLUETOOTH_DEVICE_A2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/enum_audioroute.html)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/cpp/4.x/API/class_playerplaybackstats.html)

    **Modified**

    * All `ERROR` fields in the following enumerations are changed to `REASON`:
      * `LOCAL_AUDIO_STREAM_ERROR_OK`
      * `LOCAL_AUDIO_STREAM_ERROR_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION`
      * `LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY`
      * `LOCAL_AUDIO_STREAM_ERROR_RECORD_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_RECORD_INVALID_ID`
      * `LOCAL_AUDIO_STREAM_ERROR_PLAYOUT_INVALID_ID`
      * `LOCAL_VIDEO_STREAM_ERROR_OK`
      * `LOCAL_VIDEO_STREAM_ERROR_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY`
      * `LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_CODEC_NOT_SUPPORT`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_NOT_FOUND`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_DISCONNECTED`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_INVALID_ID`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_MINIMIZED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_CLOSED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_OCCLUDED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_NO_PERMISSION`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_MINIMIZED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_SYSTEM_PRESSURE`
      * `DIRECT_CDN_STREAMING_ERROR_OK`
      * `DIRECT_CDN_STREAMING_ERROR_FAILED`
      * `DIRECT_CDN_STREAMING_ERROR_AUDIO_PUBLICATION`
      * `DIRECT_CDN_STREAMING_ERROR_VIDEO_PUBLICATION`
      * `DIRECT_CDN_STREAMING_ERROR_NET_CONNECT`
      * `DIRECT_CDN_STREAMING_ERROR_BAD_NAME`
      * `PLAYER_ERROR_NONE`
      * `PLAYER_ERROR_INVALID_ARGUMENTS`
      * `PLAYER_ERROR_INTERNAL`
      * `PLAYER_ERROR_NO_RESOURCE`
      * `PLAYER_ERROR_INVALID_MEDIA_SOURCE`
      * `PLAYER_ERROR_UNKNOWN_STREAM_TYPE`
      * `PLAYER_ERROR_OBJ_NOT_INITIALIZED`
      * `PLAYER_ERROR_CODEC_NOT_SUPPORTED`
      * `PLAYER_ERROR_VIDEO_RENDER_FAILED`
      * `PLAYER_ERROR_INVALID_STATE`
      * `PLAYER_ERROR_URL_NOT_FOUND`
      * `PLAYER_ERROR_INVALID_CONNECTION_STATE`
      * `PLAYER_ERROR_SRC_BUFFER_UNDERFLOW`
      * `PLAYER_ERROR_INTERRUPTED`
      * `PLAYER_ERROR_NOT_SUPPORTED`
      * `PLAYER_ERROR_TOKEN_EXPIRED`
      * `PLAYER_ERROR_UNKNOWN`
      * `RTMP_STREAM_PUBLISH_ERROR_OK`
      * `RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT`
      * `RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED`
      * `RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT`
      * `RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR`
      * `RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR`
      * `RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN`
      * `RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT`
      * `RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED`
      * `RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND`
      * `RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED`
      * `RTMP_STREAM_PUBLISH_ERROR_NOT_BROADCASTER`
      * `RTMP_STREAM_PUBLISH_ERROR_TRANSCODING_NO_MIX_STREAM`
      * `RTMP_STREAM_PUBLISH_ERROR_NET_DOWN`
      * `RTMP_STREAM_PUBLISH_ERROR_INVALID_PRIVILEGE`
      * `RTMP_STREAM_UNPUBLISH_ERROR_OK`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `CHANNEL_MEDIA_RELAY_EVENT`

    ### v4.2.6 [#v426-3]

    v4.2.6 was released on November 17, 2023.

    #### Issues fixed [#issues-fixed-90]

    This release fixed the following issue:

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v4.2.3 [#v423-3]

    v4.2.3 was released on October 11, 2023.

    #### New features [#new-features-78]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `CONTENT_INSPECT_IMAGE_MODERATION` enumeration is added in `CONTENT_INSPECT_TYPE` which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `ContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       In addition, this version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **ID3D11Texture2D Rendering**

       As of this release, the SDK supports video formats of type ID3D11Texture2D, improving the rendering effect of video frames in game use-cases. You can set `format` to `VIDEO_TEXTURE_ID3D11TEXTURE2D` when pushing external raw video frames to the SDK by calling `pushVideoFrame`. By setting the `d3d11_texture_2d` and `texture_slice_index` properties, you can determine the ID3D11Texture2D texture object to use.

    3. **Local video status error code update**

       In order to help users understand the exact reasons for local video errors in screen sharing use-cases, the following sets of enumerations have been added to the `onLocalVideoStateChanged` callback:

       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`(23): Screen capture has been paused. Common use-cases for reporting this error code: The current screen may have been switched to a secure desktop, such as a UAC dialog box or Winlogon desktop.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`(24): Screen capture has resumed from the paused state.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_HIDDEN`(25): The window being captured on the current screen is in a hidden state and is not visible on the current screen.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_HIDDEN`(26): The window for screen capture has been restored from the hidden state.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_MINIMIZED`(27): The window for screen capture has been restored from the minimized state.

    4. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperformed, the error code `-4:ERR_NOT_SUPPORTED` is returned, indicating the device does not support the feature.

    #### Improvements [#improvements-88]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10% (specific values may vary depending on the device model and platform).

    2. **Screen sharing use-case optimization**

       This release optimizes the performance and encoding efficiency in ultra-high-definition (4K, 60 fps) game sharing use-cases, effectively reducing the system resource usage during screen sharing.

    **Other Improvements**

    This release includes the following additional improvements:

    * Optimizes the logic of handling invalid parameters. When you call the `setPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code -2, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crash when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-91]

    This release fixed the following issues:

    * Occasional crashes and dropped frames occurred in screen sharing use-cases.
    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `playEffect` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * Calling `takeSnapshotEx` once receives the `onSnapshotTaken` callback for multiple times.

    #### API changes [#api-changes-52]

    **Added**

    * The following enumerations in `onLocalVideoStateChanged`:
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_MINIMIZED`
    * `d3d11_texture_2d` and `texture_slice_index` members in `ExternalVideoFrame`.
    * `VIDEO_TEXTURE_ID3D11TEXTURE2D` in `VIDEO_PIXEL_FORMAT`.
    * `enableContentInspectEx`
    * `CONTENT_INSPECT_IMAGE_MODERATION` in `CONTENT_INSPECT_TYPE`.
    * `serverConfig` in `ContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `FeatureType`

    ### v4.2.2 [#v422-4]

    v4.2.2 was released on july 27, 2023.

    #### New features [#new-features-79]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info" />

    All 4.x SDKs support using wildcard tokens.
    \:::

    2. **Preloading channels**

       This release adds `preloadChannel[1/2]` and `preloadChannel[2/2]` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `VideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    4. **Publishing video streams from different sources**

       This release adds the following members in `ChannelMediaOptions` to allow you publish video streams captured from the third and fourth camera or screen:

       * `publishThirdCameraTrack`: Publishing the video stream captured from the third camera.
       * `publishFourthCameraTrack`: Publishing the video stream captured from the fourth camera.
       * `publishThirdScreenTrack`: Publishing the video stream captured from the third screen.
       * `publishFourthScreenTrack`: Publishing the video stream captured from the fourth screen.

       <CalloutContainer type="info" />

    For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
    \:::

    #### Improvements [#improvements-89]

    1. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    2. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    3. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. The SDK automatically adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    2. To help users understand the reasons for more types of remote video state changes, the `REMOTE_VIDEO_STATE_REASON_CODEC_NOT_SUPPORT` enumeration has been added to the `onRemoteVideoStateChanged` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-92]

    This release fixed the following issues:

    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.
    * In multi-device audio recording use-cases, after repeatedly plugging and unplugging or enabling/disabling the audio recording device, no sound could be heard occasionally when calling the `startRecordingDeviceTest` to start an audio capturing device test.

    #### API changes [#api-changes-53]

    **Added**

    * `preloadChannel[1/2]`
    * `preloadChannel[2/2]`
    * `updatePreloadChannelToken`
    * The following members in `ChannelMediaOptions`:
      * `publishThirdCameraTrack`
      * `publishFourthCameraTrack`
      * `publishThirdScreenTrack`
      * `publishFourthScreenTrack`
    * `CodecCapLevels`
    * `VIDEO_CODEC_CAPABILITY_LEVEL`
    * `backgroundColor` in `VideoCanvas`
    * `codecLevels` in `CodecCapInfo`
    * `REMOTE_VIDEO_STATE_REASON_CODEC_NOT_SUPPORT` in `REMOTE_VIDEO_STATE_REASON`

    ### v4.2.1 [#v421-5]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-90]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-93]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * When the sending end mixed and published two streams of video captured by two cameras locally, the video from the second camera was occasionally missing on the receiving end.

    ### v4.2.0 [#v420-5]

    v4.2.0 was released on May 24, 2023.

    #### Compatibility changes [#compatibility-changes-48]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture**

    This release optimizes the APIs for camera and screen capture function. As of v4.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter.

    | Deleted Methods                                                | Alternative Methods        |
    | :------------------------------------------------------------- | :------------------------- |
    | `startPrimaryCameraCapture`<br />`startSecondaryCameraCapture` | `startCameraCapture`       |
    | `stopPrimaryCameraCapture`<br />`stopSecondaryCameraCapture`   | `stopCameraCapture`        |
    | `startPrimaryScreenCapture`<br />`startSecondaryScreenCapture` | `startScreenCapture`\[2/2] |
    | `stopPrimaryScreenCapture`<br />`stopSecondaryScreenCapture`   | `stopScreenCapture`\[2/2]  |

    **2. Video data acquisition**

    * The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.
    * The following callbacks are deleted. Get the video source type through the `sourceType` parameter in the `onPreEncodeVideoFrame` and `onCaptureVideoFrame` callbacks.
      * `onSecondaryPreEncodeCameraVideoFrame`
      * `onScreenCaptureVideoFrame`
      * `onPreEncodeScreenVideoFrame`
      * `onSecondaryPreEncodeScreenVideoFrame`

    **3. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `ChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `ChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **4. Local video mixing**

    * The `VideoInputStreams` in `LocalTranscoderConfiguration` is changed to `videoInputStreams`.
    * The `MEDIA_SOURCE_TYPE` in `TranscodingVideoStream` is changed to `VIDEO_SOURCE_TYPE`.

    **5. Miscellaneous**

    * `onApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * The `IAudioFrameObserver` class is renamed to `IAudioPcmFrameSink`, thus the prototypes of the following methods are updated accordingly:
      * `onFrame`
      * `registerAudioFrameObserver` \[1/2] and `registerAudioFrameObserver`\[2/2] in `IMediaPlayer`
    * `enableDualStreamMode`\[1/2] and `enableDualStreamMode`\[2/2] are deprecated. Use `setDualStreamMode`\[1/2] and `setDualStreamMode`\[2/2] instead.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-80]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise reduction mode as balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background feature. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting scenarios where high bitrates are required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    This release adds the `onLocalVideoTranscoderError` callback. When there is an error in starting or updating the local video mixing, the SDK triggers this callback to report the reason for the failure.

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    #### Improvements [#improvements-91]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced rendering compatibility**

    This release enhances the rendering compatibility of the SDK. Issues like black screens caused by rendering failures on certain devices are fixed.

    **3. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **4. Multi-camera capture and multi-screen capture**

    This release introduces `startCameraCapture` and `startScreenCapture`\[2/2]. By calling these methods multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras and screens for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras and displays need to be connected.

    **5. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **6. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    #### Issues fixed [#issues-fixed-94]

    This release fixed the issue that when the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.

    #### API changes [#api-changes-54]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startScreenCapture`\[2/2]
    * `stopScreenCapture`\[2/2]
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `onLocalVideoTranscoderError`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AUDIO_TRACK_TYPE`
    * `VIDEO_APPLICATION_SCENARIO_TYPE`
    * `SCREEN_CAPTURE_FRAMERATE_CAPABILITY`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `BACKGROUND_NONE` and `BACKGROUND_VIDEO` enumerators in `BACKGROUND_SOURCE_TYPE`

    **Deprecated**

    * `enableDualStreamMode`\[1/2]
    * `enableDualStreamMode`\[2/2]
    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `CHANNEL_MEDIA_RELAY_EVENT`

    **Deleted**

    * `startPrimaryScreenCapture`
    * `startSecondaryScreenCapture`
    * `stopPrimaryScreenCapture`
    * `stopSecondaryScreenCapture`
    * `startPrimaryCameraCapture`
    * `startSecondaryCameraCapture`
    * `stopPrimaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `onSecondaryPreEncodeCameraVideoFrame`
    * `onScreenCaptureVideoFrame`
    * `onPreEncodeScreenVideoFrame`
    * `onSecondaryPreEncodeScreenVideoFrame`
    * `onApiCallExecuted`
    * `publishCustomAudioTrackEnableAec ` in ` ChannelMediaOptions`

    ### v4.1.1 [#v411-5]

    v4.1.1 was released on February 8, 2023.

    #### Compatibility changes [#compatibility-changes-49]

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    <CalloutContainer type="info">
      <CalloutDescription>
        The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    #### New features [#new-features-81]

    **1. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **2. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `onVideoRenderingTracingResult` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks
    **Join Channel** button and then get the indicators in the video frame rendering process through the `onVideoRenderingTracingResult` callback.
    This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-92]

    **Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode:

    * When the video processing mode is `PROCESS_MODE_READ_ONLY`, the return value is reserved for future use.
    * When the video processing mode is `PROCESS_MODE_READ_WRITE`, the SDK receives the video frame when the return value is `true`. The video frame is discarded when the return value is `false`.

    #### Issues fixed [#issues-fixed-95]

    This release fixed the following issues:

    * When using Agora Media Player to play RTSP video streams, the video images sometimes appeared pixelated.
    * Playing audio files with a sample rate of 48 kHz failed.
    * Adding an Alpha channel to an image in PNG or GIF format failed when the local client mixed video streams.
    * After joining the channel, remotes users saw a watermark even though the watermark was deleted.
    * If a watermark was added after starting screen sharing, the watermark did not display the screen.
    * When joining a channel and accessing an external camera, calling `setDevice` to specify the video capture device as the external camera did not take effect.
    * When trying to outline the shared window and put it on top, the shared window did not stay on top of other windows.
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.

    #### API changes [#api-changes-55]

    **Added**

    * `enableInstantMediaRendering`
    * `startMediaRenderingTracing`
    * `startMediaRenderingTracingEx`
    * `onVideoRenderingTracingResult`
    * `MEDIA_RENDER_TRACE_EVENT`
    * `VideoRenderingTracingInfo`

    **Deleted**

    * `enableRemoteSuperResolution`
    * `superResolutionType` in `RemoteVideoStats`

    ### v4.1.0 [#v410-5]

    v4.1.0 was released on December 15, 2022.

    #### New features [#new-features-82]

    **1. Headphone equalization effect**

    This release adds the `setHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call `setHeadphoneEQParameters` to adjust the EQ.

    **2. Encoded video frame observer**

    This release adds the `setRemoteVideoSubscriptionOptions` and `setRemoteVideoSubscriptionOptionsEx` methods. When you call the `registerVideoEncodedFrameObserver` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the API reference.

    **3. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    > To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **4. Register extensions**

    This release adds the `registerExtension` method for registering extensions. When using a third-party extension, you need to call the extension-related APIs in the following order:

    `loadExtensionProvider` -> `registerExtension` -> `setExtensionProviderProperty` -> `enableExtension`

    **5. Device management**

    This release adds a series of callbacks to help you better understand the status of your audio and video devices:

    * `onVideoDeviceStateChanged`: Occurs when the status of the video device changes.
    * `onAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `onAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **6. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `CameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **7. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * Adds the `leaveChannelEx` \[2/2] method. Compared with the `leaveChannelEx` \[1/2] method, a new options parameter is added, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **8. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advanceOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `compressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `encodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **9. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `onClientRoleChanged` callback. The value of this parameter is as follows:

    * `AUDIENCE_LATENCY_LEVEL_LOW_LATENCY` (1): Low latency.
    * `AUDIENCE_LATENCY_LEVEL_ULTRA_LOW_LATENCY` (2): Ultra-low latency.

    **10. Brand-new AI Noise Suppression**

    The SDK supports a new version of AI noise reduction (in comparison to the basic AI noise reduction in v3.7.x). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option.

    To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    **11. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense of presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user, respectively, by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation`, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`, and the receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the hearing of the headphones.

    #### Improvements [#improvements-93]

    **1. Screen sharing**

    In addition to the usability enhancements detailed in the [fixed issued](#bugfix) section, this release includes a number of functional improvements to screen sharing, as follows:

    * New `minimizeWindow` member in `ScreenCaptureSourceInfo` to indicate whether the target window is minimized.
    * New `enableHighLight`, `highLightColor`, and `highLightWidth` members in `ScreenCaptureParameters` so that you can place a border around the target window or screen when screen sharing.
    * Compatibility with a greater number of mainstream apps, including WPS Office, Microsoft Office PowerPoint, Visual Studio Code, Adobe Photoshop, Windows Media Player, and Scratch.
    * Compatibility with additional devices and operating systems, including: Window 8 systems, devices without discrete graphics cards, and dual graphics devices.
    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a device with an Intel Core i7-9750H CPU @ 2.60 GHz or better.

    **2. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8), and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **3. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **4. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `AUDIO_SCENARIO_MEETING` scenario.
    * Improves the smoothness of SDK video rendering.
    * Reduces the CPU usage and power consumption of the local device when the host calls the `muteLocalVideoStream` method.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network use-cases.

    <a name="bugfix" />

    #### Issues fixed [#issues-fixed-96]

    This release fixed the following issues:

    * In screen sharing use-cases, when the user minimized and then restored the shared window, the remote video occasionally switched to the low-quality stream.
    * When the host started screen sharing during live streaming, the audience members sometimes heard echoes.
    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * In screen sharing use-cases, a black screen appeared when sharing a screen between a landscape monitor and a portrait monitor.
    * In screen sharing use-cases with a window excluded, the application crashed when the specified shared area exceeded the screen resolution.
    * The application failed to exclude a window using the `startScreenCaptureByDisplayId` method for screen sharing.
    * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was sharing a screen.
    * In screen sharing use-cases, when the user shared the screen by window, the mouse in the shared screen was not in its actual position.
    * When switching from a non-screen sharing use-case to a screen sharing one, the application occasionally crashed if the user did not switch the resolution accordingly.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
    * The call `getExtensionProperty` failed and returned an empty string.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.

    #### **API changes** [#api-changes-56]

    **Added**

    * `setHeadphoneEQParameters`

    * `setRemoteVideoSubscriptionOptions`

    * `setRemoteVideoSubscriptionOptionsEx`

    * `VideoSubscriptionOptions`

    * `leaveChannelEx [2/2]`

    * `muteLocalAudioStreamEx`

    * `muteLocalVideoStreamEx`

    * `muteAllRemoteAudioStreamsEx`

    * `muteAllRemoteVideoStreamsEx`

    * `startRtmpStreamWithoutTranscodingEx`

    * `startRtmpStreamWithTranscodingEx`

    * `updateRtmpTranscodingEx`

    * `stopRtmpStreamEx`

    * `startChannelMediaRelayEx`

    * `updateChannelMediaRelayEx`

    * `pauseAllChannelMediaRelayEx`

    * `resumeAllChannelMediaRelayEx`

    * `stopChannelMediaRelayEx`

    * `followEncodeDimensionRatio` in`CameraCapturerConfiguration`

    * `hwEncoderAccelerating` in `LocalVideoStats`

    * `advanceOptions in VideoEncoderConfiguration`

    * `newRoleOptions in onClientRoleChanged`

    * `adjustUserPlaybackSignalVolumeEx`

    * `onVideoDeviceStateChanged`

    * `onAudioDeviceStateChanged`

    * `onAudioDeviceVolumeChanged`

    **Deprecated**

    * `onApiCallExecuted`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8) in `onChannelMediaRelayEvent` callback.

    ### v4.0.1 [#v401-4]

    v4.0.1 was released on September 29, 2022.

    #### Compatibility changes [#compatibility-changes-50]

    This release deletes the `sourceType` parameter in `enableDualStreamMode` \[3/3] and `enableDualStreamModeEx`, and the `enableDualStreamMode` \[2/3] method, because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK, you don't need to specify the video source type any more.

    #### New features [#new-features-83]

    **1. In-ear monitoring**

    This release adds support for in-ear monitoring. You can call `enableInEarMonitoring` to enable the in-ear monitoring function.

    After successfully enabling the in-ear monitoring function, you can call `registerAudioFrameObserver` to register the audio observer, and the SDK triggers the `onEarMonitoringAudioFrame` callback to report the audio frame data. You can use your own audio effect processing module to pre-process the audio frame data of the in-ear monitoring to implement custom audio effects. Agora recommends that you choose one of the following two methods to set the audio data format of the in-ear monitoring:

    * Call the `setEarMonitoringAudioFrameParameters` method to set the audio data format of in-ear monitoring. The SDK calculates the sampling interval based on the parameters in this method, and triggers the `onEarMonitoringAudioFrame` callback based on the sampling interval.
    * Set the audio data format in the return value of the `getEarMonitoringAudioParams` callback. The SDK calculates the sampling interval based on the return value of the callback, and triggers the onEarMonitoringAudioFrame callback based on the sampling interval.

    To adjust the in-ear monitoring volume, you can call `setInEarMonitoringVolume`.

    **2. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use, including UNKNOWN, DISCONNECTED, LAN, WIFI, 2G, 3G, 4G, 5G. When the local network connection type changes, the SDK triggers the `onNetworkTypeChanged` callback to report the current network connection type.

    **3. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports 3 audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; you can contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Meanwhile, Agora supports publishers to choose whether or not the audio streams being published are to be filtered based on volume. Streams that are not filtered will bypass this filter mechanism and transported directly to the receivers. In use-cases where there are a number of publishers, enabling this function helps reducing the bandwidth and device system pressure for the receivers.

    To enable this function, contact [technical support](mailto\:support@agora.io).

    **4. Dual-stream mode**

    This release optimizes the dual-stream mode, you can call `enableDualStreamMode` and `enableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams), you can follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `setRemoteVideoStreamType` or `setRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify the default behavior above, you can call `setDualStreamMode`\[1/2] or `setDualStreamMode`\[2/2] and set the `mode` parameter to `DISABLE_SIMULCAST_STREAM` (always do not send low-quality video streams) or `ENABLE_SIMULCAST_STREAM` (always send low-quality video streams).

    **5. Loopback device**

    The SDK uses the playback device as the loopback device by default. Since 4.2.0, you can specify a loopback device separately and publish the captured audio to the remote end.

    * `setLoopbackDevice`：Specifies the loopback device. If you do not want the current playback device to be the loopback device, you can call this method to specify another device as the loopback device.
    * `getLoopbackDevice`：Gets the current loopback device.
    * `followSystemLoopbackDevice`：Whether the loopback device follows the default playback device of the system.

    #### Improvements [#improvements-94]

    **1. Video information change callback**

    This release optimizes the trigger logic of `onVideoSizeChanged`, which can also be triggered and report the local video size change when `startPreview` is called separately.

    **2. First video frame rendering**

    This release speeds up the first video frame rendering time to improve the video experience.

    #### Issues fixed [#issues-fixed-97]

    This release fixed the following issues.

    1. When `stopPreview` was called to disable the local video preview, the virtual background that has been set up was occasionally invalidated.
    2. Occasional crash when exiting a channel and joining it multiple times with virtual background enabled and set to blur effect.
    3. If the local client used a 1920 x 1080 camera as the video capture source, the resolution of the remote video was occasionally inconsistent with the local client.
    4. When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `setVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.
    5. When calling `setVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.
    6. When using the Agora media player to play videos, after you play and pause the video, and then call the seek method to specify a new position for playback, the video image might remain unchanged; if you call the resume method to resume playback, the video might be played in a speed faster than the original one.

    #### API changes [#api-changes-57]

    **Added**

    * `enableInEarMonitoring`
    * `setEarMonitoringAudioFrameParameters`
    * `onEarMonitoringAudioFrame`
    * `setInEarMonitoringVolume`
    * `getEarMonitoringAudioParams`
    * `getNetworkType`
    * `setRecordingDeviceVolume`
    * `isAudioFilterable` in the `ChannelMediaOptions`
    * `setDualStreamMode` \[1/2]
    * `setDualStreamMode` \[2/2]
    * `setDualStreamModeEx`
    * `SIMULCAST_STREAM_MODE`
    * `setLoopbackDevice`
    * `getLoopbackDevice`
    * `followSystemLoopbackDevice`
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `muteRemoteAudioStream`
    * `SpatialAudioParams`
    * `setHeadphoneEQPreset`
    * `HEADPHONE_EQUALIZER_PRESET`

    **Modified**

    * `enableDualStreamMode` \[1/3]
    * `enableDualStreamMode` \[3/3]
    * `enableDualStreamModeEx`

    **Deprecated**

    * `startEchoTest` \[2/3]

    **Deleted**

    * `enableDualStreamMode` \[2/3]

    ### v4.0.0 [#v400-5]

    v4.0.0 was released on September 15, 2022.

    #### Compatibility changes [#compatibility-changes-51]

    **Integration change**

    This release has optimized the implementation of some features, resulting in incompatibility with v3.7.x. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Custom video capture and rendering (Media IO)
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migrate from v3.7.x to v4.0.0](/en/realtime-media/video/reference/migration-guide).

    #### New features [#new-features-84]

    **1. Multiple media tracks**

    This release supports one `IRtcEngine` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `RtcEngineEx` and `ChannelMediaOptions.`

    * After calling `joinChannel` to join the first channel, call `joinChannelEx` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `ChannelMediaOptions` settings.
    * You can simultaneously publish multiple sets of video streams captured by multiple cameras or screen sharing by setting `publishSecondaryCameraTrack` and `publishSecondaryScreenTrack` in `ChannelMediaOptions`.

    This release adds `createCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured video in the channel:

    1. Create a custom video track: Call this method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `ChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `pushVideoFrame`, and specify `videoTrackId` as the ID of the custom video track in step 2 in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Ultra HD resolution (Beta)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capture, encoding, decoding and rendering, and now supports 4K resolution. The improved FEC (Forward Error Correction) algorithm enables adaptive switches according to the frame rate and number of video frame packets, which further reduces the video stuttering rate in 4K scenes.

    Additionally, you can set the encoding resolution to 4K (3840 × 2160) and the frame rate to 60 fps when calling `SetVideoEncoderConfiguration`. The SDK supports automatic fallback to the appropriate resolution and frame rate if your device does not support 4K.

    This feature has certain requirements with regards to device performance and network bandwidth, and the supported upstream and downstream frame rates vary on different platforms. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Build-in media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayer` method to create a media player object, you can then call the methods in the `IMediaPlayer` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    **4. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `ULTRA_HIGH_QUALITY_VOICE` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Spatial audio**

    <CalloutContainer type="info">
      <CalloutDescription>
        This feature is in experimental status. To enable this feature, contact [support@agora.io](mailto\:support@agora.io). Contact [technical support](mailto\:support@agora.io) if needed.
      </CalloutDescription>
    </CalloutContainer>

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `updateSelfPosition` and `updateRemotePosition` to update the spatial coordinates of the local and remote users, respectively, so that the local user can hear the spatial audio effect of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    You can also set the spatial audio for the media player as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio. You need to call `updateSelfPosition` and `updatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    **6. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AUDIO_SCENARIO_CHORUS` enumeration in `AUDIO_SCENARIO_TYPE`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **7. Extensions from the Agora extensions marketplace**

    In order to enhance the real-time audio and video interactive activities based on the Agora SDK, this release supports the one-stop solution for the extensions from the [Agora extensions marketplace](https://api-ref.agora.io/en/agora-extensions-marketplace/):

    * Easy to integrate: The integration of modular functions can be achieved simply by calling an API, and the integration efficiency is improved by nearly 95%.
    * Extensibility design: The modular and extensible SDK design style endows the Agora SDK with good extensibility, which enables developers to quickly build real-time interactive apps based on the Agora extensions marketplace ecosystem.
    * Build an ecosystem: A community of real-time audio and video apps has developed that can accommodate a wide range of developers, offering a variety of extension combinations. After integrating the extensions, developers can build richer real-time interactive functions. For details, see [Use an Extension](/en/realtime-media/video/build/customize-audio-processing/use-an-extension).
    * Become a vendor: Vendors can integrate their products with Agora SDK in the form of extensions, display and publish them in the Agora extensions marketplace, and build a real-time interactive ecosystem for developers together with Agora. For details on how to develop and publish extensions, see [Become a Vendor](/en/api-reference/api-ref/extensions-marketplace/provisioning).

    **8. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `ChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `ChannelMediaOptions` when calling `joinChannel` or `joinChannelEx` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelMediaOptions` to update the settings in `ChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **9. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function in the following ways.

    * Call the `StartScreenCaptureByDisplayId` method before joining a channel, and then call `JoinChannel` \[2/2] to join a channel and set `publishScreenTrack` or `publishSecondaryScreenTrack` as true.
    * Call the `StartScreenCaptureByDisplayId` method after joining a channel, and then call `UpdateChannelMediaOptions` to set `publishScreenTrack` or `publishSecondaryScreenTrack` as true.

    **10. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add a user ID that you want to subscribe to in your whitelist, or add a user ID for the streams you do not wish to see to your blacklists. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `IRtcEngineEx` interface:

    * `SetSubscribeAudioBlacklist`：Set the audio subscription blocklist.
    * `SetSubscribeAudioWhitelist`：Set the audio subscription allowlist.
    * `SetSubscribeVideoBlacklist`：Set the video subscription blocklist.
    * `SetSubscribeVideoWhitelist`：Set the video subscription allowlist.

    If a user is added in a blacklist and a whitelist at the same time, only the blacklist takes effect.

    **11. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `SetAudioScenario` method. For example, if you want to change the audio scenario from `AUDIO_SCENARIO_DEFAULT` to `AUDIO_SCENARIO_GAME_STREAMING` when you are in a channel, you can call this method.

    **12. Local video mixing**

    This release adds a series of APIs supporting local video mixing functions. You can mix multiple video streams into one video stream locally. Common use-cases are as follows:

    * In interactive live streaming use-cases with cohosts or when using the Media Push function, you can merge the screens of multiple hosts into one view locally.
    * In use-cases where you capture multiple local video streams (for example, video captured by cameras, screen sharing streams, video files or pictures), you can and merge them into one video stream and then publish the mixed video stream in the channel.

    You can call the `startLocalVideoTranscoder` method to start local video mixing and call the `stopLocalVideoTranscoder` method to stop local video mixing. After the local video mixing starts, you can call `updateLocalTranscoderConfiguration` to update the local video mixing configuration.

    **13. Video device management**

    Video capture devices can support multiple video formats, each supporting a different combination of video frame width, video frame height, and frame rate.

    This release adds the `numberOfCapabilities` and `getCapability` methods for getting the number of video formats supported by the video capture device and the details of the video frames in the specified video format. When calling the `startPrimaryCameraCapture` or `startSecondaryCameraCapture` method to capture video using the camera, you can use the specified video format.

    <CalloutContainer type="info">
      <CalloutDescription>
        The SDK automatically selects the best video format for the video capture device based on your settings in `VideoEncoderConfiguration`, so normally you should not need to use these new methods.
      </CalloutDescription>
    </CalloutContainer>

    #### Improvements [#improvements-95]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v3.7.x through the `LeaveChannel` and `JoinChannel `methods so that you don't need to take the time to call the `SwitchChannel `method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `pushVideoFrame`\[1/2] method to push such video frames to the SDK.

    **3. Voice pitch of the local user**
    This release adds `voicePitch` in `AudioVolumeInfo` of `onAudioVolumeIndication`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **4. Video preview**

    This release improves the implementation logic of `startPreview`. You can call the `startPreview `method to enable video preview at any time.

    **5. Video types of subscription**

    You can call the `setRemoteDefaultVideoStreamType` method to choose the video stream type when subscribing to streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="electron">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="electron" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-5]

    ### Known issues [#known-issues-5]

    ### v4.6.2 [#v462-5]

    Released on March 14, 2026.

    #### Compatibility changes [#compatibility-changes-52]

    This release introduces the following compatibility changes:

    * **Deprecation of Direct CDN streaming APIs**

      The following APIs related to Direct CDN streaming are deprecated in this release and will be removed in a future version. Use [Media Push](/en/realtime-media/media-push/get-started/enable-media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration`
      * `setDirectCdnStreamingVideoConfiguration`
      * `startDirectCdnStreaming`
      * `stopDirectCdnStreaming`
      * `DirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingStats`
      * `DirectCdnStreamingState`
      * `DirectCdnStreamingReason`

    * **Deprecation of virtual metronome APIs**

      The following APIs related to the virtual metronome feature are deprecated in this release and will be removed in a future version.

      * `startRhythmPlayer`
      * `configRhythmPlayer`
      * `onRhythmPlayerStateChanged`

    * **Deprecation of watermark APIs**

      The following watermark APIs are deprecated in this release. Use the new watermark APIs introduced in this release instead.

      * `addVideoWatermark`
      * `addVideoWatermarkEx`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `enableWirelessAccelerate`

    * **Changes to makeup feature implementation**

      Due to the beauty effect refactoring in this release, calling `setExtensionProperty` to enable the makeup feature is no longer supported starting from v4.6.2. Use the `STYLE_MAKEUP` node instead.

    * **Behavior changes in dual-stream mode**

      Before v4.6.2, when the sender enabled adaptive low-stream mode (`AutoSimulcastStream`), the low stream was not sent proactively. The sender only started sending the low stream after receiving a request from a host-role receiver calling `setRemoteVideoStreamType`. Starting from v4.6.2, when the sender enables adaptive low-stream mode, the SDK automatically decides whether to send or stop sending the low stream based on the downlink network quality of subscribing users. If you set `mode` to another sending mode or explicitly configure the width, height, bitrate, or frame rate of the low stream, this adaptive behavior is disabled.

    * **New domains required for domain whitelist**

      If you upgrade from a previous version and use the domain whitelist feature (`domainLimit` in `RtcEngineConfig` set to `true`), add the following domains to the whitelist to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    * **Removal of `uid` from `EncodedVideoFrameInfo` struct**

      The `uid` parameter is removed from the `EncodedVideoFrameInfo` struct. You can retrieve `uid` information directly from the `onEncodedVideoFrameReceived` callback. Update your integration logic accordingly.

    #### New features [#new-features-85]

    Included in this release:

    * **Multi-resolution video streams**

      This release introduces the Adaptive Bitrate Video Streaming (ABR) feature, which supports sending multiple video streams at different resolutions from the same video source simultaneously, including in multi-channel scenarios. Receivers can automatically or manually subscribe to streams at their preferred resolution.

      After enabling ABR, you can configure up to four video stream layers (one main stream at the highest resolution and up to three lower-resolution streams), and set options such as resolution, bitrate, and layered streaming fallback. When layered streaming fallback is enabled, the SDK automatically switches to lower-resolution streams under poor network conditions to maintain a smooth viewing experience. This feature is suited for meetings, large classes, interactive live streaming, and other multi-device or multi-network environments.

    * **Multi-path network transmission**

      This release introduces multi-path transmission for devices that support multiple network interfaces (such as 5G, Wi-Fi, and LAN). This feature reduces or eliminates experience degradation caused by poor network conditions, making it suitable for real-time audio and video communication in challenging environments such as vehicles, IoT devices, trains, and highways.

      Enable multi-path transmission by setting `enableMultipath` to `true` in `ChannelMediaOptions`. Two transmission modes are supported through `MultipathMode`:

      * **Dynamic mode** (default): Dynamically selects the best available path based on network conditions. Suited for traffic-sensitive scenarios with high experience requirements, such as meetings and online education. In this mode, you can specify the preferred network path (for example, Wi-Fi or mobile network) using `preferMultipathType`.
      * **Full redundancy mode**: Transmits data simultaneously on all available network paths. Suited for scenarios that are not traffic-sensitive but require extreme reliability, such as outdoor broadcasting and parallel control. This mode incurs additional costs. [Contact technical support](mailto\:support@agora.io) to enable it.

      Uplink and downlink paths can also be configured separately using `uplinkMultipathMode` and `downlinkMultipathMode` in `ChannelMediaOptions`. Once enabled, the SDK reports real-time transmission statistics for each path through the `onMultipathStats` callback, including per-path traffic consumption.

    * **Video quality scoring**

      This release adds the `mosValue` field to `RemoteVideoStats`, reporting the quality score of the received remote video stream as evaluated by the Agora real-time video MOS (Mean Opinion Score) system. Scores range from 1 to 5, where 5 indicates excellent video quality and 1 indicates extremely poor quality. Use this field to monitor subjective video quality in real time, adjust video parameters dynamically, or integrate into quality monitoring and alerting workflows. [Contact technical support](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

      This release deprecates `addVideoWatermark` and `addVideoWatermarkEx`, and introduces `addVideoWatermarkWithConfig` and `addVideoWatermarkWithConfigEx`, which support adding multiple watermarks to a video using watermark IDs and controlling their display order. To remove a specific watermark, call `removeVideoWatermark`.

    * **Token renewal result callback**

      This release introduces the `onRenewTokenResult` callback and the `RenewTokenErrorCode` error code enum. After calling `renewToken` to update the token, the SDK reports the result through `onRenewTokenResult` and returns detailed error codes defined in `RenewTokenErrorCode`, allowing you to handle token renewal failure scenarios accordingly.

    * **Media Player support for getting audio buffer delay**

      To address synchronization issues between the main vocal and background accompaniment in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module. This method returns the millisecond-level audio buffer delay when playing media files.

    * **Advanced Beauty (Beta)**

      This release introduces a new advanced beauty feature with the following capabilities:

      * **Precision beauty effects**:
        * **Face shaping**: Supports independent fine-tuning of 29 facial areas (for example, face slimming, eye enlarging, and nose narrowing) or one-click natural results using presets.
        * **Style makeup options**: Eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
        * **Skin enhancements**: Teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.
      * **Unified API**: Manages all beauty, makeup, and filter functions through three core nodes (`BEAUTY`, `STYLE_MAKEUP`, and `FILTER`) using `IVideoEffectObject` for unified parameter configuration and lifecycle control.
      * **Ready-to-use presets**: Provides multiple style templates (for example, "Natural Beauty," "Senior Makeup," and "Cool White Filter") for immediate use.
      * **Dynamic parameter control**: Supports real-time reading and modifying of granular parameters (for example, smoothing strength and lipstick type) through key-value pairs, with support for saving custom configurations and resetting defaults.
      * **Local resource support**: All beauty resources, including effects, filters, and makeup assets, are packaged as local bundle files to ensure stability and reliability.

    * **Other new features**

      * Adds the `setPlaybackAudioFrameBeforeMixingParameters` method to set the audio frame format returned in the `onPlaybackAudioFrameBeforeMixing` callback, including sample rate, number of channels, and number of data samples per callback. After calling this method, the SDK returns the original pre-mix audio data according to the specified parameters.
      * Adds the `preloadEffectEx` method to preload audio effect files into specified channels, supporting both local and online files for use in multi-channel scenarios.
      * Adds the `playEffectEx` method to play audio effect files in specified channels with configurable parameters, including loop count, pitch, spatial position, volume, whether to publish to the channel, and playback start position.
      * The local screenshot upload feature now supports setting the video observation position for screenshots through the new `position` field in `ContentInspectModule`, enabling screenshots of original video data or video streams before or after effect processing.
      * Adds the `screenColorType` property to `SegmentationProperty` to improve portrait segmentation accuracy when using a green or blue screen for virtual backgrounds. You can specify the background color as green, blue, or set it to automatic recognition.

    #### Improvements [#improvements-96]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Window exclusion support for secondary displays**

      Before v4.6.2, configuring window exclusion (`excludeWindowList` in `ScreenCaptureParameters`) was not supported in multi-screen scenarios when sharing by screen ID (`startScreenCaptureByDisplayId`). This release adds support for this configuration.

      This release also adds `LocalVideoStreamReasonScreenCaptureExcludeWindowFailed` to `LocalVideoStreamReason` to report cases where window exclusion fails during screen sharing.

    * **Improved trigger timing of `onVideoDeviceStateChanged`**

      Before v4.6.2, the `onVideoDeviceStateChanged` callback could only be triggered after joining a channel. Starting from this release, you can receive this callback once after `IRtcEngine` initialization completes, and continue to receive it after joining a channel.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `onNetworkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Optimizes permission requests on Windows 11 24H2 and later to avoid unnecessary location data acquisition.
      * Adds support for G.711 and G.722 audio codecs when interoperating with Web clients, improving cross-platform audio compatibility and clarity.
      * Improves video clarity in screen sharing scenarios involving documents.
      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

    #### Issues fixed [#issues-fixed-98]

    This release fixes the following issues:

    * When playing multi-track songs with guide vocal enabled, noise occurred after calling `setAudioPitch` to adjust the pitch.
    * When a broadcaster created a custom audio capture track using `createCustomAudioTrack` with `trackType` set to `AudioTrackDirect`, pushed self-captured audio using `pushAudioFrame`, and then played sound effects using `playEffect`, the audience in the channel heard noise in the broadcaster's audio.
    * Apps integrated with the SDK occasionally experienced UI freezing due to main thread blocking during audio and video engagements.
    * When screen sharing was enabled with `enableHighLight` set to `true` in `ScreenCaptureParameters`, placing the shared window on top and maximizing it caused the local preview to flicker.
    * Apps sharing external screen video streams occasionally crashed after the external screen was disconnected.
    * When calling `openWithMediaSource` with `isLiveSource` set to `true` to play a pure video stream, playback failed.
    * Receivers occasionally heard noise when the sender transmitted multi-channel encoded audio.
    * When calling `open` twice to open different media resources, the `onPlayerInfoUpdated` callback returned information about the first resource when opening the second, which was incorrect.
    * When calling `enableAudioVolumeIndication` to enable volume indication for local streaming users and remote users, the local user volume returned by `onAudioVolumeIndication` was 0.
    * When using a 21:9 ultrawide display and setting a high resolution such as 3840×2160 for screen sharing, the shared image was cropped in both local preview and on the receiver side.
    * When calling `enableVideoImageSource` to enable placeholder streaming, the sender occasionally succeeded in publishing but `onVideoPublishStateChanged` reported the publish state as something other than `PublishStatePublished`, which was incorrect.
    * In multi-channel scenarios, when calling `setupRemoteVideoEx` to initialize remote user views before successfully joining with `joinChannelEx`, the first frame of remote user views occasionally had a large display delay.
    * After calling `open` to open an online sound effect file and `playEffect` to start playback, calling `seek` to set the playback position caused the file to play from the beginning instead of the specified position.
    * In media volume mode, when a broadcaster published microphone audio while simultaneously playing sound effects with `playEffect` and a music file with `startAudioMixing`, echo occasionally occurred.
    * After calling `joinChannelEx` to join a channel and `startOrUpdateChannelMediaRelay` to start cross-channel media relay, rejoining the channel after going offline and leaving occasionally caused `onChannelMediaRelayStateChanged` to report `state` as `RelayStateFailure` with `code` as `RelayErrorServerErrorResponse`.
    * On some laptop models with power-saving mode enabled, receivers occasionally heard echo when the sender shared screen and audio.
    * In online education scenarios, teachers occasionally observed audio and video out of sync for multiple students in the local view.
    * The second call to `enumerateVideoDevices` to retrieve the device list did not take effect.
    * On Windows 7 devices, when sharing a PowerPoint window running in full-screen auto-play mode with a large number of animations, the remote view occasionally flickered.

    ### v4.5.2 [#v452-4]

    v4.5.2 was released on March 13, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        v4.5.2 for Electron is comparable to native version v.4.5.1.
      </CalloutDescription>
    </CalloutContainer>

    #### New features [#new-features-86]

    1. **AI conversation scenario**

       This version adds the `AudioScenarioAiClient` audio scenario specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on AI-generated voice characteristics, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. It enhances conversation continuity and reliability while adapting to complex network conditions.

    #### Issues fixed [#issues-fixed-99]

    This release fixes the following issues:

    * When joining two or more channels simultaneously, and calling the `takeSnapshotEx` method to take screenshots of the local video streams in each channel consecutively, the screenshot of the first channel failed.
    * When using the `pause` method to pause playback, then calling `seek` to move to a specified position, and finally calling `play` to continue playback, the Media Player resumed from the position where it was paused, not the new specified position.
    * When using the Media Player, the file path of the media resource returned by the `getPlaySrc` did not change after calling the `switchSrc` method to switch to a new media resource.
    * In the interactive live streaming scenario, after joining a channel to watch live streams using `string` user id, the audience members occasionally saw that the audio was not synchronized with the video.
    * Plugins sometimes did not work when using AI noise suppression and AI echo cancellation plugins at the same time.

    ### v4.5.0 [#v450-5]

    v4.5.0 was released on December 10, 2024.

    #### Compatibility changes [#compatibility-changes-53]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Changes in strong video noise suppression implementation**

       This version adjusts the implementation of strong video noise suppression.

       `VideoDenoiserLevelStrength` is removed from `VideoDenoiserLevel`.

       Instead, after enabling video noise suppression by calling `setVideoDenoiserOptions`, you can call the `setBeautyEffectOptions` method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, enable video noise suppression first and use specific settings as detailed in `setLowlightEnhanceOptions`.

    2. **Changes in camera plug and unplug status**

       In previous versions, when the camera was unplugged and replugged, the `onVideoDeviceStateChanged` callback would report the device status as `MediaDeviceStateActive` (1) (device in use). Starting from this version, after the camera is replugged, the device status will change to `MediaDeviceStateIdle`(0) (device ready).

    3. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`CompressionPreference`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_compressionpreference.html) enumeration class, a new `PreferCompressionAuto` (-1) enumeration is added, replacing the original `PreferQuality` (1) as the default value. In this mode, the SDK will automatically choose between `PreferLowLatency` and `PreferQuality` based on your video scene settings to achieve the best user experience.
       * In the [`DegradationPreference`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_degradationpreference.html) enumeration class, a new `MaintainAuto` (-1) enumeration is added, replacing the original `MaintainQuality` (1) as the default value. In this mode, the SDK will automatically choose between `MaintainFramerate`, `MaintainBalanced`, and `MaintainResolution` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    #### New features [#new-features-87]

    1. **Live show scenario**

       This version adds the `ApplicationScenarioLiveshow`(3) (Live Show) enumeration to [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_videoapplicationscenariotype.html). You can call `setVideoScenario` to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency (no need to call `enableInstantMediaRendering`) to achieve better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the [`setLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (for example, screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`setFilterEffectOptions`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (`.cube`) in the `config` parameter to achieve custom filter effects such as whitening, vivid, cool, black and white, etc. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file for quickly achieving a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the [`startLocalAudioMixer`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_startlocalaudiomixer) method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **Color space settings**

       This version adds the `colorSpace` parameter to `VideoFrame` and `ExternalVideoFrame`. You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    6. **Others**

       * [`onLocalVideoStateChanged`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback adds the `LocalVideoStreamReasonDeviceDisconnected` enumeration, indicating that the currently used video capture device has been disconnected (e.g., unplugged). (Windows)
       * [`MediaDeviceStateType`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_mediadevicestatetype.html) adds the `MediaDeviceStatePluggedIn` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-97]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`takeSnapshotWithConfig`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotWithConfigEx`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * Optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * Supports using virtual cameras in YV12 format as video capture devices. (Windows)
       * When calling `switchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `onPlayerEvent` callback will report the `PlayerEventSwitchError` event, indicating an error occurred during media resource switching.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Issues fixed [#issues-fixed-100]

    This version fixes the following issues:

    * When calling `startScreenCaptureByWindowId` to share the screen, the window capture area specified by `regionRect` was inaccurate, resulting in incorrect width and height of the screen sharing window seen by the receiving end. (Windows)
    * Occasional errors of not finding system files during audio and video interaction on Windows 7 systems. (Windows)
    * When calling `followSystemRecordingDevice` or `followSystemPlaybackDevice` to set the audio capture or playback device used by the SDK to not follow the default system audio playback device, the local audio state callback `onLocalAudioStateChanged` is not triggered when the audio device is removed, which is not as expected. (Windows)

    ### v4.4.0 [#v440-5]

    v4.4.0 was released on August 29, 2024.

    #### Compatibility changes [#compatibility-changes-54]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion.
    To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see the table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onExtensionEvent`   | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    2. This version renames the following members in `ExternalVideoFrame`:

       * `d3d11_texture_2d` is renamed to `d3d11Texture2d`.
       * `texture_slice_index` is renamed to `textureSliceIndex`.
       * `metadata_buffer` is renamed to `metadataBuffer`.
       * `metadata_size` is renamed to `metadataSize`.

    #### New features [#new-features-88]

    1. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method. Pass in the sound effect types supported in the `VoiceAiTunerType` enum to achieve the effects such as a deep voice, cute voice, husky singing voice, and others.

    2. **1v1 video call scenario**

       This version adds `ApplicationScenario1v1`(1v1 video call) in `VideoApplicationScenarioType`. You can call `setVideoScenario` to set the video application scenario to 1v1 video call, the SDK optimizes performance to achieve low latency and high video quality, enhancing image quality, first frame rendering, latency on mid-to-low-end devices, and smoothness under poor network conditions.

    #### Improvements [#improvements-98]

    1. **Adaptive hardware decoding support (Windows)**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and
       effectively reducing the system load.

    2. **Rendering performance enhancement (Windows)**

       DirectX 11 renderer is now enabled by default on Windows devices, providing high-performance and high-quality graphics rendering capabilities.

    3. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    4. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * An enumerator is added in the `onLocalVideoStateChanged` callback, indicating that the display used for screen capture has been disconnected.
       * Optimizes the video link for window sharing, reducing CPU usage (macOS).
       * Improves echo cancellation for screen sharing scenarios.
       * Adds the `channelId` parameter to `Metadata`, which is used to get the channel name from which the metadata is sent.
       * Deprecates redundant enumeration values `ClientRoleChangeFailedRequestTimeOut` and `ClientRoleChangeFailedConnectionFailed` in `ClientRoleChangeFailedReason`.

    #### Issues fixed [#issues-fixed-101]

    This release fixes the issue where the app crashed during audio and video interactions after the user actively denied
    the permission to use audio and video devices (macOS).

    ### v4.3.2 [#v432-4]

    v4.3.2 was released on June 6, 2024.

    #### Improvements [#improvements-99]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    #### Issues fixed [#issues-fixed-102]

    This version fixed the following issues:

    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app occasionally crashed when remote users left the channel.
    * Calling `leaveChannelEx` without passing in the `options` parameter occasionally led to app crashes.
    * The screen occasionally flickered on the receiver's side when sharing a PPT window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and playing PPT animations (Windows).
    * The window border did not retain its original size after exiting the presentation and then maximizing the PPT window when sharing a WPS PPT window on Windows 7 using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_screencaptureparameters.html) to `true` (Windows).
    * The specified window could not be brought to the foreground if it was covered by other windows when sharing a window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `windowFocus` and `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_screencaptureparameters.html) to `true` (Windows).
    * Clicking on the desktop widget caused the outlined part to flicker when sharing and highlighting a window on a Windows 7 device (Windows).

    ### v4.3.1 [#v431-4]

    v4.3.1 was released on May 9, 2024.

    #### New features [#new-features-89]

    1. **Portrait center stage (macOS)**

       To enhance the presentation effect in online meetings, shows, and online education use-cases, this version introduces the [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) method to activate portrait center stage. This ensures that presenters, regardless of movement, always remain centered in the video frame, achieving better presentation effects.

       Before enabling portrait center stage, it is recommended to verify whether your current device supports this feature by calling [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported). See [API documentation](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) for the list of supported devices.

    2. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_encryptionconfig.html) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enableencryption). If there are issues causing failure in data stream encryption or decryption, these can be identified by the newly added `EncryptionErrorDatastreamDecryptionFailure` and `EncryptionErrorDatastreamEncryptionFailure` enumerations.

    3. **Adaptive configuration for low-quality video streams**

       This version introduces an adaptive configuration for low-quality video streams. When you activate the dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setdualstreammode2), the SDK defaults to the following behaviors:

       * The default encoding resolution for the low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the low-quality video streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    4. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    5. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-100]

    1. **Optimization for game use-case screen sharing (Windows)**

       This version specifically optimizes screen sharing for game use-cases, enhancing performance, stability, and clarity in ultra-high definition (4K, 60 fps) game use-cases, resulting in a clearer, smoother, and more stable gaming experience for players.

    2. **Audio device type detection (macOS)**

       This version adds the `deviceTypeName` in [AudioDeviceInfo](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_audiodeviceinfo.html), used to identify the type of audio devices, such as built-in, USB, HDMI, and so on.

    3. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure, especially around the fingers, are more stable, significantly reducing flickering at the edges.

    4. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `EarMonitoringFilterReusePostProcessingFilter` in `EarMonitoringFilterType`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    5. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen-sharing use-cases to save system performance overhead (macOS, Windows).
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * In [AudioEffectPreset](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_audioeffectpreset.html), a new enumeration `RoomAcousticsChorus` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_remoteaudiostats.html), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending side to when the audio is played on the receiving side.

    #### Issues fixed [#issues-fixed-103]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * In screen sharing use-cases, when the app enabled sound card capture with [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording) to capture audio from the shared screen, the transmission of the sound card captured audio failed after a local user manually disabled the local audio capture device, preventing remote users from hearing the shared screen's audio (Windows).
    * In audio-video interactions, if a user inserted headphones into the device and manually switched the system audio output to speakers, and later the app called [setPlaybackDevice](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_setplaybackdevice) to specify the headphone as the audio playback device, audio output did not switch back to speakers as expected after the headphones were removed (macOS).
    * During interactions, when a local user set the system default playback device to speakers, there was no sound from the remote end (Windows).
    * When sharing an Excel document window, remote users occasionally saw a green screen (Windows).
    * On devices using Intel graphics cards, there was an occasional performance regression when publishing a low-quality video stream (Windows).
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-58]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (macOS)
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (macOS)
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [unregisterFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * The `publishLipSyncTrack` member in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_channelmediaoptions.html)
    * [MediaSourceType](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_mediasourcetype.html) adds `SpeechDrivenVideoSource`
    * [VideoSourceType](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_videosourcetype.html) adds `VideoSourceSpeechDriven`
    * [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [EncryptionErrorType](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `EncryptionErrorDatastreamDecryptionFailure`
      * `EncryptionErrorDatastreamEncryptionFailure`
    * [AudioDeviceInfo](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_audiodeviceinfo.html) adds `deviceTypeName` (macOS)
    * [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ErrorCodeType](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_errorcodetype.html) adds `ErrDatastreamDecryptionFailed`
    * [AudioEffectPreset](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_audioeffectpreset.html) adds `RoomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [EarMonitoringFilterType](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_earmonitoringfiltertype.html) adds a new enumeration `EarMonitoringFilterBuiltInAudioFilters`

    ### v4.3.0 [#v430-5]

    v4.3.0 was released on February 28, 2024.

    #### Compatibility changes [#compatibility-changes-55]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `onLocalAudioStateChanged`         | `error`                 | `reason`           |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `onRtmpStreamingStateChanged`      | `errCode`               | `reason`           |

       | Original enumeration class   | New enumeration class      |
       | ---------------------------- | -------------------------- |
       | `LocalAudioStreamError`      | `LocalAudioStreamReason`   |
       | `LocalVideoStreamError`      | `LocalVideoStreamReason`   |
       | `DirectCdnStreamingError`    | `DirectCdnStreamingReason` |
       | `MediaPlayerError`           | `MediaPlayerReason`        |
       | `RtmpStreamPublishErrorType` | `RtmpStreamPublishReason`  |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                          | Alternative methods and callbacks  |
       | ------------------------------------------------------ | ---------------------------------- |
       | `startChannelMediaRelay`,`updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | `startChannelMediaRelayEx`,`updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `onChannelMediaRelayEvent`                             | `onChannelMediaRelayStateChanged`  |

    3. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [LocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_localvideostreamreason.html) class:

       * The value of `LocalVideoStreamReasonScreenCapturePaused` (formerly `LocalVideoStreamReasonScreenCapturePaused`) has been changed from `23` to `28`.
       * The value of `LocalVideoStreamReasonScreenCaptureResumed` (formerly `LocalVideoStreamReasonScreenCaptureResumed`) has been changed from `24` to `29`.
       * The `LocalVideoStreamReasonCodecNotSupport` enumeration has been changed to `LocalVideoStreamReasonCodecNotSupport`.

    4. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    5. **Audio loopback capturing**

       * Before v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will not be disabled.
       * As of v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will be disabled as well. If you need to enable audio loopback capturing, you need to enable the audio module by calling the [enableAudio](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

    #### New features [#new-features-90]

    1. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo)
          to set the first view: Set the `position` parameter to `PositionPostCapturerOrigin` (introduced in this release) in `VideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo)
          to set the second view: Set the `position` parameter to `PositionPostCapturer` in `VideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    2. **Query Device Score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    3. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the [openWithMediaSource](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayer.html#api_imediaplayer_openwithmediasource) method and enable this function by setting the `enableMultiAudioTrack` parameter in [MediaSource](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_mediasource.html).

    4. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption): Sets fallback option for the subscribed video stream in weak network conditions.
       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onremotesubscribefallbacktoaudioonly): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * [setPlaybackDeviceVolume](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_setplaybackdevicevolume): Sets the volume of the audio playback device.
       * [getRecordingDeviceVolume](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdevicevolume): Sets the volume of the audio capturing device.
       * [setPlayerOptionInInt](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionInString](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption2): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-101]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setinearmonitoringvolume).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_ibasespatialaudioengine.html#api_ibasespatialaudioengine_setzones) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling the [ILocalSpatialAudioEngine](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) method.

    4. **Other Improvements**

       This release also includes the following improvements:

       * The [onLocalVideoStateChanged](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback is improved with the inclusion of the `LocalVideoStreamReasonScreenCaptureAutoFallback` enumeration, signaling unexpected errors during the screen sharing process (potentially due to window blocking failure), resulting in performance degradation without impacting the screen sharing process itself.
       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_playerplaybackstats.html).

    #### Issues fixed [#issues-fixed-104]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [onLocalVideoStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.
    * When sharing in a specified screen area, the mouse coordinates within the shared area are inaccurate. When the mouse is near the border of the shared area, the mouse may not be visible in the shared screen.
    * The SDK failed to detect any changes in the audio routing after plugging in and out 3.5 mm earphones.

    #### API changes [#api-changes-59]

    **Added**

    * The `subviewUid` member in [VideoCanvas](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_videocanvas.html)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CustomVideoSource` enumeration in [MediaSourceType](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_mediasourcetype.html)
    * The `RouteBluetoothDeviceA2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/enum_audioroute.html)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_playerplaybackstats.html)

    **Modified**

    * All `ERROR` fields in the following enumerations are changed to `REASON`:
      * `LocalAudioStreamErrorOk`
      * `LocalAudioStreamErrorFailure`
      * `LocalAudioStreamErrorDeviceNoPermission`
      * `LocalAudioStreamErrorDeviceBusy`
      * `LocalAudioStreamErrorRecordFailure`
      * `LocalAudioStreamErrorEncodeFailure`
      * `LocalAudioStreamErrorRecordInvalidId` (Windows)
      * `LocalAudioStreamErrorPlayoutInvalidId` (Windows)
      * `LocalVideoStreamErrorOk`
      * `LocalVideoStreamErrorFailure`
      * `LocalVideoStreamErrorDeviceNoPermission`
      * `LocalVideoStreamErrorDeviceBusy`
      * `LocalVideoStreamErrorCaptureFailure`
      * `LocalVideoStreamErrorCodecNotSupport`
      * `LocalVideoStreamErrorDeviceNotFound`
      * `LocalVideoStreamErrorDeviceDisconnected`
      * `LocalVideoStreamErrorDeviceInvalidId`
      * `LocalVideoStreamErrorScreenCaptureWindowMinimized`
      * `LocalVideoStreamErrorScreenCaptureWindowClosed`
      * `LocalVideoStreamErrorScreenCaptureWindowOccluded`
      * `DirectCdnStreamingErrorOk`
      * `DirectCdnStreamingErrorFailed`
      * `DirectCdnStreamingErrorAudioPublication`
      * `DirectCdnStreamingErrorVideoPublication`
      * `DirectCdnStreamingErrorNetConnect`
      * `DirectCdnStreamingErrorBadName`
      * `PlayerErrorNone`
      * `PlayerErrorInvalidArguments`
      * `PlayerErrorInternal`
      * `PlayerErrorNoResource`
      * `PlayerErrorInvalidMediaSource`
      * `PlayerErrorUnknownStreamType`
      * `PlayerErrorObjNotInitialized`
      * `PlayerErrorCodecNotSupported`
      * `PlayerErrorVideoRenderFailed`
      * `PlayerErrorInvalidState`
      * `PlayerErrorUrlNotFound`
      * `PlayerErrorInvalidConnectionState`
      * `PlayerErrorSrcBufferUnderflow`
      * `PlayerErrorInterrupted`
      * `PlayerErrorNotSupported`
      * `PlayerErrorTokenExpired`
      * `PlayerErrorUnknown`
      * `RtmpStreamPublishErrorOk`
      * `RtmpStreamPublishErrorInvalidArgument`
      * `RtmpStreamPublishErrorEncryptedStreamNotAllowed`
      * `RtmpStreamPublishErrorConnectionTimeout`
      * `RtmpStreamPublishErrorInternalServerError`
      * `RtmpStreamPublishErrorRtmpServerError`
      * `RtmpStreamPublishErrorTooOften`
      * `RtmpStreamPublishErrorReachLimit`
      * `RtmpStreamPublishErrorNotAuthorized`
      * `RtmpStreamPublishErrorStreamNotFound`
      * `RtmpStreamPublishErrorFormatNotSupported`
      * `RtmpStreamPublishErrorNotBroadcaster`
      * `RtmpStreamPublishErrorTranscodingNoMixStream`
      * `RtmpStreamPublishErrorNetDown`
      * `RtmpStreamPublishErrorInvalidPrivilege`
      * `RtmpStreamUnpublishErrorOk`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `ChannelMediaRelayEvent`

    ### v4.2.6 [#v426-4]

    v4.2.6 was released on November 24, 2023.

    #### Issues fixed [#issues-fixed-105]

    This version fixed the issue of stuttering or frozen video on the receiving end in specific use-cases, such as when the network packet loss rate was high, or when the broadcaster left the channel without destroying the engine and then re-joined the channel.

    ### v4.2.4 [#v424]

    v4.2.4 was released on October 25, 2023.

    #### Issues fixed [#issues-fixed-106]

    This release fixes the following issue:

    The `AgoraRtcWrapper` version number in `CFBundleShortVersionString` on macOS is wrong, which interferes with submitting the App to the App Store.

    ### v4.2.3 [#v423-4]

    v4.2.3 was released on October 20, 2023.

    #### New features [#new-features-91]

    1. **Update video screenshot and upload**

    To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, an optional parameter `serverConfig` is added in `ContentInspectConfig`. This parameter is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

    This version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **ID3D11Texture2D Rendering**

    As of this release, the SDK supports video formats of type ID3D11Texture2D, improving the rendering effect of video frames in game use-cases. You can set `format` to `VideoTextureId3d11texture2d` when pushing external raw video frames to the SDK by calling `pushVideoFrame`. By setting the **d3d11\_texture\_2d** and **texture\_slice\_index** properties, you can determine the ID3D11Texture2D texture object to use.

    3. **Local video status error code update**

    In order to help users understand the exact reasons for local video errors in screen sharing use-cases, the following sets of enumerations have been added to the `onLocalVideoStateChanged` callback:

    * `LocalVideoStreamErrorScreenCapturePaused`(23): Screen capture has been paused. A common use-case for reporting this error code is that the current screen may have been switched to a secure desktop, such as a UAC dialog box or Winlogon desktop.
    * `LocalVideoStreamErrorScreenCaptureResumed`(24): Screen capture has resumed from the paused state.
    * `LocalVideoStreamErrorScreenCaptureWindowHidden`(25): The window being captured on the current screen is in a hidden state and is not visible on the current screen.
    * `LocalVideoStreamErrorScreenCaptureWindowRecoverFromHidden`(26): The window for screen capture has been restored from the hidden state.
    * `LocalVideoStreamErrorScreenCaptureWindowRecoverFromMinimized`(27): The window for screen capture has been restored from the minimized state.

    4. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperforming, the error code `-4: ErrNotSupported` is returned, indicating that the device does not support the feature.

    #### Improvements [#improvements-102]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10%. Specific values may vary depending on the device model and platform.

    2. **Screen sharing use-case optimization**

       This release optimizes the performance and encoding efficiency in ultra-high-definition (4K, 60 fps) game sharing use-cases, effectively reducing the system resource usage during screen sharing.

    **Other Improvements**

    This release includes the following additional improvements:

    * Optimizes the logic of handling invalid parameters. When you call the `setPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code `-2`, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crashing when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-107]

    This release fixed the following issues:

    * Occasional crashes and dropped frames in screen sharing use-cases on macOS.
    * Occasional crashes when joining a channel on macOS.
    * When calling the `playEffect` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * Calling `takeSnapshotEx` once received the `onSnapshotTaken` callback for multiple times.

    #### API changes [#api-changes-60]

    **Added**

    * `enableContentInspectEx`

    * `contentInspectImageModeration` in `ContentInspectType`

    * `serverConfig` in `ContentInspectConfig`

    * The following enumerations in `onLocalVideoStateChanged`:

      * `LocalVideoStreamErrorScreenCapturePaused`
      * `LocalVideoStreamErrorScreenCaptureResumed`
      * `LocalVideoStreamErrorScreenCaptureWindowHidden`
      * `LocalVideoStreamErrorScreenCaptureWindowRecoverFromHidden`
      * `LocalVideoStreamErrorScreenCaptureWindowRecoverFromMinimized`

    * `d3d11_texture_2d` and `texture_slice_index` in `ExternalVideoFrame`

    * `VideoTextureId3d11texture2d` in `VideoPixelFormat`

    * `isFeatureAvailableOnDevice`

    * `FeatureType`

    ### v4.2.2 [#v422-5]

    v4.2.2 was released on August 1, 2023.

    #### New features [#new-features-92]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users join a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info" />

    All 4.x SDKs support using wildcard tokens.
    \:::

    2. **Preloading channels**

       This release adds `preloadChannel` and `preloadChannelWithUserAccount` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you join a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    #### Improvements [#improvements-103]

    **Channel media relay**

    The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    #### Issues fixed [#issues-fixed-108]

    This release fixed the following issues:

    * Occasionally, noise occurred when the local user listened to their own and remote audio after joining the channel. (macOS)
    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In multi-device audio recording use-cases, after repeatedly plugging and unplugging or enabling/disabling the audio recording device, no sound could be heard occasionally when calling the `startRecordingDeviceTest` to start an audio capturing device test. (Windows)

    #### API changes [#api-changes-61]

    **Added**

    * `preloadChannel`
    * `preloadChannelWithUserAccount`
    * `updatePreloadChannelToken`

    ### v4.2.1 [#v421-6]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-104]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-109]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * After enabling the screen sharing feature on the sending end, there was high delay until the receiving end could see the shared screen. (macOS)
    * When the sending end mixed and published two streams of video captured by two cameras locally, the video from the second camera was occasionally missing on the receiving end. (Windows)

    ### v4.2.0 [#v420-6]

    v4.2.0 was released on May 29, 2023.

    #### Compatibility changes [#compatibility-changes-56]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture**

    This release optimizes the APIs for camera and screen capture function. As of v4.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter:

    | Deleted Methods                                                | Alternative Methods              |
    | :------------------------------------------------------------- | :------------------------------- |
    | `startPrimaryCameraCapture`<br />`startSecondaryCameraCapture` | `startCameraCapture`             |
    | `stopPrimaryCameraCapture`<br />`stopSecondaryCameraCapture`   | `stopCameraCapture`              |
    | `startPrimaryScreenCapture`<br />`startSecondaryScreenCapture` | `startScreenCaptureBySourceType` |
    | `stopPrimaryScreenCapture`<br />`stopSecondaryScreenCapture`   | `startScreenCaptureBySourceType` |

    **2. Video data acquisition**

    * The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.
    * The following callbacks are deleted. Get the video source type through the `sourceType` parameter in the `onPreEncodeVideoFrame` and `onCaptureVideoFrame` callbacks.
      * `onSecondaryPreEncodeCameraVideoFrame`
      * `onScreenCaptureVideoFrame`
      * `onPreEncodeScreenVideoFrame`
      * `onSecondaryPreEncodeScreenVideoFrame`

    **3. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `ChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `ChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **4. Local video mixing**

    * The `VideoInputStreams` in `LocalTranscoderConfiguration` is changed to `videoInputStreams`.
    * The `MediaSourceType` in `TranscodingVideoStream` is changed to `VideoSourceType`.

    **5. Virtual sound card (macOS)**

    As of v4.2.0, Agora supports third-party virtual sound cards. You can use a third-party virtual sound card as the audio input or output device for the SDK. You can use the `stateChanged` callback to see whether the current input or output device selected by the SDK is a virtual sound card.

    <CalloutContainer type="info">
      <CalloutDescription>
        If you set AgoraALD or Soundflower as the default input or output device when joining a channel, you will not hear audio.
      </CalloutDescription>
    </CalloutContainer>

    **6. Upgrade the default video encoding resolution**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **7. Miscellaneous**

    * `onApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * The `IAudioFrameObserver` class is renamed to `IAudioPcmFrameSink`, thus the prototypes of the following methods are updated accordingly:
      * `onFrame`
      * `registerAudioFrameObserver` and `unregisterAudioFrameObserver` in `IMediaPlayer`
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-93]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode to balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background feature. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting scenarios where high bitrates are required, ensuring smoothness when multiple streams are subscribed to by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    Starting from this release, the local video mixing feature works on macOS. In addition, this release adds the `onLocalVideoTranscoderError` callback. When there is an error in starting or updating the local video mixing, the SDK triggers this callback to report the reason for the failure.

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    **6. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **7. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `onVideoRenderingTracingResult` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks **Join Channel** button and then get the indicators in the video frame rendering process through the `onVideoRenderingTracingResult` callback. This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-105]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced rendering compatibility (Windows)**

    This release enhances the rendering compatibility of the SDK. Issues like black screens caused by rendering failures on certain devices are fixed.

    **3. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **4. Multi-camera capture and multi-screen capture**

    This release introduces `startCameraCapture` and `startScreenCaptureBySourceType`. By calling these methods multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras and screens for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras and displays need to be connected.

    **5. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **6. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    **7. Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode.

    When the video processing mode is `ProcessModeReadOnly`, the return value is reserved for future use.
    When the video processing mode is `ProcessModeReadWrite`, the SDK receives the video frame when the return value is `true`. The video frame is discarded when the return value is `false`.

    #### Issues fixed [#issues-fixed-110]

    This release fixed the following issues:

    * When the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.
    * The receiver received the low-quality stream originally and automatically switched to the high-quality stream after a few seconds (macOS).
    * Incorrect information in the type field of the return value after calling `getDefaultAudioDevice` (macOS).
    * Occasional screen jitter during screen sharing (macOS).
    * When using Agora Media Player to play RTSP video streams, the video images sometimes appeared pixelated (Windows).
    * Playing audio files with a sample rate of 48 kHz failed.
    * If the rendering view of the player was set as a `UIViewController`'s view, the video was zoomed from the bottom-left corner to the middle of the screen when entering full-screen mode (macOS).
    * Adding an Alpha channel to an image in the PNG or GIF format failed when the local client mixed video streams (Windows).
    * After joining the channel, remote users saw a watermark even though the watermark was deleted (Windows).
    * If a watermark was added after starting screen sharing, the watermark was not displayed on the screen (Windows).
    * When joining a channel and accessing an external camera, calling `setDevice` to specify the video capture device as the external camera did not take effect.
    * When trying to outline the shared window and put it on top, the shared window did not stay on top of other windows (Windows).
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.

    #### API changes [#api-changes-62]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startScreenCaptureBySourceType`
    * `stopScreenCaptureBySourceType`
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `onLocalVideoTranscoderError`
    * `startLocalVideoTranscoder`(macOS)
    * `updateLocalTranscoderConfiguration` (macOS)
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioAinsMode`
    * `AudioTrackType`
    * `VideoApplicationScenarioType`
    * `ScreenCaptureFramerateCapability`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `BackgourndNone` and `BackgroundVideo` enumerators in `BackgroundSourceType`

    **Deprecated**

    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `ChannelMediaRelayEvent`

    **Deleted**

    * `startPrimaryScreenCapture `
    * `startSecondaryScreenCapture`
    * `stopPrimaryScreenCapture`
    * `stopSecondaryScreenCapture`
    * `startPrimaryCameraCapture`
    * `startSecondaryCameraCapture`
    * `stopPrimaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `onSecondaryPreEncodeCameraVideoFrame` (Windows)
    * `onScreenCaptureVideoFrame` (Windows)
    * `onPreEncodeScreenVideoFrame` (Windows)
    * `onSecondaryPreEncodeScreenVideoFrame` (Windows)
    * `onApiCallExecuted`
    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions`

    ### v4.1.0 [#v410-6]

    v4.1.0 was released on December 20, 2022.

    #### Compatibility changes [#compatibility-changes-57]

    This release deletes the `sourceType` parameter in `enableDualStreamMode`, because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK; you no longer need to specify the video source type.

    #### New features [#new-features-94]

    **1. In-ear monitoring**

    This release adds support for in-ear monitoring. You can call `enableInEarMonitoring` to enable the in-ear monitoring function.

    To adjust the in-ear monitoring volume, you can call `setInEarMonitoringVolume`.

    **2. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use. The available values are `UNKNOWN`, `DISCONNECTED`, `LAN`, `WIFI`, `2G`, `3G`, `4G`, and `5G`. When the local network connection type changes, the SDK triggers the `onNetworkTypeChanged` callback to report the current network connection type.

    **3. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports the three audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Agora also supports publishers in choosing whether the audio streams being published are to be filtered based on volume. Streams that are not filtered bypass this filter mechanism and are transported directly to the receivers. In use-cases with a number of publishers, enabling this function helps reduce the bandwidth and device system pressure for the receivers.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this function, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **4. Dual-stream mode**

    This release optimizes the dual-stream mode. You can call `enableDualStreamMode` and `enableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing to a low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams). Follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `setRemoteVideoStreamType` or `setRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify this default behavior, you can call `setDualStreamMode` and set the `mode` parameter to `disableSimulcastStream` (never send low-quality video streams) or `enableSimulcastStream` (always send low-quality video streams).

    **5. Loopback device (Windows)**

    The SDK uses the playback device as the loopback device by default. As of 4.1.0, you can specify a loopback device separately and publish the captured audio to the remote end.

    * `setLoopbackDevice`: Specifies the loopback device. If you do not want the current playback device to be the loopback device, you can call this method to specify another device as the loopback device.
    * `getLoopbackDevice`: Gets the current loopback device.
    * `followSystemLoopbackDevice`: Whether the loopback device follows the default playback device of the system.

    **6. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense-of-presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation` respectively, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`. The receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the audio experience for users with headphones. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call `setHeadphoneEQParameters` to adjust the EQ.

    **7. Encoded video frame observer**

    This release adds the `setRemoteVideoSubscriptionOptions` and `setRemoteVideoSubscriptionOptionsEx` methods. When you call the `registerVideoEncodedFrameObserver` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default.
    If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options,
    see the [API reference](https://api-ref.agora.io/en/video-sdk/electron/4.x/API/class_imediaengine.html#api_imediaengine_registervideoencodedframeobserver).

    **8. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this feature, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **9. Register extensions (Windows)**

    This release adds the `registerExtension` method for registering extensions. When using a third-party extension, you need to call the extension-related APIs in the following order:

    `loadExtensionProvider` -> `registerExtension` -> `setExtensionProviderProperty` -> `enableExtension`

    **10. Device management**

    This release adds a series of callbacks to help you better understand the status of your audio and video devices:

    * `onVideoDeviceStateChanged`: Occurs when the status of the video device changes.
    * `onAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `onAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **11. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `CameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **12. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * The `options` parameter in the `leaveChannelEx` method, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **13. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advanceOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `CompressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `EncodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **14. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `onClientRoleChanged` callback. The value of this parameter is as follows:

    * `AudienceLatencyLevelLowLatency (1)`: Low latency.
    * `AudienceLatencyLevelUltraLowLatency (2)`: Ultra-low latency.

    **15. Brand-new AI Noise Suppression**

    The SDK supports a new version of AI noise reduction (in comparison to the basic AI noise reduction in v4.0.0). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option.

    To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    #### Improvements [#improvements-106]

    **1. Video information change callback**

    This release optimizes the trigger logic of `onVideoSizeChanged`, which can also be triggered and report the local video size change when `startPreview` is called separately.

    **2. First video frame rendering (Windows)**

    This release speeds up the first video frame rendering time to improve the video experience.

    **3. Screen sharing**

    In addition to the usability enhancements detailed in the [fixed issued](#issue-fixed) section, this release includes a number of functional improvements to screen sharing, as follows:

    **All**

    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a device with an Intel Core i7-9750H CPU @ 2.60 GHz or better.

    **Windows**

    * New `minimizeWindow` member in `ScreenCaptureSourceInfo` to indicate whether the target window is minimized.
    * New `enableHighLight`, `highLightColor`, and `highLightWidth` members in `ScreenCaptureParameters` so that you can place a border around the target window or screen when screen sharing.
    * Compatibility with a greater number of mainstream apps, including WPS Office, Microsoft Office PowerPoint, Visual Studio Code, Adobe Photoshop, Windows Media Player, and Scratch.
    * Compatibility with additional devices and operating systems, including: Window 8 systems, devices without discrete graphics cards, and dual graphics devices.

    **macOS**

    * Compatibility with additional devices and use-cases, including: dual graphics devices and screen sharing using external screens.

    **3. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `RelayEventPacketUpdateDestChannelRefused` (8), and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **4. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **5. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `audioScenarioMeeting` scenario.
    * Improves the smoothness of SDK video rendering.
    * Reduces the CPU usage and power consumption of the local device when the host calls the `muteLocalVideoStream` method.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network use-cases.

    #### Issues fixed [#issues-fixed-111]

    This release fixes the following issues:

    **All**

    * When calling `setVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.
    * When using the Agora media player to play videos, after you played and paused the video, and then called the `seek` method to specify a new position for playback, the video image occasionally remained unchanged; if you called the `resume` method to resume playback, the video was sometimes played at a speed faster than the original one.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.
    * The call `getExtensionProperty` failed and returned an empty string.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
    * When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `setVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.
    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged,
      or displayed a black screen.
    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was
      sharing a screen.

    **Windows**

    * When `stopPreview` was called to disable the local video preview, the virtual background that had been set up was occasionally invalidated.
    * Crashes occasionally occurred when exiting a channel and joining it multiple times with virtual background enabled and set to blur effect.
    * If the local client used a camera with a resolution set to 1920 × 1080 as the video capture source, the resolution of the remote video was occasionally inconsistent with the local client.
    * In screen sharing use-cases, when the user minimized and then restored the shared window, the remote video occasionally switched to the low-quality stream.
    * When the host started screen sharing during live streaming, the audience members sometimes heard echoes.
    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * In screen sharing use-cases, a black screen appeared when sharing a screen between a landscape monitor and a portrait monitor.
    * In screen sharing use-cases with a window excluded, the application crashed when the specified shared area exceeded the screen resolution.
    * The application failed to exclude a window using the `startScreenCaptureByDisplayId` method for screen sharing.
    * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was sharing a screen.
    * In screen sharing use-cases, when the user shared the screen by window, the mouse in the shared screen was not in its actual position.
    * When switching from a non-screen sharing use-case to a screen sharing one, the application occasionally crashed if the user did not switch the resolution accordingly.

    **macOS**

    * When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `setVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.
    * In screen sharing use-cases on Mac devices, when the user minimized or closed a shared application window, another window of the same application was automatically shared.
    * In screen sharing use-cases, the shared window of a split screen was not highlighted correctly.
    * After starting and stopping the audio capture device test, there was no sound when the audio playback device was subsequently started.
    * The `onVideoPublishStateChanged` callback reported an inaccurate video source type.

    #### API changes [#api-changes-63]

    **Added**

    * `getNativeHandle`
    * `getMusicContentCenter`
    * `getPlaybackDefaultDevice`
    * `getRecordingDefaultDevice`
    * `enableDualStreamModeEx`
    * `setDualStreamMode`
    * `setDualStreamModeEx`
    * `SimulcastStreamMode`
    * `getNetworkType`
    * `setLoopbackDevice` (Windows)
    * `getLoopbackDevice` (Windows)
    * `followSystemLoopbackDevice` (Windows)
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `setHeadphoneEQPreset`
    * `setHeadphoneEQParameters`
    * `HeadphoneEqualizerPreset`
    * `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoSubscriptionOptionsEx`
    * `VideoSubscriptionOptions`
    * `AdvancedOptions`
    * `EncodingPreference`
    * `CompressionPreference`
    * `adjustUserPlaybackSignalVolumeEx`
    * `RhythmPlayerStateType`
    * `RhythmPlayerErrorType`
    * `enableAudioVolumeIndicationEx`
    * `onVideoDeviceStateChanged`
    * `onAudioDeviceStateChanged`
    * `onAudioDeviceVolumeChanged`
    * `registerExtension` (Windows)
    * `muteLocalAudioStreamEx`
    * `muteLocalVideoStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `muteAllRemoteVideoStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`

    **Modified**

    * Adds `isAudioFilterable` in `ChannelMediaOptions`
    * Adds `enable_doppler` in `SpatialAudioParams`
    * Adds `minimizeWindow` in `ScreenCaptureSourceInfo`
    * Adds `followEncodeDimensionRatio` in `CameraCapturerConfiguration`
    * Adds `options` in `leaveChannelEx`
    * Adds `advanceOptions` in `VideoEncoderConfiguration`
    * Adds `newRoleOptions` in `onClientRoleChanged`
    * Adds `setupMode`, `mediaPlayerId`, and `cropArea` in `VideoCanvas`
    * Adds `hwEncoderAccelerating` in `LocalVideoStats`
    * Removes `sourceType` in `enableDualStreamMode`
    * `enableInEarMonitoring`: Supports Windows and macOS
    * `setEarMonitoringAudioFrameParameters`: Supports Windows and macOS
    * `setInEarMonitoringVolume`: Supports Windows and macOS
    * `onEarMonitoringAudioFrame`: Supports Windows and macOS
    * `ScreenCaptureParameters`: Supports Windows

    **Deprecated**

    * `onApiCallExecuted`: Use the callbacks triggered by specific methods instead.
    * `RelayEventPacketUpdateDestChannelRefused (8)` in `ChannelMediaRelayEvent`

    ### v4.0.0 [#v400-6]

    v4.0.0 was released on September 29, 2022.

    #### Compatibility changes [#compatibility-changes-58]

    **Integration change**

    This release has changed the SDK package name from `electron-agora-rtc-ng` to `agora-electron-sdk`, and optimized the implementation of some features, resulting in incompatibility with v4.0.0. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migration guide](/en/realtime-media/video/reference/migration-guide).

    #### New features [#new-features-95]

    **1. Multiple media tracks**

    This release supports one `IRtcEngine` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `RtcEngineEx` and `ChannelMediaOptions.`

    * After calling `joinChannel` to join the first channel, call `joinChannelEx` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `ChannelMediaOptions` settings.
    * You can simultaneously publish multiple sets of video streams captured by multiple cameras or screen sharing by setting `publishSecondaryCameraTrack` and `publishSecondaryScreenTrack` in `ChannelMediaOptions`.

    This release adds `createCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured video in the channel:

    1. Create a custom video track: Call this method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `ChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `pushVideoFrame`, and specify `videoTrackId` as the ID of the custom video track in step 2 in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Ultra HD resolution (Beta)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capture, encoding, decoding and rendering, and now supports 4K resolution. The improved FEC (Forward Error Correction) algorithm enables adaptive switches according to the frame rate and number of video frame packets, which further reduces the video stuttering rate in 4K scenes.

    Additionally, you can set the encoding resolution to 4K (3840 × 2160) and the frame rate to 60 fps when calling `SetVideoEncoderConfiguration`. The SDK supports automatic fallback to the appropriate resolution and frame rate if your device does not support 4K.

    This feature has certain requirements with regards to device performance and network bandwidth, and the supported upstream and downstream frame rates vary on different platforms. To enable this feature, contact [technical support](mailto\:support@agora.io).

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayer` method to create a media player object, you can then call the methods in the `IMediaPlayer` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    * Plays local and online media files.
    * Preloads media files.
    * Changes the CDN route for playing media files according your network conditions.
    * Shares the audio and video streams being played with remote users.
    * Caches data when playing media files.

    **4. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `UltraHighQualityVoice` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AudioScenarioChorus` enumeration in `AudioScenarioType`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **6. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `ChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `ChannelMediaOptions` when calling `joinChannel` or `joinChannelEx` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelMediaOptions` to update the settings in `ChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **7. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function in the following ways.

    * Call the `StartScreenCaptureByDisplayId` method before joining a channel, and then call `JoinChannel` \[2/2] to join a channel and set `publishScreenTrack` or `publishSecondaryScreenTrack` as true.
    * Call the `StartScreenCaptureByDisplayId` method after joining a channel, and then call `UpdateChannelMediaOptions` to set `publishScreenTrack` or `publishSecondaryScreenTrack` as true.

    **8. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add a user ID that you want to subscribe to in your allowlist, or add a user ID for the streams you do not wish to see to your blocklists. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `IRtcEngineEx` interface:

    * `SetSubscribeAudioBlocklist`：Set the audio subscription blocklist.
    * `SetSubscribeAudioAllowlist`：Set the audio subscription allowlist.
    * `SetSubscribeVideoBlocklist`：Set the video subscription blocklist.
    * `SetSubscribeVideoAllowlist`：Set the video subscription allowlist.

    If a user is added in a blocklist and a allowlist at the same time, only the blocklist takes effect.

    **9. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `SetAudioScenario` method. For example, if you want to change the audio scenario from `AudioScenarioDefault` to `AudioScenarioGameStreaming` when you are in a channel, you can call this method.

    **10. Replace video feeds with images**

    This release supports replacing video feeds with images when publishing video streams. You can call the `enableVideoImageSource` method to enable this function and choose your own images through the `options` parameter. If you disable this function, the remote users see the video feeds that you publish.

    **11. Local video mixing**

    This release adds a series of APIs supporting local video mixing functions. You can mix multiple video streams into one video stream locally. Common use-cases are as follows:

    * In interactive live streaming use-cases with cohosts or when using the Media Push function, you can merge the screens of multiple hosts into one view locally.
    * In use-cases where you capture multiple local video streams (for example, video captured by cameras, screen sharing streams, video files or pictures), you can and merge them into one video stream and then publish the mixed video stream in the channel.

    You can call the `startLocalVideoTranscoder` method to start local video mixing and call the `stopLocalVideoTranscoder` method to stop local video mixing. After the local video mixing starts, you can call `updateLocalTranscoderConfiguration` to update the local video mixing configuration.

    **12. Video device management**

    Video capture devices can support multiple video formats, each supporting a different combination of video frame width, video frame height, and frame rate.

    This release adds the `numberOfCapabilities` and `getCapability` methods for getting the number of video formats supported by the video capture device and the details of the video frames in the specified video format. When calling the `startPrimaryCameraCapture` or `startSecondaryCameraCapture` method to capture video using the camera, you can use the specified video format.

    > ***NOTE:*** The SDK automatically selects the best video format for the video capture device based on your settings in `VideoEncoderConfiguration`, so normally you should not need to use these new methods.

    #### Improvements [#improvements-107]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v4.0.0 through the `LeaveChannel` and `JoinChannel `methods so that you don't need to take the time to call the `SwitchChannel `method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `pushVideoFrame`\[1/2] method to push such video frames to the SDK.

    **3. Voice pitch of the local user**
    This release adds `voicePitch` in `AudioVolumeInfo` of `onAudioVolumeIndication`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **4. Video preview**

    This release improves the implementation logic of `startPreview`. You can call the `startPreview `method to enable video preview at any time.

    **5. Video types of subscription**

    You can call the `setRemoteDefaultVideoStreamType` method to choose the video stream type when subscribing to streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="flutter">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="flutter" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-6]

    ### Known issues [#known-issues-6]

    ### v6.6.2 [#v662]

    Released on March 18, 2026. Corresponds to Native SDK v4.6.2

    #### Compatibility changes [#compatibility-changes-59]

    This release introduces the following compatibility changes:

    * **Deprecation of Direct CDN streaming APIs**

      The following APIs related to Direct CDN streaming are deprecated in this release and will be removed in a future version. Use [server-side transcoding and media push](/en/realtime-media/media-push/get-started/enable-media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration`
      * `setDirectCdnStreamingVideoConfiguration`
      * `startDirectCdnStreaming`
      * `stopDirectCdnStreaming`
      * `DirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingStats`
      * `DirectCdnStreamingState`
      * `DirectCdnStreamingReason`

    * **Deprecation of virtual metronome APIs**

      The following APIs related to the virtual metronome feature are deprecated in this release and will be removed in a future version.

      * `startRhythmPlayer`
      * `configRhythmPlayer`
      * `onRhythmPlayerStateChanged`

    * **Deprecation of watermark APIs**

      The following watermark APIs are deprecated in this release. Use the new watermark APIs introduced in this release instead.

      * `addVideoWatermark`
      * `addVideoWatermarkEx`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `enableWirelessAccelerate`

    * **Changes to makeup feature implementation**

      Due to the beauty effect refactoring in this release, calling `setExtensionProperty` to enable the makeup feature is no longer supported starting from v4.6.2. Use the `STYLE_MAKEUP` node instead.

    * **Behavior changes in dual-stream mode**

      Before v4.6.2, when the sender enabled adaptive low-stream mode (`autoSimulcastStream`), the low stream was not sent proactively. The sender only started sending the low stream after receiving a request from a host-role receiver calling `setRemoteVideoStreamType`. Starting from v4.6.2, when the sender enables adaptive low-stream mode, the SDK automatically decides whether to send or stop sending the low stream based on the downlink network quality of subscribing users. If you set `mode` to another sending mode or explicitly configure the width, height, bitrate, or frame rate of the low stream, this adaptive behavior is disabled.

    * **New domains required for domain whitelist**

      If you upgrade from a previous version and use the domain whitelist feature (`domainLimit` in `RtcEngineConfig` set to `true`), add the following domains to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    * **Removal of `uid` from `EncodedVideoFrameInfo` struct**

      The `uid` parameter is removed from the `EncodedVideoFrameInfo` struct. You can retrieve `uid` information directly from the `onEncodedVideoFrameReceived` callback. Update your integration logic accordingly.

    #### New features [#new-features-96]

    Included in this release:

    * **Multi-resolution video streams**

      This release introduces the Adaptive Bitrate Video Streaming (ABR) feature, which supports sending multiple video streams at different resolutions from the same video source simultaneously, including in multi-channel scenarios. Receivers can automatically or manually subscribe to streams at their preferred resolution.

      After enabling ABR, you can configure up to four video stream layers (one main stream at the highest resolution and up to three lower-resolution streams), and set options such as resolution, bitrate, and layered streaming fallback. When layered streaming fallback is enabled, the SDK automatically switches to lower-resolution streams under poor network conditions to maintain a smooth viewing experience. This feature is suited for meetings, large classes, interactive live streaming, and other multi-device or multi-network environments.

    * **Multi-path network transmission**

      This release introduces multi-path transmission for devices that support multiple network interfaces (such as 5G, Wi-Fi, and LAN). This feature reduces or eliminates experience degradation caused by poor network conditions, making it suitable for real-time audio and video communication in challenging environments such as vehicles, IoT devices, trains, and highways.

      Enable multi-path transmission by setting `enableMultipath` to `true` in `ChannelMediaOptions`. Two transmission modes are supported through `MultipathMode`:

      * **Dynamic mode** (default): Dynamically selects the best available path based on network conditions. Suited for traffic-sensitive scenarios with high experience requirements, such as meetings and online education. In this mode, you can specify the preferred network path (for example, Wi-Fi or mobile network) using `preferMultipathType`.
      * **Full redundancy mode**: Transmits data simultaneously on all available network paths. Suited for scenarios that are not traffic-sensitive but require extreme reliability, such as outdoor broadcasting and parallel control. This mode incurs additional costs. [Contact technical support](mailto\:support@agora.io) to enable it.

      Uplink and downlink paths can also be configured separately using `uplinkMultipathMode` and `downlinkMultipathMode` in `ChannelMediaOptions`. Once enabled, the SDK reports real-time transmission statistics for each path through the `onMultipathStats` callback, including per-path traffic consumption.

    * **Video quality scoring**

      This release adds the `mosValue` field to `RemoteVideoStats`, reporting the quality score of the received remote video stream as evaluated by the Agora real-time video MOS (Mean Opinion Score) system. Scores range from 1 to 5, where 5 indicates excellent video quality and 1 indicates extremely poor quality. Use this field to monitor subjective video quality in real time, adjust video parameters dynamically, or integrate into quality monitoring and alerting workflows. [Contact technical support](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

      This release deprecates `addVideoWatermark` and `addVideoWatermarkEx`, and introduces `addVideoWatermarkWithConfig` and `addVideoWatermarkWithConfigEx`, which support adding multiple watermarks to a video using watermark IDs and controlling their display order. To remove a specific watermark, call `removeVideoWatermark`.

    * **Token renewal result callback**

      This release introduces the `onRenewTokenResult` callback and the `RenewTokenErrorCode` error code enum. After calling `renewToken` to update the token, the SDK reports the result through `onRenewTokenResult` and returns detailed error codes defined in `RenewTokenErrorCode`, allowing you to handle token renewal failure scenarios accordingly.

    * **App-level screen sharing support on Android**

      Starting from Android 14, the system allows users to choose between sharing the full screen or a single app during screen sharing, enhancing privacy and multitasking. This release adds support for sharing a single app in addition to full-screen sharing. The new `onLocalVideoEvent` callback reports local video events, especially those related to screen sharing.

    * **New permission granted callback on Android**

      The `onPermissionGranted` callback helps confirm permission status in screen sharing scenarios. You can use this callback to determine whether the user granted Camera or Screen permission.

    * **Picture-in-Picture**

      This release introduces the Picture-in-Picture (PiP) feature, which supports displaying video call windows in PiP mode so users can continue watching video calls when switching apps or returning to the home screen.

      This feature supports automatically entering PiP mode and provides rich configuration options. On Android, you can configure parameters such as the aspect ratio, initial position, and seamless resizing of the PiP window. On iOS, you can configure the video stream layout (flow layout, with video streams arranged left to right and top to bottom), PiP window size, and system control button styles. The feature also supports listening to PiP state changes through `AgoraPipStateChangedObserver` to handle scenarios such as entering, exiting, or failure. This feature is suited for video calls, online education, live streaming, and other scenarios that require multitasking.

    * **Media Player support for getting audio buffer delay**

      To address synchronization issues between the main vocal and background accompaniment in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module. This method returns the millisecond-level audio buffer delay when playing media files.

    * **Advanced Beauty (Beta)**

      This release introduces a new advanced beauty feature with the following capabilities:

      * **Precision beauty effects**:
        * **Face shaping**: Supports independent fine-tuning of 29 facial areas (for example, face slimming, eye enlarging, and nose narrowing) or one-click natural results using presets.
        * **Style makeup options**: Eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
        * **Skin enhancements**: Teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.
      * **Unified API**: Manages all beauty, makeup, and filter functions through three core nodes (`BEAUTY`, `STYLE_MAKEUP`, and `FILTER`) using `VideoEffectObject` for unified parameter configuration and lifecycle control.
      * **Ready-to-use presets**: Provides multiple style templates (for example, "Natural Beauty," "Senior Makeup," and "Cool White Filter") for immediate use.
      * **Dynamic parameter control**: Supports real-time reading and modifying of granular parameters (for example, smoothing strength and lipstick type) through key-value pairs, with support for saving custom configurations and resetting defaults.
      * **Local resource support**: All beauty resources, including effects, filters, and makeup assets, are packaged as local bundle files to ensure stability and reliability.

    * **Other new features**

      * Adds the `setPlaybackAudioFrameBeforeMixingParameters` method to set the audio frame format returned in the `onPlaybackAudioFrameBeforeMixing` callback, including sample rate, number of channels, and number of data samples per callback. After calling this method, the SDK returns the original pre-mix audio data according to the specified parameters.
      * Adds the `preloadEffectEx` method to preload sound effect files into specified channels, supporting both local and online files for use in multi-channel scenarios.
      * Adds the `playEffectEx` method to play sound effect files in specified channels with configurable parameters, including loop count, pitch, spatial position, volume, whether to publish to the channel, and playback start position.
      * The local screenshot upload feature now supports setting the video observation position for screenshots through the new `position` field in `ContentInspectModule`, enabling screenshots of original video data or video streams before or after effect processing.
      * Adds the `screenColorType` property to `SegmentationProperty` to improve portrait segmentation accuracy when using a green or blue screen for virtual backgrounds. You can specify the background color as green, blue, or set it to automatic recognition.

    #### Improvements [#improvements-108]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Window exclusion support for secondary displays**

      Before v4.6.2, configuring window exclusion (`excludeWindowList` in `ScreenCaptureParameters`) was not supported in multi-screen scenarios when sharing by screen ID (`startScreenCaptureByDisplayId`). This release adds support for this configuration.

      This release also adds `localVideoStreamReasonScreenCaptureExcludeWindowFailed` to `LocalVideoStreamReason` to report cases where window exclusion fails during screen sharing.

    * **Improved trigger timing of `onVideoDeviceStateChanged`**

      Before v4.6.2, the `onVideoDeviceStateChanged` callback could only be triggered after joining a channel. Starting from this release, you can receive this callback once after `IRtcEngine` initialization completes, and continue to receive it after joining a channel.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `onNetworkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Optimizes permission requests on Windows 11 24H2 and later to avoid unnecessary location data acquisition.
      * Adds support for G.711 and G.722 audio codecs when interoperating with Web clients, improving cross-platform audio compatibility and clarity.
      * Improves video clarity in screen sharing scenarios involving documents.
      * Adds error codes `errPcmSendFormat (200)` and `errPcmSendBufferOverflow (201)` to report PCM data transmission errors.

    #### Issues fixed [#issues-fixed-112]

    This release fixes the following issues:

    * After calling `open` to open an online sound effect file and `playEffect` to start playback, calling `seek` to set the playback position caused the file to play from the beginning instead of the specified position.
    * In media volume mode, when a broadcaster published microphone audio while simultaneously playing sound effects with `playEffect` and a music file with `startAudioMixing`, echo occasionally occurred.
    * After calling `joinChannelEx` to join a channel and `startOrUpdateChannelMediaRelay` to start cross-channel media relay, rejoining the channel after going offline and leaving occasionally caused `onChannelMediaRelayStateChanged` to report `state` as `relayStateFailure` with `code` as `relayErrorServerErrorResponse`.
    * On some laptop models with power-saving mode enabled, receivers occasionally heard echo when the sender shared screen and audio.
    * In online education scenarios, teachers occasionally observed audio and video out of sync for multiple students in the local view.
    * The second call to `enumerateVideoDevices` to retrieve the device list did not take effect.
    * On Windows 7 devices, when sharing a PowerPoint window running in full-screen auto-play mode with a large number of animations, the remote view occasionally flickered.

    ### v6.5.2 [#v652]

    Released on May 6, 2025.

    #### New features [#new-features-97]

    * **16 KB memory page size**

      Starting from Android 15, the system [supports 16 KB memory page sizes](https://developer.android.com/guide/practices/page-sizes). To maintain app stability and performance, the SDK now includes compatibility for both 4 KB and 16 KB memory page sizes. This enhancement ensures reliable operation across a wider range of devices and helps prevent crashes on devices using the newer memory configuration.

    #### Issues fixed [#issues-fixed-113]

    This release includes the following fixes:

    * When playing a multi-track media file, noise could be heard after calling the `setAudioPitch` method to adjust the audio pitch.
    * If the host called `createCustomAudioTrack` with `trackType` set to `AUDIO_TRACK_DIRECT`, pushed custom audio frames using `pushAudioFrame`, and then called `playEffect`, audience members heard noise.
    * Apps occasionally experienced UI lag due to main thread blocking during audio and video interactions.
    * On Windows, local screen share preview flickered after calling `startScreenCapture` with `enableHighLight` set to `true` in `ScreenCaptureParameters`, then placing the shared window on the top layer and maximizing it.
    * On Windows, some windows failed to be excluded from screen capture when calling `startScreenCaptureByDisplayId` with `excludeWindowList` set in `ScreenCaptureParameters`.
    * On Windows, the app occasionally crashed after disconnecting an external screen used for screen sharing.
    * Calling `openWithMediaSource` with `isLiveSource` set to `true` failed to play the video stream.
    * When the sender transmitted multi-channel encoded audio, the receiver occasionally experienced noise.
    * When opening two different media resources consecutively using a media player, the second call incorrectly triggered the `onPlayerInfoUpdated` callback for the first resource.
    * After enabling volume indication using `enableAudioVolumeIndication`, the `onAudioVolumeIndication` callback returned a local user volume of `0` for both local and remote users.
    * On 21:9 ultrawide screens with high resolution (such as 3840×2160), screen sharing was cropped in both local preview and on the receiver’s display. (Windows)
    * When using `enableVideoImageSource`, the sender occasionally streamed successfully, but `onVideoPublishStateChanged` didn’t return the expected state.
    * In multi-channel scenarios, calling `setupRemoteVideoEx` before successfully calling `joinChannelEx` occasionally caused a delay in displaying the first remote video frame.
    * Playing an MP4 file with EAC3 audio encoding using `startAudioMixing` sometimes resulted in no sound. (Android)
    * Memory leaks occurred after leaving the channel and stopping video rendering. (Android)
    * After manually setting the focus position with `setCameraFocusPositionInPreview`, the focus was inaccurate when the camera captured a zoomed-in image. (Android)
    * When using `setExternalMediaProjection` to provide an external `MediaProjection` instance for screen capture, the resolution didn't adjust dynamically when switching between landscape and portrait mode. (Android)
    * During audio and video calls, the app occasionally froze. (Android, iOS)
    * Calling `setExtensionProperty` with the key set to `"makeup_options"` failed to apply makeup effects. (Android)
    * After failing to join a channel, attempting to rejoin without first calling `leaveChannel` occasionally caused a crash. (Android)
    * When opening a nonexistent local media file, the `onPlayerSourceStateChanged` callback did not report `PLAYER_STATE_FAILED` as expected. (Android)
    * Enabling virtual background with `enableVirtualBackground` caused the image to become larger and blurry when the phone was rotated. (iOS)

    ### v6.5.1 [#v651]

    Released on March 13, 2025.

    #### New features [#new-features-98]

    1. **AI conversation scenario**

       This version adds the `audioScenarioAiClient` audio scenario specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on AI-generated voice characteristics, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. It enhances conversation continuity and reliability while adapting to complex network conditions.

    #### Improvements [#improvements-109]

    * Reduces the SDK initialization time on specific device models. (iOS)

    #### Issues fixed [#issues-fixed-114]

    This release fixes the following issues:

    * Apps that integrated the Agora SDK and set the `targetSdkVersion` to 34 encountered crashes when attempting to enable screen sharing for the first time on an Android 14 system. (Android)
    * When joining two or more channels simultaneously, and calling the `takeSnapshotEx` method to take screenshots of the local video streams in each channel consecutively, the screenshot of the first channel failed.
    * When using the `pause` method to pause playback, then calling `seek` to move to a specified position, and finally calling `play` to continue playback, the Media Player resumed from the position where it was paused, not the new specified position.
    * When using the Media Player, the file path of the media resource returned by the `getPlaySrc` did not change after calling the `switchSrc` method to switch to a new media resource.
    * When using Bluetooth headphones on specific device models for audio and video interactions, adjusting the phone volume would occasionally change the media volume instead of the Bluetooth volume. (Android)
    * During audio and video interactions, the local user occasionally experienced a black screen when watching the video streams of remote users. (Android)
    * On specific device models, after calling `setCameraExposureFactor` to set the exposure coefficient of the current camera at a specific angle of the device, the video screen occasionally became dark when the device was moved to another angle. (Android)
    * When playing a CDN live stream, the video occasionally froze for an extended period after recovering from an interruption. (Android)
    * When pushing video frames in i420 format to the channel, using CVPixelBuffer to handle these frames caused a crash. (iOS)
    * Calling `setupLocalVideo` to set up two views, then calling `enableFaceDetection` to start face detection, no face information can be detected in the subsequently passed views. (iOS)
    * In a screen sharing scenario, the receiving-end user saw a green line on the shared image. (iOS)
    * In the interactive live streaming scenario, after joining a channel to watch live streams using `string` user id, the audience members occasionally saw that the audio was not synchronized with the video.
    * Plugins sometimes did not work when using AI noise suppression and AI echo cancellation plugins at the same time.

    ### v6.5.0 [#v650]

    Released on December 10, 2024.

    #### Compatibility changes [#compatibility-changes-60]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Changes in strong video noise suppression implementation**

       This version adjusts the implementation of strong video noise suppression. `videoDenoiserLevelStrength` is removed from `VideoDenoiserLevel`. Instead, after enabling video noise suppression by calling `setVideoDenoiserOptions`, you can call the `setBeautyEffectOptions` method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, enable video noise suppression first and use specific settings as detailed in `setLowlightEnhanceOptions`.

    2. **Changes in camera plug and unplug status (macOS, Windows)**

       In previous versions, when the camera was unplugged and replugged, the `onVideoDeviceStateChanged` callback would report the device status as `mediaDeviceStateActive` (1) (device in use). Starting from this version, after the camera is replugged, the device status will change to `mediaDeviceStateIdle`(0) (device ready).

    3. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`CompressionPreference`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_compressionpreference.html) enumeration class, a new `preferCompressionAuto` (-1) enumeration is added, replacing the original `preferQuality` (1) as the default value. In this mode, the SDK will automatically choose between `preferLowLatency` and `preferQuality` based on your video scene settings to achieve the best user experience.
       * In the [`DegradationPreference`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_degradationpreference.html) enumeration class, a new `maintainAuto` (-1) enumeration is added, replacing the original `maintainQuality` (1) as the default value. In this mode, the SDK will automatically choose between `maintainFramerate`, `maintainBalanced`, and `maintainResolution` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    4. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see the table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback    | Current callback                |
       | -------------------- | ------------------------------- |
       | `onExtensionEvent`   | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    #### New features [#new-features-99]

    1. **Live show scenario**

       This version adds the `applicationScenarioLiveshow`(3) (Live Show) enumeration to [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_videoapplicationscenariotype.html). You can call `setVideoScenario` to set the video business scenario to show room. To meet the high requirements for first frame rendering time and image quality in this scenario, the SDK has optimized strategies to significantly improve the first frame rendering experience and image quality, while enhancing the image quality in weak network environments and on low-end devices.

    2. **Maximum frame rate for video rendering**

       This version adds the `setLocalRenderTargetFps` and `setRemoteRenderTargetFps` methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (e.g., screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the `setFilterEffectOptions` method. You can pass a cube map file (.cube) in the `config` parameter to achieve custom filter effects such as whitening, vivid, cool, black and white, etc. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file for quickly achieving a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the `startLocalAudioMixer` method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **External MediaProjection (Android)**

       This version introduces the [`setExternalMediaProjection`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setexternalmediaprojection) method, which allows you to set an external `MediaProjection` and replace the `MediaProjection` applied by the SDK.

       If you have the capability to apply for `MediaProjection` on your own, you can use this feature to achieve more flexible screen capture.

    6. **EGL context (Android)**

       This version introduces the `setExternalRemoteEglContext` method, which is used to set the EGL context for rendering remote video streams. When using Texture format video data for remote video self-rendering, you can use this method to replace the SDK's default remote EGL context, achieving unified EGL context management.

    7. **Color space settings**

       This version adds the **colorSpace** parameter to `VideoFrame` and `ExternalVideoFrame`. You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    8. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method and passing in the sound effect types supported in the `VoiceAiTunerType` enum to achieve effects like deep voice, cute voice, husky singing voice, etc.

    9. **1v1 video call scenario**

       This version adds `applicationScenario1v1` (1v1 video call) in [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_videoapplicationscenariotype.html). You can call `setVideoScenario` to set the video application scenario to 1v1 video call, the SDK optimizes performance to achieve low latency and high video quality, enhancing image quality, first frame rendering, latency on mid-to-low-end devices, and smoothness under poor network conditions.

    10. **Other features**

        * [`onLocalVideoStateChanged`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback adds the `localVideoStreamReasonDeviceDisconnected` enumeration, indicating that the currently used video capture device has been disconnected (for example, unplugged). (Windows)
        * [`MediaDeviceStateType`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_mediadevicestatetype.html) adds the `mediaDeviceStatePluggedIn` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-110]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`takeSnapshotWithConfig`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotWithConfigEx`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Adaptive hardware decoding support (Android, Windows)**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and effectively reducing system load.

    5. **Rendering performance enhancement (Windows)**

       DirectX 11 renderer is now enabled by default on Windows devices, providing high-performance and high-quality graphics rendering capabilities.

    6. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    7. **Other improvements**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency. (Android, iOS)
       * Optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * Supports using virtual cameras in YV12 format as video capture devices. (Windows)
       * When calling `switchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `onPlayerEvent` callback will report the `playerEventSwitchError` event, indicating an error occurred during media resource switching.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.
       * Optimizes transmission strategy: calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * The `localVideoStreamReasonScreenCaptureDisplayDisconnected` enumerator is added in `onLocalVideoStateChanged` callback, indicating that the display used for screen capture has been disconnected. (Windows, macOS)
       * Optimizes the video link for window sharing, reducing CPU usage. (macOS)
       * Improves echo cancellation for screen sharing use-cases. (Windows)
       * Adds the `channelId` parameter to `Metadata`, which is used to get the channel name from which the metadata is sent.
       * Deprecates redundant enumeration values `clientRoleChangeFailedRequestTimeOut` and `clientRoleChangeFailedConnectionFailed` in `ClientRoleChangeFailedReason`.

    #### Issues fixed [#issues-fixed-115]

    This version fixes the following issues:

    * When calling `startScreenCaptureByWindowId` to share the screen, the window capture area specified by **regionRect** was inaccurate, resulting in incorrect width and height of the screen sharing window seen by the receiving end. (Windows)
    * When the video source type of the sender is in JPEG format, the frame rate on the receiving end occasionally falls below expectations. (Android, iOS)
    * During audio and video interaction, after being interrupted by a system call, the user volume reported by the `onAudioVolumeIndication` callback was incorrect. (Android)
    * When the receiving end subscribes to the low-quality video stream by default and does not automatically subscribe to any video stream when joining the channel, calling `muteRemoteVideoStream(uid, false)` after joining the channel to resume receiving the video stream results in receiving the high-quality video stream, which is not as expected. (Android)
    * Occasional errors of not finding system files during audio and video interaction on Windows 7 systems. (Windows)
    * When calling `followSystemRecordingDevice` or `followSystemPlaybackDevice` to set the audio capture or playback device used by the SDK to not follow the system default audio playback device, the local audio state callback `onLocalAudioStateChanged` is not triggered when the audio device is removed, which is not as expected. (Windows)
    * Occasional instances where the receiving end cannot hear the sender during audio and video interaction. (iOS)
    * During audio and video interaction, if the sender's device system version is iOS 17, the receiving end occasionally cannot hear the sender. (iOS)
    * In live streaming use-cases, the time taken to reconnect to the live room after the audience end disconnects due to network switching is longer than expected. (iOS)
    * No sound when playing online media resources using the media player after the app starts. (iOS)
    * Occasional instances of no sound in audio capture after resuming from being interrupted by other system apps during audio and video interaction. (iOS)
    * Calling `startAudioMixing`and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.
    * Occasional crashes during audio and video interaction. (Android)
    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time interaction. (iOS)
    * Remote video occasionally froze or displayed corrupted images when the app returned to the foreground after being in the background for a while. (iOS)
    * After the sender called `startDirectCdnStreaming` to start direct CDN streaming, frequent switching or toggling of the network occasionally resulted in a black screen on the receiver's end without a streaming failure callback on the sender's end. (iOS)
    * Audio playback failed when pushing external audio data using `pushAudioFrame` and the sample rate was not set as a recommended value, such as 22050 Hz and 11025 Hz. (Android, iOS)

    ### v6.4.0 [#v640]

    v6.4.0 was released on August 29, 2024.

    #### Compatibility changes [#compatibility-changes-61]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion.
    To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see the table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onExtensionEvent`   | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    #### New features [#new-features-100]

    1. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a
       physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method and passing
       in the sound effect types supported in the `VoiceAiTunerType` enum to achieve effects like deep voice, cute voice,
       husky singing voice, and so on.

    2. **1v1 video call scenario**

       This version adds `applicationScenario1v1` (1v1 video call) in `VideoApplicationScenarioType`. You can call
       `setVideoScenario` to set the video application scenario to 1v1 video call. The SDK optimizes performance to achieve
       low latency and high video quality, enhancing image quality, first frame rendering, latency on mid-to-low-end devices, and smoothness under poor network conditions.

    #### Improvements [#improvements-111]

    1. **Adaptive hardware decoding support (Android, Windows)**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and effectively reducing system load.

    2. **Rendering performance enhancement (Windows)**

       DirectX 11 renderer is now enabled by default on Windows devices, providing high-performance and high-quality graphics rendering capabilities.

    3. **Facial region beautification**

       To prevent losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing
       algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    4. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the
         transmission link.
       * The `localVideoStreamReasonScreenCaptureDisplayDisconnected` enumerator is added in the `onLocalVideoStateChanged`
         callback, indicating that the display used for screen capture has been disconnected (Windows, macOS).
       * Optimizes the video link for window sharing, reducing CPU usage (macOS).
       * Improves echo cancellation for screen sharing use-cases (Windows).
       * Adds the `channelId` parameter to `Metadata`, which is used to get the channel name from which the metadata is sent.
       * Deprecates redundant enumeration values `clientRoleChangeFailedRequestTimeOut` and `clientRoleChangeFailedConnectionFailed` in `ClientRoleChangeFailedReason`.

    #### Issues fixed [#issues-fixed-116]

    This release fixed the following issues:

    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time
      interaction (iOS).
    * Remote video occasionally froze or displayed corrupted images when the app returned to the foreground after being in
      the background for a while (iOS).
    * After the sender called `startDirectCdnStreaming` to start direct CDN streaming, frequent switching or toggling of the
      network occasionally resulted in a black screen on the receiver's end without a streaming failure callback on the sender's end (iOS).
    * Audio playback failed when pushing external audio data using `pushAudioFrame` and the sample rate was not set as a
      recommended value, such as 22050 Hz and 11025 Hz (Android, iOS).

    ### v6.3.2 [#v632]

    v6.3.2 was released on June 6, 2024.

    #### Improvements [#improvements-112]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    #### Issues fixed [#issues-fixed-117]

    This version fixed the following issues:

    * The remote video froze or became pixelated when the app returned to the foreground after being in the background for a long time (iOS).
    * The local preview image rotated by 90° on some iPad devices, which did not meet expectations (iOS).
    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app crashed when opening the app and starting screen sharing after the first installation or system reboot (Android).
    * Local audio capture failed after joining a channel while answering a system phone call and hanging up, preventing remote users from hearing any sound (Android).
    * During the interaction process on certain devices (for example, Redmi Note8), after answering and hanging up a system call, local media files were played without sound and no sound was heard from the remote end (Android).
    * The app occasionally crashed when remote users left the channel.
    * The screen occasionally flickered on the receiver's side when sharing a PPT window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and playing PPT animations (Windows).
    * The window border did not retain its original size after exiting the presentation and then maximizing the PPT window when sharing a WPS PPT window on Windows 7 using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_screencaptureparameters.html) to `true` (Windows).
    * The specified window could not be brought to the foreground if it was covered by other windows when sharing a window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `windowFocus` and `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_screencaptureparameters.html) to `true` (Windows).
    * Clicking on the desktop widget caused the outlined part to flicker when sharing and highlighting a window on a Windows 7 device (Windows).
    * When playing an audio file finished, the SDK sometimes failed to trigger the [onAudioMixingStateChanged](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onaudiomixingstatechanged) (`audioMixingStateStopped`, `audioMixingReasonAllLoopsCompleted`) callback that reports that the playing is completed (iOS).
    * When calling the [playEffect](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_playeffect3) method to play sound effect files shorter than 1 second with `loopCount` set to `0`, there was no sound (iOS).
    * When using the Agora media player to play a video and stopping it during playing, sometimes there was no sound for a short time after the playback was resumed (iOS).

    ### v6.3.1 [#v631]

    v6.3.1 was released on May 9, 2024.

    #### New features [#new-features-101]

    1. **Privacy manifest file (iOS)**

       To meet Apple's safety compliance requirements for app publication, the SDK now includes a privacy manifest file, `PrivacyInfo.xcprivacy`, detailing the SDK's API calls that access or use user data, along with a description of the types of data collected.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    If you need to publish an app with SDK versions prior to v4.3.1 to the Apple App Store, manually add the `PrivacyInfo.xcprivacy` file to your Xcode project.
    \:::

    1. **Portrait center stage (iOS, macOS)**

       To enhance the presentation effect in online meetings, shows, and online education use-cases, this version introduces the [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) method to activate portrait center stage. This ensures that presenters, regardless of movement, always remain centered in the video frame, achieving better presentation effects.

       Before enabling portrait center stage, it is recommended to verify whether your current device supports this feature by calling [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported). A list of supported devices can be found in the [API documentation](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage).

    2. **Camera stabilization (iOS)**

       To improve video stability in mobile filming, low-light environments, and hand-held shooting use-cases, this version introduces a camera stabilization feature. You can activate this feature and select an appropriate stabilization mode by calling [setCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode), achieving more stable and clearer video footage.

    3. **Wide and ultra-wide cameras (Android, iOS)**

       To allow users to capture a broader field of view and more complete scene content, this release introduces support for wide and ultra-wide cameras. You can first call [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) to check the device's focal length capabilities, and then call [setCameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setcameracapturerconfiguration) and set `cameraFocalLengthType` to the supported focal length types, including wide and ultra-wide.

    4. **Multi-camera capture (Android)**

       This release introduces additional functionalities for Android camera capture:

       1. Support for capturing and publishing video streams from the third and fourth cameras:

          * `videoSourceCameraThird` (11) and `videoSourceCameraFourth` (12) in [VideoSourceType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_videosourcetype.html) add support for Android, specifically for the third and fourth camera sources. This change allows you to specify up to four camera streams when initiating camera capture by calling [startCameraCapture](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/api_irtcengine_startcameracapture.html).
          * `publishThirdCameraTrack` and `publishFourthCameraTrack` in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_channelmediaoptions.html) add support for Android. Set these parameters to `true` when joining a channel with [joinChannel](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_joinchannel2) to publish video streams captured from the third and fourth cameras.

       2. Support for specifying cameras by camera ID:

          A new parameter `cameraId` is added to [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_cameracapturerconfiguration.html). For devices with multiple cameras, where `cameraDirection` cannot identify or access all available cameras, you can obtain the camera ID through Android's native system APIs and specify the desired camera by calling [startCameraCapture](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/api_irtcengine_startcameracapture.html) with the specific `cameraId`.

    5. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_encryptionconfig.html) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enableencryption). If there are issues causing failures in data stream encryption or decryption, these can be identified by the newly added `encryptionErrorDatastreamDecryptionFailure` and `encryptionErrorDatastreamEncryptionFailure` enumerations.

    6. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate the dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setdualstreammode2), the SDK defaults to the following behaviors:

       * The default encoding resolution for the low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the low-quality streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    7. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    8. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-113]

    1. **Optimization for game scenario screen sharing (Windows)**

       This version specifically optimizes screen sharing for game use-cases, enhancing performance, stability, and clarity in ultra-high definition (4K, 60 fps) game use-cases, resulting in a clearer, smoother, and more stable gaming experience for players.

    2. **Audio device type detection (macOS)**

       This version adds the `deviceTypeName` in [AudioDeviceInfo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_audiodeviceinfo.html), used to identify the type of audio devices, such as built-in, USB, HDMI, and so on.

    3. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure, especially around the fingers, are more stable, significantly reducing flickering at the edges.

    4. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `earMonitoringFilterReusePostProcessingFilter` in `EarMonitoringFilterType`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    5. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen-sharing use-cases to save system performance overhead (iOS, macOS, Windows).
       * Enhanced performance and stability of the local compositing feature, reducing its CPU usage (Android).
       * Improved stability in processing video by the raw video frame observer (iOS).
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * In [AudioEffectPreset](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_audioeffectpreset.html), a new enumeration `roomAcousticsChorus` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_remoteaudiostats.html), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending side to when the audio is played on the receiving side.

    #### Issues fixed [#issues-fixed-118]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * In screen sharing use-cases, when the app enabled sound card capture with [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording) to capture audio from the shared screen, the transmission of the sound card captured audio failed after a local user manually disabled the local audio capture device, preventing remote users from hearing the shared screen's audio (Windows).
    * Hosts using certain models of devices in the speaker mode experienced occasional local audio capture failure when switching the app process to the background and then back to the foreground, preventing remote users from hearing the host's audio (Android).
    * On devices with Android 8.0, enabling screen sharing occasionally caused the app to crash (Android).
    * When sharing an Excel document window, remote users occasionally saw a green screen (Windows).
    * In use-cases using camera capture for local video, when the app was moved to the background and [disableVideo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_disablevideo) or `stopPreview` was called to stop video capture, camera capture was unexpectedly activated when the app was brought back to the foreground (Android).
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-64]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (iOS, macOS)
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (iOS, macOS)
    * [setCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode) (iOS)
    * [CameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_camerastabilizationmode.html) (iOS)
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [unregisterFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [FaceInfoObserver](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MediaSourceType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_mediasourcetype.html) adds `speechDrivenVideoSource`
    * [VideoSourceType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_videosourcetype.html) adds `videoSourceSpeechDriven`
    * [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [EncryptionErrorType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `encryptionErrorDatastreamDecryptionFailure`
      * `encryptionErrorDatastreamEncryptionFailure`
    * [AudioDeviceInfo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_audiodeviceinfo.html) adds `deviceTypeName` (macOS)
    * [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ErrorCodeType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_errorcodetype.html) adds `errDatastreamDecryptionFailed`
    * [AudioEffectPreset](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_audioeffectpreset.html) adds `roomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) (Android, iOS)
    * [FocalLengthInfo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_focallengthinfo.html) (Android, iOS)
    * [CameraFocalLengthType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_camerafocallengthtype.html) (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType` (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId` (Android)
    * [EarMonitoringFilterType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_earmonitoringfiltertype.html) adds a new enumeration `earMonitoringFilterBuiltInAudioFilters`

    ### v6.3.0 [#v630]

    v6.3.0 was released on February 28, 2024.

    #### Compatibility changes [#compatibility-changes-62]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, you need to update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Please modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `onLocalAudioStateChanged`         | `error`                 | `reason`           |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `onRtmpStreamingStateChanged`      | `errCode`               | `reason`           |

       | Original enumeration class   | New enumeration class      |
       | ---------------------------- | -------------------------- |
       | `LocalAudioStreamError`      | `localAudioStreamReason`   |
       | `LocalVideoStreamError`      | `LocalVideoStreamReason`   |
       | `DirectCdnStreamingError`    | `DirectCdnStreamingReason` |
       | `MediaPlayerError`           | `MediaPlayerReason`        |
       | `RtmpStreamPublishErrorType` | `RtmpStreamPublishReason`  |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                              | Alternative methods and callbacks  |
       | ---------------------------------------------------------- | ---------------------------------- |
       | * `startChannelMediaRelay`
       * `updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | - `startChannelMediaRelayEx`
       - `updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `onChannelMediaRelayEvent`                                 | `onChannelMediaRelayStateChanged`  |

    3. **Audio route**

       Starting with this release, `routeBluetooth` in [AudioRoute](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_audioroute.html) is renamed to `routeHeadsetbluetooth`, representing a Bluetooth device using the HFP protocol. `routeBluetoothSpeaker`(10) is added to represent a Bluetooth device using the A2DP protocol.

    4. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [LocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_localvideostreamreason.html) class:

       * The value of `localVideoStreamReasonScreenCapturePaused` (formerly `localVideoStreamReasonScreenCapturePaused`) has been changed from 23 to 28.
       * The value of `localVideoStreamReasonScreenCaptureResumed` (formerly `localVideoStreamReasonScreenCaptureResumed`) has been changed from 24 to 29.
       * The `localVideoStreamErrorEncodeFailure` enumeration has been changed to `localVideoStreamReasonCodecNotSupport`.

    5. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    6. **Audio loopback capturing (Windows, macOS)**

       * Before v6.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will not be disabled.
       * As of v6.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will be disabled as well. If you need to enable audio loopback capturing, you need to enable the audio module by calling the [enableAudio](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

    #### New features [#new-features-102]

    1. **Custom mixed video layout on receiving end (Android, iOS)**

       To facilitate customized layout of mixed video stream at the receiver end, this release introduces the [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo) callback. When the receiver receives the channel's mixed video stream sent by the video mixing server, this callback is triggered, reporting the layout information of the mixed video stream and the layout information of each sub-video stream in the mixed stream. The receiver can set a separate `view` for rendering the sub-video stream (distinguished by `subviewUid`) in the mixed video stream when calling the [setupRemoteVideo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setupremotevideo) method, achieving a custom video layout effect.

       When the layout of the sub-video streams in the mixed video stream changes, this callback will also be triggered to report the latest layout information in real time.

       Through this feature, the receiver end can flexibly adjust the local view layout. When applied in a multi-person video use-case, the receiving end only needs to receive and decode a mixed video stream, which can effectively reduce the CPU usage and network bandwidth when decoding multiple video streams on the receiving end.

    2. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the first view: Set the `position` parameter to `positionPostCapturerOrigin` (introduced in this release) in `VideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [setupLocalVideo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the second view: Set the `position` parameter to `positionPostCapturer` in `VideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    3. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_querydevicescore) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    4. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the [openWithMediaSource](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayer.html#api_imediaplayer_openwithmediasource) method and enable this function by setting the `enableMultiAudioTrack` parameter in [MediaSource](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_mediasource.html).

    5. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption): Sets fallback option for the subscribed video stream in weak network conditions.
       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onremotesubscribefallbacktoaudioonly): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * [setPlaybackDeviceVolume](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_setplaybackdevicevolume) (Windows): Sets the volume of the audio playback device.
       * [setPlaybackDeviceVolume](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdevicevolume): Sets the volume of the audio capturing device.
       * [setPlayerOptionInInt](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionInString](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption2): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-114]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setinearmonitoringvolume).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_ibasespatialaudioengine.html#api_ibasespatialaudioengine_setzones) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling the [LocalSpatialAudioEngine](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) method.

    4. **Other Improvements**

       This release also includes the following improvements:

       * The [onLocalVideoStateChanged](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback is improved with the inclusion of the `localVideoStreamReasonScreenCaptureAutoFallback` enumeration, signaling unexpected errors during the screen sharing process (potentially due to window blocking failure), resulting in performance degradation without impacting the screen sharing process itself (Windows).
       * The [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats) callback is added to reports the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats) callback is added to reports the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_playerplaybackstats.html).
       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling `setLocalAccessPoint` to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.

    #### Issues fixed [#issues-fixed-119]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [onLocalVideoStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.
    * When sharing in a specified screen area, the mouse coordinates within the shared area are inaccurate. When the mouse is near the border of the shared area, the mouse may not be visible in the shared screen (Windows).
    * The SDK failed to detect any changes in the audio routing after plugging in and out 3.5mm earphones (Windows).

    #### API changes [#api-changes-65]

    **Added**

    * [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo) (Android, iOS)
    * [VideoLayout](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_videolayout.html) (Android, iOS)
    * The `subviewUid` member in [VideoCanvas](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_videocanvas.html)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_playerplaybackstats.html)
    * The `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_localaudiostats.html)
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * [MediaSourceType](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_mediasourcetype.html)
    * The `routeBluetoothSpeaker` enumeration in [AudioRoute](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/enum_audioroute.html)

    **Modified**

    * `routeBluetooth` is renamed as `routeHeadsetbluetooth`
    * All `Error` fields in the following enumerations are changed to `Reason`:
      * `localAudioStreamErrorOk`
      * `localAudioStreamErrorFailure`
      * `localAudioStreamErrorDeviceNoPermission`
      * `localAudioStreamErrorDeviceBusy`
      * `localAudioStreamErrorRecordFailure`
      * `localAudioStreamErrorEncodeFailure`
      * `localAudioStreamErrorRecordInvalidId` (Windows)
      * `localAudioStreamErrorPlayoutInvalidId` (Windows)
      * `localVideoStreamErrorOk`
      * `localVideoStreamErrorFailure`
      * `localVideoStreamErrorDeviceNoPermission`
      * `localVideoStreamErrorDeviceBusy`
      * `localVideoStreamErrorCaptureFailure`
      * `localVideoStreamErrorCodecNotSupport`
      * `localVideoStreamErrorCaptureInbackground` (iOS)
      * `localVideoStreamErrorCaptureMultipleForegroundApps` (iOS)
      * `localVideoStreamErrorDeviceNotFound`
      * `localVideoStreamErrorDeviceDisconnected`
      * `localVideoStreamErrorDeviceInvalidId`
      * `localVideoStreamErrorScreenCaptureWindowMinimized`
      * `localVideoStreamErrorScreenCaptureWindowClosed`
      * `localVideoStreamErrorScreenCaptureWindowOccluded`
      * `localVideoStreamErrorScreenCaptureNoPermission` (Windows)
      * `localVideoStreamErrorScreenCapturePaused` (Windows)
      * `localVideoStreamErrorScreenCaptureResumed` (Windows)
      * `localVideoStreamErrorScreenCaptureWindowHidden` (Windows)
      * `localVideoStreamErrorScreenCaptureWindowRecoverFromHidden` (Windows)
      * `localVideoStreamErrorScreenCaptureWindowRecoverFromMinimized` (Windows)
      * `localVideoStreamErrorScreenCaptureFailure` (Windows)
      * `localVideoStreamErrorDeviceSystemPressure` (Windows)
      * `directCdnStreamingErrorOk`
      * `directCdnStreamingErrorFailed`
      * `directCdnStreamingErrorAudioPublication`
      * `directCdnStreamingErrorVideoPublication`
      * `directCdnStreamingErrorNetConnect`
      * `directCdnStreamingErrorBadName`
      * `playerErrorNone`
      * `playerErrorInvalidArguments`
      * `playerErrorInternal`
      * `playerErrorNoResource`
      * `playerErrorInvalidMediaSource`
      * `playerErrorUnknownStreamType`
      * `playerErrorObjNotInitialized`
      * `playerErrorCodecNotSupported`
      * `playerErrorVideoRenderFailed`
      * `playerErrorInvalidState`
      * `playerErrorUrlNotFound`
      * `playerErrorInvalidConnectionState`
      * `playerErrorSrcBufferUnderflow`
      * `playerErrorInterrupted`
      * `playerErrorNotSupported`
      * `playerErrorTokenExpired`
      * `playerErrorUnknown`
      * `rtmpStreamPublishErrorOk`
      * `rtmpStreamPublishErrorInvalidArgument`
      * `rtmpStreamPublishErrorEncryptedStreamNotAllowed`
      * `rtmpStreamPublishErrorConnectionTimeout`
      * `rtmpStreamPublishErrorInternalServerError`
      * `rtmpStreamPublishErrorRtmpServerError`
      * `rtmpStreamPublishErrorTooOften`
      * `rtmpStreamPublishErrorReachLimit`
      * `rtmpStreamPublishErrorNotAuthorized`
      * `rtmpStreamPublishErrorStreamNotFound`
      * `rtmpStreamPublishErrorFormatNotSupported`
      * `rtmpStreamPublishErrorNotBroadcaster`
      * `rtmpStreamPublishErrorTranscodingNoMixStream`
      * `rtmpStreamPublishErrorNetDown`
      * `rtmpStreamPublishErrorInvalidPrivilege`
      * `rtmpStreamUnpublishErrorOk`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `ChannelMediaRelayEvent`

    ### v6.2.6 [#v626]

    v6.2.6 was released on November 24, 2023.

    #### Issues fixed [#issues-fixed-120]

    This release fixed the following issues:

    * Issues occurring when using Android 14:

      * When switching between portrait and landscape modes during screen sharing, the screen sharing process was interrupted. To restart screen sharing, users needed to confirm recording the screen in the pop-up window.
      * When integrating the SDK, setting the Android `targetSdkVersion` to 34 could cause screen sharing to be unavailable or even cause the app to crash.
      * Calling `startScreenCapture` without sharing video (setting `captureVideo` to `false`) and then calling `updateScreenCaptureParameters` to share video (setting `captureVideo` to `true`) resulted in a frozen shared screen on the receiving end.
      * When screen sharing in landscape mode, the shared screen seen by the audience was divided into two parts: One side of the screen was compressed and the other side was black.

    * When using an iOS 16 or later device with Bluetooth headphones connected before joining the channel, the audio routing after joining the channel was not as expected: Audio was played from the speaker, not the Bluetooth headphones (iOS).

    * In live streaming use-cases, the video on the audience end was occasionally distorted (Android).

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v6.2.4 [#v624]

    v6.2.4 was released on October 25, 2023.

    #### Issues fixed [#issues-fixed-121]

    This release fixes the following issue:

    The `AgoraRtcWrapper` version number in `CFBundleShortVersionString` on iOS and macOS is wrong, which interferes with submitting the App to the App Store.

    ### v6.2.3 [#v623]

    v6.2.3 was released on October 20, 2023.

    #### New features [#new-features-103]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `contentInspectImageModeration` enumeration is added in `ContentInspectType`, which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `ContentInspectConfig`. Thus parameter is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       In addition, this version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **ID3D11Texture2D Rendering (Windows)**

       As of this release, the SDK supports video formats of type ID3D11Texture2D, improving the rendering effect of video frames in game use-cases. You can set `format` to `VIDEO_TEXTURE_ID3D11TEXTURE2D` when pushing external raw video frames to the SDK by calling `pushVideoFrame`. By setting the `textureSliceIndex` property, you can determine the ID3D11Texture2D texture object to use.

    3. **Local video status error code update (Windows, macOS)**

       In order to help users understand the exact reasons for local video errors in screen sharing use-cases, the following sets of enumerations have been added to the `onLocalVideoStateChanged` callback:

       * `localVideoStreamErrorScreenCapturePaused`(23): Screen capture has been paused. A common use-case for reporting this error code is that the current screen may have been switched to a secure desktop, such as a UAC dialog box or Winlogon desktop.
       * `localVideoStreamErrorScreenCaptureResumed`(24): Screen capture has resumed from the paused state.
       * `localVideoStreamErrorScreenCaptureWindowHidden`(25): The window being captured on the current screen is in a hidden state and is not visible on the current screen.
       * `localVideoStreamErrorScreenCaptureWindowRecoverFromHidden`(26): The window for screen capture has been restored from the hidden state.
       * `localVideoStreamErrorScreenCaptureWindowRecoverFromMinimized`(27): The window for screen capture has been restored from the minimized state.

    4. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperforming, the error code `-4:errNotSupported` is returned, indicating the device does not support the feature.

    #### Improvements [#improvements-115]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10%. Specific values may vary depending on the device model and platform.

    2. **Screen sharing scenario optimization**

       This release optimizes the performance and encoding efficiency in ultra-high-definition (4K, 60 fps) game sharing use-cases, effectively reducing the system resource usage during screen sharing on Windows.

    **Other Improvements**

    This release optimizes the logic of Token parsing, in order to prevent an app from crashing when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-122]

    This release fixed the following issues:

    * Occasional crashes and dropped frames in screen sharing use-cases on Windows.
    * Occasional crashes when joining a channel on macOS.
    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `playEffect` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * When the host called the `startAudioMixing` method to play music, sometimes the host couldn't hear the music while the remote users could hear it on Android.
    * Occasional crashes occurred on certain Android devices.
    * Calling `takeSnapshotEx` once received the `onSnapshotTaken` callback for multiple times.
    * In channels joined by calling `joinChannelEx` exclusively, calling `setEnableSpeakerphone` did not result in switching audio route from the speaker to the headphone on Android.

    #### API changes [#api-changes-66]

    **Added**

    * The following enumerations in `onLocalVideoStateChanged` on Windows and macOS:
      * `localVideoStreamErrorScreenCapturePaused`
      * `localVideoStreamErrorScreenCaptureResumed`
      * `localVideoStreamErrorScreenCaptureWindowHidden`
      * `localVideoStreamErrorScreenCaptureWindowRecoverFromHidden`
      * `localVideoStreamErrorScreenCaptureWindowRecoverFromMinimized`
    * `textureSliceIndex` members in `ExternalVideoFrame` on Windows
    * `videoTextureId3d11texture2d` in `VideoPixelFormat` on Windows
    * `enableContentInspectEx`
    * `contentInspectImageModeration` in `ContentInspectType`.
    * `serverConfig` in `ContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `FeatureType`

    ### v6.2.2 [#v622]

    v6.2.2 was released on August 1, 2023.

    #### New features [#new-features-104]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info" />

    All 4.x SDKs support using wildcard tokens.
    \:::

    2. **Preloading channels**

       This release adds `preloadChannel` and `preloadChannelWithUserAccount` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `VideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    4. **Publishing video streams from different sources** (Windows, macOS)

       This release adds the following members in `ChannelMediaOptions` to allow you publish video streams captured from the third and fourth camera or screen:

       * `publishThirdCameraTrack`: Publishing the video stream captured from the third camera.
       * `publishFourthCameraTrack`: Publishing the video stream captured from the fourth camera.
       * `publishThirdScreenTrack`: Publishing the video stream captured from the third screen.
       * `publishFourthScreenTrack`: Publishing the video stream captured from the fourth screen.

       <CalloutContainer type="info" />

    For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
    \:::

    #### Improvements [#improvements-116]

    1. **Improved camera capture effect** (Android, iOS)

       This release has improved camera capture effect in the following aspects:

       1. Support for camera exposure adjustment

          This release adds `isCameraExposureSupported` to query whether the device supports exposure adjustment and `setCameraExposureFactor` to set the exposure ratio of the camera.

       2. Optimization of default camera selection (iOS)

          Since this release, the default camera selection behavior of the SDK is aligned with that of the iOS system camera. If the device has multiple rear cameras, better shooting perspectives, zooming capabilities, low-light performance, and depth sensing can be achieved during video capture, thereby improving the quality of video capture.

    2. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    3. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    4. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. To improve the switching experience between multiple audio routes, this release adds the `setRouteInCommunicationMode` method. This method can switch the audio route from a Bluetooth headphone to the earpiece, wired headphone or speaker in communication volume mode ([`MODE_IN_COMMUNICATION`](https://developer.android.google.cn/reference/kotlin/android/media/AudioManager?hl=en#mode_in_communication)). (Android)
    2. The SDK automacially adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    3. To help users understand the reasons for more types of remote video state changes, the `remoteVideoStateReasonCodecNotSupport` enumeration has been added to the `onRemoteVideoStateChanged` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-123]

    This release fixed the following issues:

    * Occasionally, noise occurred when the local user listened to their own and remote audio after joining the channel. (macOS)
    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.
    * In multi-device audio recording use-cases, after repeatedly plugging and unplugging or enabling/disabling the audio recording device, no sound could be heard occasionally when calling the `startRecordingDeviceTest` to start an audio capturing device test. (Windows)

    #### API changes [#api-changes-67]

    **Added**

    * `setCameraExposureFactor` (Android, iOS)
    * `isCameraExposureSupported` (Android, iOS)
    * `preloadChannel`
    * `preloadChannelWithUserAccount`
    * `updatePreloadChannelToken`
    * `setRouteInCommunicationMode` (Android)
    * The following members in `ChannelMediaOptions`:
      * `publishThirdCameraTrack` (Windows, macOS)
      * `publishFourthCameraTrack` (Windows, macOS)
      * `publishThirdScreenTrack` (Windows, macOS)
      * `publishFourthScreenTrack` (Windows, macOS)
    * `CodecCapLevels`
    * `VideoCodecCapabilityLevel`
    * `backgroundColor` in `VideoCanvas`
    * `codecLevels` in `CodecCapInfo`
    * `remoteVideoStateReasonCodecNotSupport` in `RemoteVideoStateReason`

    ### v6.2.1 [#v621]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-117]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-124]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * After enabling the screen sharing feature on the sending end, there was high delay until the receiving end could see the shared screen. (macOS)
    * Occasional crash after calling the `destroyMediaPlayer` method. (iOS)
    * When the sending end mixed and published two streams of video captured by two cameras locally, the video from the second camera was occasionally missing on the receiving end. (Windows)
    * In screen sharing use-cases, some Android devices experienced choppy video on the receiving end. (Android)

    ### v6.2.0 [#v620]

    v6.2.0 was released on May 29, 2023.

    #### Compatibility changes [#compatibility-changes-63]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture (Windows, iOS)**

    This release optimizes the APIs for camera and screen capture function. As of v6.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter:

    | Deleted methods                                                                         | Alternative methods                        |
    | :-------------------------------------------------------------------------------------- | :----------------------------------------- |
    | `startPrimaryCameraCapture` (Windows)<br />`startSecondaryCameraCapture` (Windows, iOS) | `startCameraCapture`                       |
    | `stopPrimaryCameraCapture` (Windows)<br />`stopSecondaryCameraCapture` (Windows, iOS)   | `stopCameraCapture`                        |
    | `startPrimaryScreenCapture` (Windows)<br />`startSecondaryScreenCapture` (Windows)      | `startScreenCaptureBySourceType` (Windows) |
    | `stopPrimaryScreenCapture` (Windows)<br />`stopSecondaryScreenCapture` (Windows)        | `stopScreenCaptureBySourceType` (Windows)  |

    **2. Video data acquisition**

    * The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.

    * The following callbacks are deleted. Get the video source type through the `sourceType` parameter in the `onPreEncodeVideoFrame` and `onCaptureVideoFrame` callbacks (Windows):

      * `onSecondaryPreEncodeCameraVideoFrame`
      * `onScreenCaptureVideoFrame`
      * `onPreEncodeScreenVideoFrame`
      * `onSecondaryPreEncodeScreenVideoFrame`

    **3. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` in `ChannelMediaOptions` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` in `ChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **4. Local video mixing (Windows)**

    * The `VideoInputStreams` in `LocalTranscoderConfiguration` is changed to `videoInputStreams`.
    * The `MediaSourceType` in `TranscodingVideoStream` is changed to `VideoSourceType`.

    **5. Video encoder algorithm**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **6. Miscellaneous**

    * `onApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * The `IAudioFrameObserver` class is renamed to `IAudioPcmFrameSink`, thus the prototypes of the following methods are updated accordingly:
      * `onFrame`
      * `registerAudioFrameObserver` and `unregisterAudioFrameObserver` in `MediaPlayer`
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-105]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode to balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background feature. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting scenarios where high bitrate is required, ensuring smoothness when multiple streams are subscribed to by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing (macOS, iOS, Android)**

    This release adds the local video mixing feature. You can use the `startLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `updateLocalTranscoderConfiguration` method and the `onLocalVideoTranscoderError` callback. After enabling local video mixing, you can use the `updateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `onLocalVideoTranscoderError` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Local video mixing (Windows)**

    This release adds the `onLocalVideoTranscoderError` callback. When there is an error in starting or updating the local video mixing, the SDK triggers this callback to report the reason for the failure.

    **6. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    **7. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **8. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `onVideoRenderingTracingResult` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks **Join Channel** button and then get the indicators in the video frame rendering process through the `onVideoRenderingTracingResult` callback. This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-118]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced screen share (Android, iOS)**

    This release adds the `queryScreenCaptureCapability` method, which is used to query the screen capture capabilities of the current device. To ensure optimal screen sharing performance, particularly in enabling high frame rates like 60 fps, Agora recommends you to query the device's maximum supported frame rate using this method beforehand.

    This release also adds the `setScreenCaptureScenario` method, which is used to set the scenario type for screen sharing. The SDK automatically adjusts the smoothness and clarity of the shared screen based on the scenario type you set.

    **3. Improved compatibility with audio file types (Android)**

    As of this release, you can use the following methods to open files with a URI starting with `content://`:

    * `startAudioMixing`
    * `playEffect`
    * `openWithMediaSource`

    **4. Enhanced rendering compatibility (Windows)**

    This release enhances the rendering compatibility of the SDK. Issues like black screens caused by rendering failures on certain devices are fixed.

    **5. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **6. Multi-camera capture and multi-screen capture**

    This release introduces `startScreenCaptureBySourceType` (PC only) and `startCameraCapture`. By calling these methods multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras and screens for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras and displays need to be connected.

    **7. Channel media relay**

    This release introduces `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **8. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    **9. Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode:

    * When the video processing mode is `processModeReadOnly`, the return value is reserved for future use.
    * When the video processing mode is `processModeReadWrite`, the SDK receives the video frame when the return value is `true`. The video frame is discarded when the return value is `false`.

    #### Issues fixed [#issues-fixed-125]

    This release fixed the following issues:

    * Occasional crashes occurred on Android devices when users joined or left a channel (Android).
    * When the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.
    * Occasional failure when enabling in-ear monitoring (Android).
    * Occasional loss of the `onFirstRemoteVideoFrame` callback during channel media relay (iOS).
    * The receiver actively subscribed to the high-quality stream but unexpectedly received a low-quality stream (iOS).
    * The receiver was receiving the low-quality stream originally and automatically switched to the high-quality stream after a few seconds (macOS).
    * Occasional echo (Android).
    * Occasional screen jitter during screen sharing (macOS).
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback (Android, iOS).
    * When using Agora Media Player to play RTSP video streams, the video images sometimes appeared pixelated (Windows).
    * Playing audio files with a sample rate of 48 kHz failed.
    * Crashes occurred after users set the video resolution as 3840 × 2160 and started CDN streaming on Xiaomi Redmi 9A devices (Android).
    * If the rendering view of the player was set as a `UIViewController`'s view, the video was zoomed from the bottom-left corner to the middle of the screen when entering full-screen mode (macOS).
    * Adding an Alpha channel to an image in the PNG or GIF format failed when the local client mixed video streams (Windows).
    * In real-time chorus use-cases, remote users heard noises and echoes when an OPPO R11 device joined the channel in the loudspeaker mode (Android).
    * When the playback of the local music finished, the `onAudioMixingFinished` callback was not properly triggered (Android).
    * After joining the channel, remotes users saw a watermark even though the watermark was deleted (Windows).
    * If a watermark was added after starting screen sharing, the watermark was not displayed on the screen (Windows).
    * When joining a channel and accessing an external camera, calling `setDevice` to specify the video capture device as the external camera did not take effect (macOS, Windows).
    * When using a video frame observer, the first video frame was occasionally missed on the receiver's end (Android).
    * When sharing screens in use-cases involving multiple channels, remote users occasionally saw black screens (Android).
    * When trying to outline the shared window and put it on top, the shared window did not stay on top of other windows (Windows).
    * Switching to the rear camera with the virtual background enabled occasionally caused the background to be inverted (Android).
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.
    * At the moment when a user left a channel, a request for leaving was not sent to the server and the leaving behavior was incorrectly determined by the server as timed out.

    #### API changes [#api-changes-68]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startScreenCaptureBySourceType` (Windows, macOS)
    * `stopScreenCaptureBySourceType` (Windows, macOS)
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `onLocalVideoTranscoderError`
    * `startLocalVideoTranscoder` (macOS, iOS, Android)
    * `updateLocalTranscoderConfiguration` (macOS, iOS, Android)
    * `queryScreenCaptureCapability` (iOS, Android)
    * `setScreenCaptureScenario` (iOS, Android)
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioAinsMode`
    * `AudioTrackType`
    * `VideoApplicationScenarioType`
    * `ScreenCaptureFramerateCapability`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `backgroundNone` and `backgroundVideo` enumerators in `backgroundSourceType`

    **Deprecated**

    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `ChannelMediaRelayEvent`
    * `enableInstantMediaRendering`
    * `startMediaRenderingTracing`
    * `startMediaRenderingTracingEx`
    * `onVideoRenderingTracingResult`
    * `MediaTraceEvent`
    * `VideoRenderingTracingInfo`

    **Deleted**

    * `startPrimaryScreenCapture` (Windows)
    * `startSecondaryScreenCapture` (Windows)
    * `stopPrimaryScreenCapture` (Windows)
    * `stopSecondaryScreenCapture` (Window)
    * `startPrimaryCameraCapture` (Windows)
    * `startSecondaryCameraCapture` (Windows, iOS)
    * `stopPrimaryCameraCapture` (Windows)
    * `stopSecondaryCameraCapture` (Windows, iOS)
    * `onSecondaryPreEncodeCameraVideoFrame` (Windows)
    * `onScreenCaptureVideoFrame` (Windows)
    * `onPreEncodeScreenVideoFrame` (Windows)
    * `onSecondaryPreEncodeScreenVideoFrame` (Windows)
    * `onApiCallExecuted`
    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions`
    * `enableRemoteSuperResolution`
    * `superResolutionType` in `RemoteVideoStats`

    ### v6.1.0 [#v610]

    v6.1.0 was released on December 20, 2022.

    #### Compatibility changes [#compatibility-changes-64]

    This release deletes the `sourceType` parameter in `enableDualStreamMode`, because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK; you no longer need to specify the video source type.

    #### New features [#new-features-106]

    **1. In-ear monitoring**

    This release adds support for in-ear monitoring. You can call `enableInEarMonitoring` to enable the in-ear monitoring function.

    After successfully enabling the in-ear monitoring function, you can call `registerAudioFrameObserver` to register the audio observer, and the SDK triggers the `onEarMonitoringAudioFrame` callback to report the audio frame data. You can use your own audio effect processing module to preprocess the audio frame data of the in-ear monitoring to implement custom audio effects. Agora recommends that you call the `setEarMonitoringAudioFrameParameters` method to set the audio data format of in-ear monitoring. The SDK calculates the sampling interval based on the parameters in this method and triggers the `onEarMonitoringAudioFrame` callback based on the sampling interval.

    To adjust the in-ear monitoring volume, you can call `setInEarMonitoringVolume`.

    **2. Audio capture device test (Android)**

    This release adds support for testing local audio capture devices before joining a channel. You can call `startRecordingDeviceTest` to start the audio capture device test. After the test is complete, call the `stopPlaybackDeviceTest` method to stop the audio capture device test.

    **3. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use. The available values are `UNKNOWN`, `DISCONNECTED`, `LAN`, `WIFI`, `2G`, `3G`, `4G`, and `5G`. When the local network connection type changes, the SDK triggers the `onNetworkTypeChanged` callback to report the current network connection type.

    **4. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports the three audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Agora also supports publishers in choosing whether the audio streams being published are to be filtered based on volume. Streams that are not filtered bypass this filter mechanism and are transported directly to the receivers. In scenarios with a number of publishers, enabling this function helps reduce the bandwidth and device system pressure for the receivers.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this function, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **5. Dual-stream mode**

    This release optimizes the dual-stream mode. You can call `enableDualStreamMode` and `enableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing to a low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams). Follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `setRemoteVideoStreamType` or `setRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify this default behavior, you can call `setDualStreamMode` and set the `mode` parameter to `disableSimulcastStream` (never send low-quality video streams) or `enableSimulcastStream` (always send low-quality video streams).

    **6. Loopback device (Windows)**

    The SDK uses the playback device as the loopback device by default. As of 6.1.0, you can specify a loopback device separately and publish the captured audio to the remote end.

    * `setLoopbackDevice`: Specifies the loopback device. If you do not want the current playback device to be the loopback device, you can call this method to specify another device as the loopback device.
    * `getLoopbackDevice`: Gets the current loopback device.
    * `followSystemLoopbackDevice`: Whether the loopback device follows the default playback device of the system.

    **7. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense-of-presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation` respectively, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enableDoppler` parameter in `SpatialAudioParams`. The receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the audio experience for users with headphones.

    **8. Multiple cameras for video capture (iOS)**

    This release supports multi-camera video capture. You can call `enableMultiCamera` to enable multi-camera capture mode, call `startSecondaryCameraCapture` to start capturing video from the second camera, and then publish the captured video to the second channel.

    To stop using multi-camera capture, you need to call `stopSecondaryCameraCapture` to stop the second camera capture, then call `enableMultiCamera` and set `enabled` to `false`.

    **9. Headphone equalization effect**

    This release adds the `setHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call `setHeadphoneEQParameters` to adjust the EQ.

    **10. Encoded video frame observer**

    This release adds the `setRemoteVideoSubscriptionOptions` and `setRemoteVideoSubscriptionOptionsEx` methods. When you call the `registerVideoEncodedFrameObserver` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the [API reference](https://api-ref.agora.io/en/video-sdk/flutter/6.x/API/class_imediaengine.html#api_imediaengine_registervideoencodedframeobserver).

    **11. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this feature, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **12. Register extensions (Windows)**

    This release adds the `registerExtension` method for registering extensions. When using a third-party extension, you need to call the extension-related APIs in the following order:

    `loadExtensionProvider` -> `registerExtension` -> `setExtensionProviderProperty` -> `enableExtension`

    **13. Device management (Windows, macOS)**

    This release adds a series of callbacks to help you better understand the status of your audio and video devices:

    * `onVideoDeviceStateChanged`: Occurs when the status of the video device changes.
    * `onAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `onAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **14. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `CameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **15. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * The `options` parameter in the `leaveChannelEx` method, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **16. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advanceOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `CompressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `EncodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **17. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `onClientRoleChanged` callback. The value of this parameter is as follows:

    * `audienceLatencyLevelLowLatency (1)`: Low latency.
    * `audienceLatencyLevelUltraLowLatency (2)`: Ultra-low latency.

    **18. Brand-new AI Noise Suppression**

    The SDK supports a new version of Noise Suppression (versus the basic AI Noise Suppression in agora\_rtc\_engine: ^5.x). Compared to the previous Noise Suppression, the new AI Noise Suppression has better vocal fidelity, cleaner noise suppression, and add the Dereverberation capability. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    #### Improvements [#improvements-119]

    **1. Video information change callback**

    This release optimizes the trigger logic of `onVideoSizeChanged`, which can also be triggered and report the local video size change when `startPreview` is called separately.

    **2. First video frame rendering (Windows)**

    This release speeds up the first video frame rendering time to improve the video experience.

    **3. Screen sharing**

    In addition to the usability enhancements detailed in the [fixed issued](#issue-fixed) section, this release includes a number of functional improvements to screen sharing, as follows:

    **Windows**

    * New `minimizeWindow` member in `ScreenCaptureSourceInfo` to indicate whether the target window is minimized.
    * New `enableHighLight`, `highLightColor`, and `highLightWidth` members in `ScreenCaptureParameters` so that you can place a border around the target window or screen when screen sharing.
    * Compatibility with a greater number of mainstream apps, including WPS Office, Microsoft Office PowerPoint, Visual Studio Code, Adobe Photoshop, Windows Media Player, and Scratch.
    * Compatibility with additional devices and operating systems, including: Window 8 systems, devices without discrete graphics cards, and dual graphics devices.
    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a device with an Intel Core i7-9750H CPU @ 2.60 GHz or better.

    **macOS**

    * Compatibility with additional devices and use-cases, including: dual graphics devices and screen sharing using external screens.
    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a 2021 16" M1 Macbook Pro or better.

    **4. Bluetooth permissions (Android)**

    To simplify integration, as of this release, you can use the SDK to enable Android users to use Bluetooth normally without adding the `BLUETOOTH_CONNECT` permission.

    **5. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v6.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `relayEventPacketUpdateDestChannelRefused (8)`, and you need to call the `updateChannelMediaRelay` method again.
    * v6.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **6. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **7. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `audioScenarioMeeting` scenario.
    * Improves the smoothness of SDK video rendering.
    * Reduces the CPU usage and power consumption of the local device when the host calls the `muteLocalVideoStream` method. (Windows, macOS)
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network scenarios.

    #### Issues fixed [#issues-fixed-126]

    This release fixes the following issues:

    **All**

    * When calling `setVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.
    * When using the Agora media player to play videos, after you played and paused the video, and then called the `seek` method to specify a new position for playback, the video image occasionally remained unchanged; if you called the `resume` method to resume playback, the video was sometimes played at a speed faster than the original one.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.
    * The call `getExtensionProperty` failed and returned an empty string.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.

    **Android**

    * In online meeting use-cases, the local user and the remote user occasionally could not hear each other after the local user was interrupted by a call.
    * After calling `setCloudProxy` to set the cloud proxy, calling `joinChannelEx` to join multiple channels failed.

    **iOS**

    * Calling `startAudioMixing` to play music files in the ipod-library://item path failed.
    * Different timestamps for audio and video data were obtained simultaneously and separately via `onRecordAudioFrame` and `onCaptureVideoFrame` callbacks.

    **Windows**

    * When `stopPreview` was called to disable the local video preview, the virtual background that had been set up was occasionally invalidated.
    * Crashes occasionally occurred when exiting a channel and joining it multiple times with virtual background enabled and set to blur effect.
    * If the local client used a camera with a resolution set to 1920 × 1080 as the video capture source, the resolution of the remote video was occasionally inconsistent with the local client.
    * When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `setVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.
    * In screen sharing use-cases, when the user minimized and then restored the shared window, the remote video occasionally switched to the low-quality stream.
    * When the host started screen sharing during live streaming, the audience members sometimes heard echoes.
    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * In screen sharing use-cases, a black screen appeared when sharing a screen between a landscape monitor and a portrait monitor.
    * In screen sharing use-cases with a window excluded, the application crashed when the specified shared area exceeded the screen resolution.
    * The application failed to exclude a window using the `startScreenCaptureByDisplayId` method for screen sharing.
    * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was sharing a screen.
    * In screen sharing use-cases, when the user shared the screen by window, the mouse in the shared screen was not in its actual position.
    * When switching from a non-screen sharing use-case to a screen sharing one, the application occasionally crashed if the user did not switch the resolution accordingly.

    **macOS**

    * When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `setVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.
    * In screen sharing use-cases on Mac devices, when the user minimized or closed a shared application window, another window of the same application was automatically shared.
    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * In screen sharing use-cases, the shared window of a split screen was not highlighted correctly.
    * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was sharing a screen.
    * After starting and stopping the audio capture device test, there was no sound when the audio playback device was subsequently started.
    * The `onVideoPublishStateChanged` callback reported an inaccurate video source type.

    #### API changes [#api-changes-69]

    **Added**

    * `getNativeHandle`
    * `getPlaybackDefaultDevice`
    * `getRecordingDefaultDevice`
    * `enableDualStreamModeEx`
    * `setDualStreamMode`
    * `setDualStreamModeEx`
    * `SimulcastStreamMode`
    * `getNetworkType`
    * `setLoopbackDevice` (Windows)
    * `getLoopbackDevice` (Windows)
    * `followSystemLoopbackDevice` (Windows)
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `setHeadphoneEQPreset`
    * `setHeadphoneEQParameters`
    * `HeadphoneEqualizerPreset`
    * `enableMultiCamera` (iOS)
    * `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoSubscriptionOptionsEx`
    * `VideoSubscriptionOptions`
    * `AdvanceOptions`
    * `EncodingPreference`
    * `CompressionPreference`
    * `adjustUserPlaybackSignalVolumeEx`
    * `onRhythmPlayerStateChanged` (Android, iOS)
    * `RhythmPlayerStateType`
    * `RhythmPlayerErrorType`
    * `enableAudioVolumeIndicationEx`
    * `onVideoDeviceStateChanged` (Windows, macOS)
    * `onAudioDeviceStateChanged` (Windows, macOS)
    * `onAudioDeviceVolumeChanged` (Windows, macOS)
    * `registerExtension` (Windows)
    * `muteLocalAudioStreamEx`
    * `muteLocalVideoStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `muteAllRemoteVideoStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`

    **Modified**

    * Adds `isAudioFilterable` in `ChannelMediaOptions`
    * Adds `enableDoppler` in `SpatialAudioParams`
    * Adds `minimizeWindow` in `ScreenCaptureSourceInfo`
    * Adds `followEncodeDimensionRatio` in `CameraCapturerConfiguration`
    * Adds `options` in `leaveChannelEx`
    * Adds `advanceOptions` in `VideoEncoderConfiguration`
    * Adds `newRoleOptions` in `onClientRoleChanged`
    * Adds `setupMode`, `mediaPlayerId`, and `cropArea` in `VideoCanvas`
    * Adds `hwEncoderAccelerating` in `LocalVideoStats`
    * Removes `sourceType` in `enableDualStreamMode`
    * `enableInEarMonitoring`: Supports Windows and macOS
    * `setEarMonitoringAudioFrameParameters`: Supports Windows and macOS
    * `setInEarMonitoringVolume`: Supports Windows and macOS
    * `onEarMonitoringAudioFrame`: Supports Windows and macOS
    * `ScreenCaptureParameters`: Supports Windows

    **Deprecated**

    * `onApiCallExecuted`: Use the callbacks triggered by specific methods instead.
    * `relayEventPacketUpdateDestChannelRefused` (8) in `ChannelMediaRelayEvent`

    ### v6.0.0 [#v600]

    v6.0.0 was released on September 29, 2022. This release is compatible with Video Calling 4.x.

    #### Compatibility changes [#compatibility-changes-65]

    This release changed SDK package name from `agora_rtc_ng` to `agora_rtc_engine`, and optimized the implementation of some features, resulting in incompatibility with v5.x. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Custom video capture and renderer (Media IO)
    * Error codes and warning codes

    After upgrading the SDK, you need to update the code in your app according to the business use-cases. See [Migration guide](/en/realtime-media/video/reference/migration-guide) for details.

    #### New features [#new-features-107]

    **1. Multiple media tracks**

    This release supports one `RtcEngine` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `RtcEngineEx` and `ChannelMediaOptions.`

    * After calling `joinChannel` to join the first channel, call `joinChannelEx` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `ChannelMediaOptions` settings.
    * You can simultaneously publish multiple sets of video streams captured by multiple cameras or screen sharing by setting `publishSecondaryCameraTrack` and `publishSecondaryScreenTrack` in `ChannelMediaOptions`. (Windows)

    This release adds `createCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured video in the channel:

    1. Create a custom video track: Call the `createCustomVideoTrack` method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `ChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `pushVideoFrame`, and specify `videoTrackId` as the ID of the custom video track in step 2 in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Ultra HD resolution (Beta) (Windows, macOS)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capture, encoding, decoding and rendering, and now supports 4K resolution. The improved FEC (Forward Error Correction) algorithm enables adaptive switches according to the frame rate and number of video frame packets, which further reduces the video stuttering rate in 4K scenes.

    Additionally, you can set the encoding resolution to 4K (3840 × 2160) and the frame rate to 60 fps when calling `setVideoEncoderConfiguration`. The SDK supports automatic fallback to the appropriate resolution and frame rate if your device does not support 4K.

    This feature has certain requirements with regards to device performance and network bandwidth, and the supported upstream and downstream frame rates vary on different platforms. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Full HD and Ultra HD resolution (Beta) (Android, iOS)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capturing, encoding, decoding and rendering. Starting from this version, it supports Full HD (FHD) and Ultra HD (UHD) video resolutions. You can set the `dimensions` parameter to 1920 × 1080 or higher when calling the `setVideoEncoderConfiguration` method. If your device does not support high resolutions, the SDK will automatically fall back to an appropriate resolution.

    The UHD resolution (4K, 60 fps) is currently in beta and requires certain device performance and network bandwidth. If you want to enable this feature, contact [technical support](mailto\:support@agora.io).

    High resolution typically means higher performance consumption. To avoid a decrease in experience due to insufficient device performance, Agora recommends that you enable FHD and UHD video resolutions on devices with better performance.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **4. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayer` method to create a media player object, you can then call the methods in the `MediaPlayer` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    * Plays local and online media files.
    * Preloads media files.
    * Changes the CDN route for playing media files according your network conditions.
    * Shares the audio and video streams being played with remote users.
    * Caches data when playing media files.

    To make audios sound clearer and stay true to the original sound of audio files, this release adds the `ultraHighQualityVoice` enumeration. In use-cases that involve human voices, such as chatting or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Spatial audio**

    > ***NOTE:*** This feature is in experimental status. To enable this feature, contact [support@agora.io](mailto\:support@agora.io). Contact Technical Support if needed.

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation Solution: This solution uses the `LocalSpatialAudioEngine` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `updateSelfPosition` and `updateRemotePosition` to update the spatial coordinates of the local and remote users respectively, so that the local user can hear the spatial audio of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    * Local Cartesian Coordinate System Calculation Solution: This solution uses the `LocalSpatialAudioEngine` class to implement spatial audio. You need to call `updateSelfPosition` and `updatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    **6. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `audioScenarioChorus` enumeration in `AudioScenarioType`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **7. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `ChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `ChannelMediaOptions` when calling `joinChannel` or `joinChannelEx` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelMediaOptions` to update the settings in `ChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **8. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function through the following ways.

    On Windows and macOS:

    * Call the `startScreenCaptureByDisplayId` method before joining a channel, and then call `joinChannel` \[2/2] to join a channel and set `publishScreenTrack` or `publishSecondaryScreenTrack` as `true`.
    * Call the `startScreenCaptureByDisplayId` method after joining a channel, and then call `updateChannelMediaOptions` to set `publishScreenTrack` or `publishSecondaryScreenTrack` as `true`.

    On Android and iOS:

    * Call the `startScreenCapture` method before joining a channel, and then call `joinChannel` \[2/2] to join a channel and set `publishScreenCaptureVideo` as `true`.
    * Call the `startScreenCapture` method after joining a channel, and then call `updateChannelMediaOptions` to set `publishScreenCaptureVideo` as true.

    **9. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add the user ID that you want to subscribe to in your allowlist, or in your blocklist if you do not want to subscribe to. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `RtcEngineEx` interface.

    * `setSubscribeAudioBlacklist`: Set the audio subscription blocklist.
    * `setSubscribeAudioWhitelist`: Set the audio subscription allowlist.
    * `setSubscribeVideoBlacklist`: Set the video subscription blocklist.
    * `setSubscribeVideoWhitelist`: Set the video subscription allowlist.

    If a user is added in a blocklist and allowlist at the same time, only the blocklist takes effect.

    **10. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `setAudioScenario` method. For example, if you want to change the audio scenario from `AudioScenarioDefault` to `AudioScenarioGameStreaming` when you are in a channel, you can call this method.

    **11. Replace video feeds with images**

    This release supports replacing video feeds with images when publishing video streams. You can call the `enableVideoImageSource` method to enable this function and choose your own images through the `options` parameter. If you disable this function, the remote users see the video feeds that you publish.

    **12. Local video transcoder**

    This release introduces local video transcoder with which you can locally merge multiple video streams into one. Common use-cases are as follows:

    When streaming or using media push, you can merge the frames of multiple anchors into one locally.

    To do this, you should merge multi-channel video streams collected locally (such as video captured by camera, screen sharing stream, video files and pictures) into one video stream. Then, release the merged stream in the channel.

    You can call the `startLocalVideoTranscoder` method to enable the local video transcoder and call the `stopLocalVideoTranscoder` method to stop the local video transcoder; After the local video transcoder is enabled, you can call `updateLocalTranscoderConfiguration` to update the configuration of the local video transcoder.

    **13. Video device management**

    A video capture device may support a variety of video formats, each of which supports a different combination of video frame width, video frame height, and frame rate.

    This release introduces the `numberOfCapabilities` and `getCapability` method to obtain the number of video formats supported by video capture devices and the details of video frames under specified video formats. When you call the `startPrimaryCameraCapture` or `startSecondaryCameraCapture` method to capture video using camera, you can obtain the video with the specified video format.
    The SDK will automatically select the video format for video capture equipment according to your settings in `VideoEncoderConfiguration`. In general, you don't need to use this set of new methods.

    #### Improvements [#improvements-120]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `switchChannel` in agora\_rtc\_engine: ^5.x through the `leaveChannel` and `joinChannel` methods so that you don't need to take the time to call the `switchChannel` method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `pushVideoFrame` method to push such video frames to the SDK.

    **3. Voice pitch of the local user**

    This release adds `voicePitch` in `AudioVolumeInfo` of `onAudioVolumeIndication`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **4. Video preview**

    This release improves the implementation logic of `startPreview`. You can call the `startPreview` method to enable video preview at any time.

    **5. Video types of subscription**

    You can call the `setRemoteDefaultVideoStreamType` method to choose the video stream type when subscribing streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="react-native">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="react-native" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-7]

    ### Known issues [#known-issues-7]

    ### v4.6.2 [#v462-6]

    Released on March 14, 2026.

    #### Compatibility changes [#compatibility-changes-66]

    This release introduces the following compatibility changes:

    * **Deprecation of Direct CDN streaming APIs**

      The following APIs related to Direct CDN streaming are deprecated in this release and will be removed in a future version. Use [Media Push](/en/realtime-media/media-push/get-started/enable-media-push) instead.

      * `setDirectCdnStreamingAudioConfiguration`
      * `setDirectCdnStreamingVideoConfiguration`
      * `startDirectCdnStreaming`
      * `stopDirectCdnStreaming`
      * `DirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingStats`
      * `DirectCdnStreamingState`
      * `DirectCdnStreamingReason`

    * **Deprecation of virtual metronome APIs**

      The following APIs related to the virtual metronome feature are deprecated in this release and will be removed in a future version.

      * `startRhythmPlayer`
      * `configRhythmPlayer`
      * `onRhythmPlayerStateChanged`

    * **Deprecation of watermark APIs**

      The following watermark APIs are deprecated in this release. Use the new watermark APIs introduced in this release instead.

      * `addVideoWatermark`
      * `addVideoWatermarkEx`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `enableWirelessAccelerate`

    * **Changes to makeup feature implementation**

      Due to the beauty effect refactoring in this release, calling `setExtensionProperty` to enable the makeup feature is no longer supported starting from v4.6.2. Use the `STYLE_MAKEUP` node instead.

    * **Behavior changes in dual-stream mode**

      Before v4.6.2, when the sender enabled adaptive low-stream mode (`AutoSimulcastStream`), the low stream was not sent proactively. The sender only started sending the low stream after receiving a request from a host-role receiver calling `setRemoteVideoStreamType`. Starting from v4.6.2, when the sender enables adaptive low-stream mode, the SDK automatically decides whether to send or stop sending the low stream based on the downlink network quality of subscribing users. If you set `mode` to another sending mode or explicitly configure the width, height, bitrate, or frame rate of the low stream, this adaptive behavior is disabled.

    * **New domains required for domain whitelist**

      If you upgrade from a previous version and use the domain whitelist feature (`domainLimit` in `RtcEngineConfig` set to `true`), add the following domains to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    * **Removal of `uid` from `EncodedVideoFrameInfo` struct**

      The `uid` parameter is removed from the `EncodedVideoFrameInfo` struct. You can retrieve `uid` information directly from the `onEncodedVideoFrameReceived` callback. Update your integration logic accordingly.

    #### New features [#new-features-108]

    Included in this release:

    * **Multi-resolution video streams**

      This release introduces the Adaptive Bitrate Video Streaming (ABR) feature, which supports sending multiple video streams at different resolutions from the same video source simultaneously, including in multi-channel scenarios. Receivers can automatically or manually subscribe to streams at their preferred resolution.

      After enabling ABR, you can configure up to four video stream layers (one main stream at the highest resolution and up to three lower-resolution streams), and set options such as resolution, bitrate, and layered streaming fallback. When layered streaming fallback is enabled, the SDK automatically switches to lower-resolution streams under poor network conditions to maintain a smooth viewing experience. This feature is suited for meetings, large classes, interactive live streaming, and other multi-device or multi-network environments.

    * **Multi-path network transmission**

      This release introduces multi-path transmission for devices that support multiple network interfaces (such as 5G, Wi-Fi, and LAN). This feature reduces or eliminates experience degradation caused by poor network conditions, making it suitable for real-time audio and video communication in challenging environments such as vehicles, IoT devices, trains, and highways.

      Enable multi-path transmission by setting `enableMultipath` to `true` in `ChannelMediaOptions`. Two transmission modes are supported through `MultipathMode`:

      * **Dynamic mode** (default): Dynamically selects the best available path based on network conditions. Suited for traffic-sensitive scenarios with high experience requirements, such as meetings and online education. In this mode, you can specify the preferred network path (for example, Wi-Fi or mobile network) using `preferMultipathType`.
      * **Full redundancy mode**: Transmits data simultaneously on all available network paths. Suited for scenarios that are not traffic-sensitive but require extreme reliability, such as outdoor broadcasting and parallel control. This mode incurs additional costs. [Contact technical support](mailto\:support@agora.io) to enable it.

      Uplink and downlink paths can also be configured separately using `uplinkMultipathMode` and `downlinkMultipathMode` in `ChannelMediaOptions`. Once enabled, the SDK reports real-time transmission statistics for each path through the `onMultipathStats` callback, including per-path traffic consumption.

    * **Video quality scoring**

      This release adds the `mosValue` field to `RemoteVideoStats`, reporting the quality score of the received remote video stream as evaluated by the Agora real-time video MOS (Mean Opinion Score) system. Scores range from 1 to 5, where 5 indicates excellent video quality and 1 indicates extremely poor quality. Use this field to monitor subjective video quality in real time, adjust video parameters dynamically, or integrate into quality monitoring and alerting workflows. [Contact technical support](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

      This release deprecates `addVideoWatermark` and `addVideoWatermarkEx`, and introduces `addVideoWatermarkWithConfig` and `addVideoWatermarkWithConfigEx`, which support adding multiple watermarks to a video using watermark IDs and controlling their display order. To remove a specific watermark, call `removeVideoWatermark`.

    * **Token renewal result callback**

      This release introduces the `onRenewTokenResult` callback and the `RenewTokenErrorCode` error code enum. After calling `renewToken` to update the token, the SDK reports the result through `onRenewTokenResult` and returns detailed error codes defined in `RenewTokenErrorCode`, allowing you to handle token renewal failure scenarios accordingly.

    * **App-level screen sharing support on Android**

      Starting from Android 14, the system allows users to choose between sharing the full screen or a single app during screen sharing, enhancing privacy and multitasking. This release adds support for sharing a single app in addition to full-screen sharing. The new `onLocalVideoEvent` callback reports local video events, especially those related to screen sharing.

    * **New permission granted callback on Android**

      The `onPermissionGranted` callback helps confirm permission status in screen sharing scenarios. You can use this callback to determine whether the user granted Camera or Screen permission.

    * **Picture-in-Picture**

      This release introduces the Picture-in-Picture (PiP) feature, which supports displaying video call windows in PiP mode so users can continue watching video calls when switching apps or returning to the home screen.

      This feature supports automatically entering PiP mode and provides rich configuration options. On Android, you can configure parameters such as the aspect ratio, initial position, and seamless resizing of the PiP window. On iOS, you can configure the video stream layout (flow layout, with video streams arranged left to right and top to bottom), PiP window size, and system control button styles. The feature also supports listening to PiP state changes through `AgoraPipStateChangedObserver` to handle scenarios such as entering, exiting, or failure. This feature is suited for video calls, online education, live streaming, and other scenarios that require multitasking.

    * **Media Player support for getting audio buffer delay**

      To address synchronization issues between the main vocal and background accompaniment in karaoke scenarios, this release adds the `getAudioBufferDelay` method to the Media Player module. This method returns the millisecond-level audio buffer delay when playing media files.

    * **Advanced Beauty (Beta)**

      This release introduces a new advanced beauty feature with the following capabilities:

      * **Precision beauty effects**:
        * **Face shaping**: Supports independent fine-tuning of 29 facial areas (for example, face slimming, eye enlarging, and nose narrowing) or one-click natural results using presets.
        * **Style makeup options**: Eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
        * **Skin enhancements**: Teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.
      * **Unified API**: Manages all beauty, makeup, and filter functions through three core nodes (`BEAUTY`, `STYLE_MAKEUP`, and `FILTER`) using `IVideoEffectObject` for unified parameter configuration and lifecycle control.
      * **Ready-to-use presets**: Provides multiple style templates (for example, "Natural Beauty," "Senior Makeup," and "Cool White Filter") for immediate use.
      * **Dynamic parameter control**: Supports real-time reading and modifying of granular parameters (for example, smoothing strength and lipstick type) through key-value pairs, with support for saving custom configurations and resetting defaults.
      * **Local resource support**: All beauty resources, including effects, filters, and makeup assets, are packaged as local bundle files to ensure stability and reliability.

    * **Other new features**

      * Adds the `setPlaybackAudioFrameBeforeMixingParameters` method to set the audio frame format returned in the `onPlaybackAudioFrameBeforeMixing` callback, including sample rate, number of channels, and number of data samples per callback. After calling this method, the SDK returns the original pre-mix audio data according to the specified parameters.
      * Adds the `preloadEffectEx` method to preload sound effect files into specified channels, supporting both local and online files for use in multi-channel scenarios.
      * Adds the `playEffectEx` method to play sound effect files in specified channels with configurable parameters, including loop count, pitch, spatial position, volume, whether to publish to the channel, and playback start position.
      * The local screenshot upload feature now supports setting the video observation position for screenshots through the new `position` field in `ContentInspectModule`, enabling screenshots of original video data or video streams before or after effect processing.
      * Adds the `screenColorType` property to `SegmentationProperty` to improve portrait segmentation accuracy when using a green or blue screen for virtual backgrounds. You can specify the background color as green, blue, or set it to automatic recognition.

    #### Improvements [#improvements-121]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `preloadEffect` followed by `playEffect`, the SDK does not close the file after playback completes or when `stopEffect` is called. When you call `playEffect` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Window exclusion support for secondary displays**

      Before v4.6.2, configuring window exclusion (`excludeWindowList` in `ScreenCaptureParameters`) was not supported in multi-screen scenarios when sharing by screen ID (`startScreenCaptureByDisplayId`). This release adds support for this configuration.

      This release also adds `LocalVideoStreamReasonScreenCaptureExcludeWindowFailed` to `LocalVideoStreamReason` to report cases where window exclusion fails during screen sharing.

    * **Improved trigger timing of `onVideoDeviceStateChanged`**

      Before v4.6.2, the `onVideoDeviceStateChanged` callback could only be triggered after joining a channel. Starting from this release, you can receive this callback once after `IRtcEngine` initialization completes, and continue to receive it after joining a channel.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `onNetworkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `onPlaybackAudioFrame`. When calling `setPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`onEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `onEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Optimizes permission requests on Windows 11 24H2 and later to avoid unnecessary location data acquisition.
      * Adds support for G.711 and G.722 audio codecs when interoperating with Web clients, improving cross-platform audio compatibility and clarity.
      * Improves video clarity in screen sharing scenarios involving documents.
      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

    #### Issues fixed [#issues-fixed-127]

    This release fixes the following issues:

    * When playing multi-track songs with guide vocal enabled, noise occurred after calling `setAudioPitch` to adjust the pitch.
    * When a broadcaster created a custom audio capture track using `createCustomAudioTrack` with `trackType` set to `AudioTrackDirect`, pushed self-captured audio using `pushAudioFrame`, and then played sound effects using `playEffect`, the audience in the channel heard noise in the broadcaster's audio.
    * Apps integrated with the SDK occasionally experienced UI freezing due to main thread blocking during audio and video engagements.
    * When screen sharing was enabled with `enableHighLight` set to `true` in `ScreenCaptureParameters`, placing the shared window on top and maximizing it caused the local preview to flicker.
    * Apps sharing external screen video streams occasionally crashed after the external screen was disconnected.
    * When calling `openWithMediaSource` with `isLiveSource` set to `true` to play a pure video stream, playback failed.
    * Receivers occasionally heard noise when the sender transmitted multi-channel encoded audio.
    * When calling `open` twice to open different media resources, the `onPlayerInfoUpdated` callback returned information about the first resource when opening the second, which was incorrect.
    * When calling `enableAudioVolumeIndication` to enable volume indication for local streaming users and remote users, the local user volume returned by `onAudioVolumeIndication` was 0.
    * When using a 21:9 ultrawide display and setting a high resolution such as 3840×2160 for screen sharing, the shared image was cropped in both local preview and on the receiver side.
    * When calling `enableVideoImageSource` to enable placeholder streaming, the sender occasionally succeeded in publishing but `onVideoPublishStateChanged` reported the publish state as something other than `PublishStatePublished`, which was incorrect.
    * In multi-channel scenarios, when calling `setupRemoteVideoEx` to initialize remote user views before successfully joining with `joinChannelEx`, the first frame of remote user views occasionally had a large display delay.
    * After calling `open` to open an online sound effect file and `playEffect` to start playback, calling `seek` to set the playback position caused the file to play from the beginning instead of the specified position.
    * In media volume mode, when a broadcaster published microphone audio while simultaneously playing sound effects with `playEffect` and a music file with `startAudioMixing`, echo occasionally occurred.
    * After calling `joinChannelEx` to join a channel and `startOrUpdateChannelMediaRelay` to start cross-channel media relay, rejoining the channel after going offline and leaving occasionally caused `onChannelMediaRelayStateChanged` to report `state` as `RelayStateFailure` with `code` as `RelayErrorServerErrorResponse`.
    * On some laptop models with power-saving mode enabled, receivers occasionally heard echo when the sender shared screen and audio.
    * In online education scenarios, teachers occasionally observed audio and video out of sync for multiple students in the local view.
    * The second call to `enumerateVideoDevices` to retrieve the device list did not take effect.
    * On Windows 7 devices, when sharing a PowerPoint window running in full-screen auto-play mode with a large number of animations, the remote view occasionally flickered.

    ### v4.5.2 [#v452-5]

    v4.5.2 was released on March 13, 2025.

    <CalloutContainer type="info">
      <CalloutDescription>
        v4.5.2 for React Native is comparable to native version v.4.5.1.
      </CalloutDescription>
    </CalloutContainer>

    #### New features [#new-features-109]

    1. **AI conversation scenario**

       This version adds the `AudioScenarioAiClient` audio scenario specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on AI-generated voice characteristics, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. It enhances conversation continuity and reliability while adapting to complex network conditions.

    #### Improvements [#improvements-122]

    * Reduces the SDK initialization time on specific device models. (iOS)

    #### Issues fixed [#issues-fixed-128]

    This release fixes the following issues:

    * Apps that integrated the Agora SDK and set the `targetSdkVersion` to 34 encountered crashes when attempting to enable screen sharing for the first time on an Android 14 system. (Android)
    * When joining two or more channels simultaneously, and calling the `takeSnapshotEx` method to take screenshots of the local video streams in each channel consecutively, the screenshot of the first channel failed.
    * When using the `pause` method to pause playback, then calling `seek` to move to a specified position, and finally calling `play` to continue playback, the Media Player resumed from the position where it was paused, not the new specified position.
    * When using the Media Player, the file path of the media resource returned by the `getPlaySrc` did not change after calling the `switchSrc` method to switch to a new media resource.
    * When using Bluetooth headphones on specific device models for audio and video interactions, adjusting the phone volume would occasionally change the media volume instead of the Bluetooth volume. (Android)
    * During audio and video interactions, the local user occasionally experienced a black screen when watching the video streams of remote users. (Android)
    * On specific device models, after calling `setCameraExposureFactor` to set the exposure coefficient of the current camera at a specific angle of the device, the video screen occasionally became dark when the device was moved to another angle. (Android)
    * When playing a CDN live stream, the video occasionally froze for an extended period after recovering from an interruption. (Android)
    * When pushing video frames in i420 format to the channel, using CVPixelBuffer to handle these frames caused a crash. (iOS)
    * When two views are created before calling `enableFaceDetection` to start face detection, no face information can be detected in the subsequently passed views. (iOS)
    * In a screen sharing scenario, the receiving-end user saw a green line on the shared image. (iOS)
    * In the interactive live streaming scenario, after joining a channel to watch live streams using `string` user id, the audience members occasionally saw that the audio was not synchronized with the video.
    * Plugins sometimes did not work when using AI noise suppression and AI echo cancellation plugins at the same time.

    ### v4.5.0 [#v450-6]

    v4.5.0 was released on December 10, 2024.

    #### Compatibility changes [#compatibility-changes-67]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Changes in strong video noise suppression implementation**

       This version adjusts the implementation of strong video noise suppression. `VideoDenoiserLevelStrength` is removed from `VideoDenoiserLevel`. Instead, after enabling video noise suppression by calling `setVideoDenoiserOptions`, you can call the `setBeautyEffectOptions` method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, enable video noise suppression first and use specific settings as detailed in `setLowlightEnhanceOptions`.

    2. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`CompressionPreference`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_compressionpreference.html) enumeration class, a new `PreferCompressionAuto` (-1) enumeration is added, replacing the original `PreferQuality` (1) as the default value. In this mode, the SDK will automatically choose between `PreferLowLatency` and `PreferQuality` based on your video scene settings to achieve the best user experience.
       * In the [`DegradationPreference`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_degradationpreference.html) enumeration class, a new `MaintainAuto` (-1) enumeration is added, replacing the original `MaintainQuality` (1) as the default value. In this mode, the SDK will automatically choose between `MaintainFramerate`, `MaintainBalanced`, and `MaintainResolution` based on your video scene settings to achieve the optimal overall quality experience (QoE).

    #### New features [#new-features-110]

    1. **Live show scenario**

       This version adds the `ApplicationScenarioLiveshow`(3) (Live Show) enumeration to [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_videoapplicationscenariotype.html). You can call `setVideoScenario` to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency (no need to call `enableInstantMediaRendering`) to achieve better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the [`setLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (e.g., screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`setFilterEffectOptions`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (.cube) in the `config` parameter to achieve custom filter effects such as whitening, vivid, cool, black and white, etc. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file for quickly achieving a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the `startLocalAudioMixer` method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **External MediaProjection (Android)**

       This version introduces the [`setExternalMediaProjection`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaengine.html#api_irtcengine_setexternalmediaprojection) method, which allows you to set an external `MediaProjection` and replace the `MediaProjection` applied by the SDK.

       If you have the capability to apply for `MediaProjection` on your own, you can use this feature to achieve more flexible screen capture.

    6. **EGL context (Android)**

       This version introduces the [`setExternalRemoteEglContext`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaengine.html#api_irtcengine_setexternalremoteeglcontext) method, which is used to set the EGL context for rendering remote video streams. When using Texture format video data for remote video self-rendering, you can use this method to replace the SDK's default remote EGL context, achieving unified EGL context management.

    7. **Color space settings**

       This version adds the **colorSpace** parameter to `VideoFrame` and `ExternalVideoFrame`. You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    #### Improvements [#improvements-123]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`takeSnapshotWithConfig`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotWithConfigEx`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency.
       * Optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * After calling `enableLocalAudio` to disable local audio capture within the channel, the mute side button on the phone can be used to mute the background sound effects played by the app. (iOS)
       * When calling `switchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `onPlayerEvent` callback will report the `PlayerEventSwitchError` event, indicating an error occurred during media resource switching.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Issues fixed [#issues-fixed-129]

    This version fixes the following issues:

    * When the video source type of the sender is in JPEG format, the frame rate on the receiving end occasionally falls below expectations.
    * During audio and video interaction, after being interrupted by a system call, the user volume reported by the `onAudioVolumeIndication` callback was incorrect. (Android)
    * When the receiving end subscribes to the low-quality video stream by default and does not automatically subscribe to any video stream when joining the channel, calling `muteRemoteVideoStream(uid, false)` after joining the channel to resume receiving the video stream results in receiving the high-quality video stream. (Android)
    * Occasional instances where the receiving end cannot hear the sender during audio and video interaction. (iOS)
    * During audio and video interaction, if the sender's device system version is iOS 17, the receiving end occasionally cannot hear the sender. (iOS)
    * In live streaming use-cases, the time taken to reconnect to the live room after the audience end disconnects due to network switching is longer than expected. (iOS)
    * No sound when playing online media resources using the media player after the app starts. (iOS)
    * Occasional instances of no sound in audio capture after resuming from being interrupted by other system apps during audio and video interaction. (iOS)
    * Calling `startAudioMixing` and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.
    * Occasional crashes during audio and video interaction. (Android)

    ### v4.4.0 [#v440-6]

    v4.4.0 was released on August 29, 2024.

    #### Compatibility changes [#compatibility-changes-68]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see the table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onExtensionEvent`   | `onExtensionEventWithContext`   |
       | `onExtensionStarted` | `onExtensionStartedWithContext` |
       | `onExtensionStopped` | `onExtensionStoppedWithContext` |
       | `onExtensionError`   | `onExtensionErrorWithContext`   |

    2. This version renames the following members in `ExternalVideoFrame`:

       * `d3d11_texture_2d` is renamed to `d3d11Texture2d`.
       * `texture_slice_index` is renamed to `textureSliceIndex`.
       * `metadata_buffer` is renamed to `metadataBuffer`.
       * `metadata_size` is renamed to `metadataSize`.

    #### New features [#new-features-111]

    1. **Alpha transparency effects**

       This version introduces the Alpha transparency effects feature. It supports the transmission and rendering of Alpha channel data in video frames for SDK capture and custom capture use-cases, enabling transparent gift effects, custom backgrounds on the receiver end, and so on:

       * `VideoFrame` and `ExternalVideoFrame` add the `alphaBuffer` member, which sets the Alpha channel data.
       * `ExternalVideoFrame` adds the `fillAlphaBuffer` member, which sets whether to automatically extract the Alpha
         channel data and fill it into `alphaBuffer` for BGRA or RGBA formatted video data.
       * `VideoFrame` and `ExternalVideoFrame` add the `alphaStitchMode` member, which sets the relative position of `alphaBuffer` and video frame stitching.

       Additionally, `AdvanceOptions` adds a new member `encodeAlpha`, which is used to set whether to encode and send Alpha information to the remote end. By default, the SDK does not encode and send Alpha information; if you need to encode and send Alpha information to the remote end (for example, when virtual background is enabled), explicitly call `setVideoEncoderConfiguration` to set the video encoding properties and set `encodeAlpha` to `true`.

    2. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method. Pass in the sound effect types supported in the `VoiceAiTunerType` enum to achieve the effects such as a deep voice, cute voice, husky singing voice, and so on.

    3. **1v1 video call scenario**

       This version adds `ApplicationScenario1v1` (1v1 video call) in `VideoApplicationScenarioType`. You can call `setVideoScenario` to set the video application scenario to 1v1 video call. The SDK optimizes performance to achieve low latency and high video quality, enhancing image quality, first frame rendering, latency on mid-to-low-end devices, and smoothness under poor network conditions.

    #### Improvements [#improvements-124]

    1. **Adaptive hardware decoding support (Android)**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and effectively reducing system load.

    2. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    3. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
       * Adds the `channelId` parameter to `Metadata`, which is used to get the channel name from which the metadata is sent.
       * Deprecates redundant enumeration values `ClientRoleChangeFailedRequestTimeOut` and `ClientRoleChangeFailedConnectionFailed` in `ClientRoleChangeFailedReason`.

    #### Issues fixed [#issues-fixed-130]

    This release fixed the following issues:

    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time interaction (iOS).
    * Remote video occasionally froze or displayed corrupted images when the app returned to the foreground after being in the background for a while (iOS).
    * After the sender called `startDirectCdnStreaming` to start direct CDN streaming, frequent switching or toggling of the network occasionally resulted in a black screen on the receiver's end without a streaming failure callback on the sender's end (iOS).
    * Audio playback failed when pushing external audio data using `pushAudioFrame` and the sample rate was not set to a recommended value, such as 22050 Hz and 11025 Hz.

    ### v4.3.2 [#v432-5]

    v4.3.2 was released on June 6, 2024.

    #### Improvements [#improvements-125]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    #### Issues fixed [#issues-fixed-131]

    This version fixed the following issues:

    * The remote video froze or became pixelated when the app returned to the foreground after being in the background for a long time (iOS).
    * The local preview image rotated by 90° on some iPad devices, which did not meet expectations (iOS).
    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app crashed when opening the app and starting screen sharing after the first installation or system reboot (Android).
    * Local audio capture failed after joining a channel while answering a system phone call and hanging up, preventing remote users from hearing any sound (Android).
    * During the interaction process on certain devices (for example, Redmi Note8), after answering and hanging up a system call, local media files were played without sound and no sound was heard from the remote end (Android).
    * The app occasionally crashed when remote users left the channel.
    * When playing an audio file finished, the SDK sometimes failed to trigger the [onAudioMixingStateChanged](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onaudiomixingstatechanged) (`AudioMixingStateStopped`, `AudioMixingReasonAllLoopsCompleted`) callback that reports that the playing is completed (iOS).
    * When calling the [playEffect](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_playeffect3) method to play sound effect files shorter than 1 second with `loopCount` set to `0`, there was no sound (iOS).
    * When using the Agora media player to play a video and stopping it during playing, sometimes there was no sound for a short time after the playing was resumed (iOS).

    ### v4.3.1 [#v431-5]

    v4.3.1 was released on May 9, 2024.

    #### New features [#new-features-112]

    1. **Privacy manifest file (iOS)**

       To meet Apple's safety compliance requirements for app publication, the SDK now includes a privacy manifest file, `PrivacyInfo.xcprivacy`, detailing the SDK's API calls that access or use user data, along with a description of the types of data collected.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    If you need to publish an app with SDK versions prior to v4.3.1 to the Apple App Store, manually add the `PrivacyInfo.xcprivacy` file to your Xcode project.
    \:::

    1. **Portrait center stage (iOS)**

       To enhance the presentation effect in online meetings, shows, and online education use-cases, this version introduces the [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) method to activate portrait center stage. This ensures that presenters, regardless of movement, always remain centered in the video frame, achieving better presentation effects.

       Before enabling portrait center stage, it is recommended to verify whether your current device supports this feature by calling [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported). A list of supported devices can be found in the [API documentation](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage).

    2. **Camera stabilization (iOS)**

       To improve video stability in mobile filming, low-light environments, and hand-held shooting use-cases, this version introduces a camera stabilization feature. You can activate this feature and select an appropriate stabilization mode by calling [setCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizatio), achieving more stable and clearer video footage.

    3. **Wide and ultra-wide cameras (Android, iOS)**

       To allow users to capture a broader field of view and more complete scene content, this release introduces support for wide and ultra-wide cameras. You can first call [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) to check the device's focal length capabilities, and then call [setCameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setcameracapturerconfiguration) and set `cameraFocalLengthType` to the supported focal length types, including wide and ultra-wide.

    4. **Multi-camera capture (Android)**

       This release introduces additional functionalities for Android camera capture:

       1. Support for capturing and publishing video streams from the third and fourth cameras:

          * `VideoSourceCameraThird` (11) and `VideoSourceCameraFourth` (12) in [VideoSourceType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_videosourcetype.html) add support for Android, specifically for the third and fourth camera sources. This change allows you to specify up to four camera streams when initiating camera capture by calling [startCameraCapture](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/api_irtcengine_startcameracapture.html).
          * `publishThirdCameraTrack` and `publishFourthCameraTrack` in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_channelmediaoptions.html) add support for Android. Set these parameters to `true` when joining a channel with [joinChannel](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_joinchannel2) to publish video streams captured from the third and fourth cameras.

       2. Support for specifying cameras by camera ID:

          A new parameter `cameraId` is added to [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_cameracapturerconfiguration.html). For devices with multiple cameras, where `cameraDirection` cannot identify or access all available cameras, you can obtain the camera ID through Android's native system APIs and specify the desired camera by calling [startCameraCapture](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/api_irtcengine_startcameracapture.html) with the specific `cameraId`.

    5. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_encryptionconfig.html) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enableencryption). If there are issues causing failure in data stream encryption or decryption, these can be identified by the newly added `EncryptionErrorDatastreamDecryptionFailure` and `EncryptionErrorDatastreamEncryptionFailure` enumerations.

    6. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate the dual-stream mode and set up low-quality video streams on the sending side using [setDualStreamMode](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setdualstreammode2), the SDK defaults to the following behaviors:

       * The default encoding resolution for the low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the low-quality streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    7. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    8. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-126]

    1. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure (especially around the fingers) are more stable, significantly reducing flickering at the edges.

    2. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `EarMonitoringFilterReusePostProcessingFilter` in `EarMonitoringFilterType`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    3. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen-sharing use-cases to save system performance overhead (iOS).
       * Enhanced performance and stability of the local compositing feature, reducing its CPU usage (Android).
       * Enhanced media player capabilities to handle WebM format videos, including support for rendering Alpha channels.
       * In [AudioEffectPreset](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_audioeffectpreset.html), a new enumeration `RoomAcousticsChorus` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_remoteaudiostats.html), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending side to when the audio is played on the receiving side.

    #### Issues fixed [#issues-fixed-132]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * Hosts using certain models of devices in the speaker mode experienced occasional local audio capture failures when switching the app process to the background and then back to the foreground, preventing remote users from hearing the host's audio (Android).
    * On devices with Android 8.0, enabling screen sharing occasionally caused the app to crash (Android).
    * In use-cases using camera capture for local video, when the app was moved to the background and [disableVideo](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_disablevideo) or was called to stop video capture, camera capture was unexpectedly activated when the app was brought back to the foreground (Android).
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-70]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (iOS)
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (iOS)
    * [setCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode) (iOS)
    * [CameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_camerastabilizationmode.html) (iOS)
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [unregisterFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * The `publishLipSyncTrack` member in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_channelmediaoptions.html)
    * [MediaSourceType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_mediasourcetype.html) adds `SpeechDrivenVideoSource`
    * [VideoSourceType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_videosourcetype.html) adds `VideoSourceSpeechDriven`
    * [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [EncryptionErrorType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `EncryptionErrorDatastreamDecryptionFailure`
      * `EncryptionErrorDatastreamEncryptionFailure`
    * [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ErrorCodeType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_errorcodetype.html) adds `ErrDatastreamDecryptionFailed`
    * [AudioEffectPreset](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_audioeffectpreset.html) adds `RoomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) (Android, iOS)
    * [FocalLengthInfo](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_focallengthinfo.html) (Android, iOS)
    * [CameraFocalLengthType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_camerafocallengthtype.html) (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType` (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId` (Android)
    * [EarMonitoringFilterType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_earmonitoringfiltertype.html) adds a new enumeration `EarMonitoringFilterBuiltInAudioFilters`

    ### v4.3.0-build.1 [#v430-build1]

    v4.3.0-build.1 was released on March 19, 2024.

    #### Issues fixed [#issues-fixed-133]

    This release fixed the following issue:

    Directly calling `engine.release` to destroy the engine without prior call of `engine.unregisterEventHandler` to remove all callback events could lead to App crashes (Android).

    ### v4.3.0 [#v430-6]

    v4.3.0 was released on February 28, 2024.

    #### Compatibility changes [#compatibility-changes-69]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, you need to update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Please modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `onLocalAudioStateChanged`         | `error`                 | `reason`           |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`           |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `onRtmpStreamingStateChanged`      | `errCode`               | `reason`           |

       | Original enumeration class   | New enumeration class      |
       | ---------------------------- | -------------------------- |
       | `LocalAudioStreamError`      | `LocalAudioStreamReason`   |
       | `LocalVideoStreamError`      | `LocalVideoStreamReason`   |
       | `DirectCdnStreamingError`    | `DirectCdnStreamingReason` |
       | `MediaPlayerError`           | `MediaPlayerReason`        |
       | `RtmpStreamPublishErrorType` | `RtmpStreamPublishReason`  |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                          | Alternative methods and callbacks  |
       | ------------------------------------------------------ | ---------------------------------- |
       | `startChannelMediaRelay`,`updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | `startChannelMediaRelayEx`,`updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `onChannelMediaRelayEvent`                             | `onChannelMediaRelayStateChanged`  |

    3. **Audio route**

       Starting with this release, `RouteBluetooth` in [AudioRoute](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_audioroute.html) is renamed to `RouteBluetoothDeviceHFP`, representing a Bluetooth device using the HFP protocol. `RouteBluetoothDeviceA2DP`(10) is added to represent a Bluetooth device using the A2DP protocol.

    4. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [LocalVideoStreamReason](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_localvideostreamreason.html) class:

       * The value of `LocalVideoStreamReasonScreenCapturePaused` (formerly `LocalVideoStreamReasonScreenCapturePaused`) has been changed from 23 to 28.
       * The value of `LocalVideoStreamReasonScreenCaptureResumed` (formerly `LocalVideoStreamReasonScreenCaptureResumed`) has been changed from 24 to 29.
       * The `LocalVideoStreamReasonCodecNotSupport` enumeration has been changed to `LocalVideoStreamReasonCodecNotSupport`.

    #### New features [#new-features-113]

    1. **Custom mixed video layout on receiving end**

       To facilitate customized layout of mixed video stream at the receiver end, this release introduces the [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo) callback. When the receiver receives the channel's mixed video stream sent by the video mixing server, this callback is triggered, reporting the layout information of the mixed video stream and the layout information of each sub-video stream in the mixed stream. The receiver can set a separate `view` for rendering the sub-video stream (distinguished by `subviewUid`) in the mixed video stream when calling the method, achieving a custom video layout effect.

       When the layout of the sub-video streams in the mixed video stream changes, this callback will also be triggered to report the latest layout information in real time.

       Through this feature, the receiver end can flexibly adjust the local view layout. When applied in a multi-person video use-case, the receiving end only needs to receive and decode a mixed video stream, which can effectively reduce the CPU usage and network bandwidth when decoding multiple video streams on the receiving end.

    2. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Create the first view: Set the `position` parameter to `PositionPostCapturerOrigin` (introduced in this release) in `VideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Create the second view: Set the `position` parameter to `PositionPostCapturer` in `VideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    3. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
       method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    4. **Select different audio tracks for local playback and streaming**

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the [openWithMediaSource](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayer.html#api_imediaplayer_openwithmediasource) method and enable this function by setting the `enableMultiAudioTrack` parameter in [MediaSource](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_mediasource.html).

    5. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption): Sets fallback option for the subscribed video stream in weak network conditions.
       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onremotesubscribefallbacktoaudioonly): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * [setPlayerOptionInInt](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionInString](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption2): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-127]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [setInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setinearmonitoringvolume).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_ibasespatialaudioengine.html#api_ibasespatialaudioengine_setzones) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling the [ILocalSpatialAudioEngine](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) method.

    4. **Other Improvements**

       This release also includes the following improvements:

       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_playerplaybackstats.html).

    #### Issues fixed [#issues-fixed-134]

    This release fixed the following issue:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [onLocalVideoStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.

    #### API changes [#api-changes-71]

    **Added**

    * [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo)
    * [VideoLayout](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_videolayout.html)
    * The `subviewUid` member in [VideoCanvas](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_videocanvas.html)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [queryDeviceScore](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CustomVideoSource` enumeration in [MediaSourceType](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_mediasourcetype.html)
    * The `RouteBluetoothDeviceA2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/enum_audioroute.html)
    * [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_localaudiostats.html): Adds the `earMonitorDelay` and `aecEstimatedDelay`
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_playerplaybackstats.html)

    **Modified**

    * `routeBluetooth` is renamed as`RouteBluetoothDeviceHFP`
    * All `ERROR` fields in the following enumerations are changed to `REASON`:
      * `LocalAudioStreamErrorOk`
      * `LocalAudioStreamErrorFailure`
      * `LocalAudioStreamErrorDeviceNoPermission`
      * `LocalAudioStreamErrorDeviceBusy`
      * `LocalAudioStreamErrorRecordFailure`
      * `LocalAudioStreamErrorEncodeFailure`
      * `LocalVideoStreamErrorOk`
      * `LocalVideoStreamErrorFailure`
      * `LocalVideoStreamErrorDeviceNoPermission`
      * `LocalVideoStreamErrorDeviceBusy`
      * `LocalVideoStreamErrorCaptureFailure`
      * `LocalVideoStreamErrorCodecNotSupport`
      * `LocalVideoStreamErrorCaptureInbackground` (iOS)
      * `LocalVideoStreamErrorCaptureMultipleForegroundApps` (iOS)
      * `LocalVideoStreamErrorDeviceNotFound`
      * `LocalVideoStreamErrorDeviceDisconnected`
      * `LocalVideoStreamErrorDeviceInvalidId`
      * `DirectCdnStreamingErrorOk`
      * `DirectCdnStreamingErrorFailed`
      * `DirectCdnStreamingErrorAudioPublication`
      * `DirectCdnStreamingErrorVideoPublication`
      * `DirectCdnStreamingErrorNetConnect`
      * `DirectCdnStreamingErrorBadName`
      * `PlayerErrorNone`
      * `PlayerErrorInvalidArguments`
      * `PlayerErrorInternal`
      * `PlayerErrorNoResource`
      * `PlayerErrorInvalidMediaSource`
      * `PlayerErrorUnknownStreamType`
      * `PlayerErrorObjNotInitialized`
      * `PlayerErrorCodecNotSupported`
      * `PlayerErrorVideoRenderFailed`
      * `PlayerErrorInvalidState`
      * `PlayerErrorUrlNotFound`
      * `PlayerErrorInvalidConnectionState`
      * `PlayerErrorSrcBufferUnderflow`
      * `PlayerErrorInterrupted`
      * `PlayerErrorNotSupported`
      * `PlayerErrorTokenExpired`
      * `PlayerErrorUnknown`
      * `RtmpStreamPublishErrorOk`
      * `RtmpStreamPublishErrorInvalidArgument`
      * `RtmpStreamPublishErrorEncryptedStreamNotAllowed`
      * `RtmpStreamPublishErrorConnectionTimeout`
      * `RtmpStreamPublishErrorInternalServerError`
      * `RtmpStreamPublishErrorRtmpServerError`
      * `RtmpStreamPublishErrorTooOften`
      * `RtmpStreamPublishErrorReachLimit`
      * `RtmpStreamPublishErrorNotAuthorized`
      * `RtmpStreamPublishErrorStreamNotFound`
      * `RtmpStreamPublishErrorFormatNotSupported`
      * `RtmpStreamPublishErrorNotBroadcaster`
      * `RtmpStreamPublishErrorTranscodingNoMixStream`
      * `RtmpStreamPublishErrorNetDown`
      * `RtmpStreamPublishErrorInvalidPrivilege`
      * `RtmpStreamUnpublishErrorOk`

    **Deleted**

    * `startChannelMediaRelay`
    * `updateChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `ChannelMediaRelayEvent`

    ### v4.2.6 [#v426-5]

    v4.2.6 was released on November 24, 2023.

    #### Issues fixed [#issues-fixed-135]

    This release fixed the following issues:

    * Issues occurring when using Android 14:

      * When switching between portrait and landscape modes during screen sharing, the screen sharing process was interrupted. To restart screen sharing, users needed to confirm recording the screen in the pop-up window.
      * When integrating the SDK, setting the Android `targetSdkVersion` to 34 could cause screen sharing to be unavailable or even cause the app to crash.
      * Calling `startScreenCapture` without sharing video (setting `captureVideo` to `false`) and then calling `updateScreenCaptureParameters` to share video (setting `captureVideo` to `true`) resulted in a frozen shared screen on the receiving end.
      * When screen sharing in the landscape mode, the shared screen seen by the audience was divided into two parts: One side of the screen was compressed, the other side was black.

    * When using an iOS 16 or later device with Bluetooth headphones connected before joining the channel, the audio routing after joining the channel was not as expected: Audio was played from the speaker, not the Bluetooth headphones (iOS).

    * In live streaming use-cases, the video on the audience end was occasionally distorted (Android).

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v4.2.5 [#v425]

    v4.2.5 was released on October 31, 2023.

    #### Issues fixed [#issues-fixed-136]

    This release fixed an incorrect path in the `types` field in `package.json`, which caused the error `Could not find a declaration file for module 'react-native-agora'` when integrating the SDK into a TypeScript project.

    ### v4.2.4 [#v424-1]

    v4.2.4 was released on October 25, 2023.

    #### Issues fixed [#issues-fixed-137]

    This release fixes the following issue:

    The `AgoraRtcWrapper` version number in `CFBundleShortVersionString` on iOS is wrong, which interferes with submitting the App to the App Store.

    ### v4.2.3 [#v423-5]

    v4.2.3 was released on October 20, 2023.

    #### New features [#new-features-114]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version adds an optional parameter `serverConfig` in `ContentInspectConfig`. This parameter is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

    This version also introduces the `enableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **Check device support for advanced features**

       This version adds the `isFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `enableVirtualBackground` and `setBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperforming, the error code `-4: ErrNotSupported` is returned, indicating the device does not support the feature.

    3. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user ID. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can prevent repeated application of tokens every time users join a new channel, which reduces the pressure on your token server.

       <CalloutContainer type="info" />

    All 4.x SDKs support using wildcard tokens.
    \:::

    4. **Preloading channels**

       This release adds `preloadChannel` and `preloadChannelWithUserAccount` methods, which allow a user whose role is set as audience to preload channels before joining one. Calling the method can help shorten the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channel, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you join a new channel, thus saving the time for switching between channels.

    5. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `VideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    #### Improvements [#improvements-128]

    1. **Improved camera capture effect**

       This release has improved camera capture effect in the following aspects:

       1. Support for camera exposure adjustment

          This release adds `isCameraExposureSupported` to query whether the device supports exposure adjustment and `setCameraExposureFactor` to set the exposure ratio of the camera.

       2. Optimization of default camera selection on iOS

          Since this release, the default camera selection behavior of the SDK is aligned with that of the iOS system camera. If the device has multiple rear cameras, better shooting perspectives, zooming capabilities, low-light performance, and depth sensing can be achieved during video capture, thereby improving the quality of video capture.

    2. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

       This version reduces the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10%. Specific values may vary depending on the device model and platform.

    3. **Screen sharing use-case optimization**

       This release also optimizes the video encoding configuration in screen sharing use-cases. When users customize the `width` and `height` properties of the video, the SDK rounds down the actual encoding resolution while maintaining the aspect ratio of the video and the screen, ensuring that the final encoding resolution does not exceed the user-defined encoding resolution, thereby improving the accuracy of billing for screen sharing streams.

    4. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    5. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapInfo`. After successfully calling `queryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    **Other Improvements**

    This release includes the following additional improvements:

    * Optimizes the logic of handling invalid parameters. When you call the `setPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code `-2`, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crashing when an invalid token is passed in.
    * To improve the switching experience between multiple audio routes on Android, this release adds the `setRouteInCommunicationMode` method. This method can switch the audio route from a Bluetooth headphone to the earpiece, wired headphone or speaker in communication volume mode ([`MODE_IN_COMMUNICATION`](https://developer.android.google.cn/reference/kotlin/android/media/AudioManager?hl=en#mode_in_communication)).
    * The SDK automatically adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature prevents exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    * To help users understand the reasons for more types of remote video state changes, the `remoteVideoStateReasonCodecNotSupport` enumeration has been added to the `onRemoteVideoStateChanged` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-138]

    This release fixed the following issues:

    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `playEffect` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * Calling `takeSnapshotEx` once received the `onSnapshotTaken` callback for multiple times.
    * When the host called the `startAudioMixing` method to play music on Android, sometimes the host couldn't hear the music while the remote users could.
    * Occasional crashes on certain Android devices.
    * In channels joined by calling `joinChannelEx` exclusively on Android, calling `setEnableSpeakerphone` did not result in switching the audio route from the speaker to the headphone.
    * Occasionally, noise occurred when the local user listened to their own and remote audio after joining the channel on macOS.
    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `setBeautyEffectOptions`, `setLowlightEnhanceOptions`, `setVideoDenoiserOptions`, and `setColorEnhanceOptions` could not load extensions automatically.

    #### API changes [#api-changes-72]

    **Added**

    * `enableContentInspectEx`
    * `contentInspectImageModeration` in `ContentInspectType`
    * `serverConfig` in `ContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `FeatureType`
    * `setCameraExposureFactor`
    * `isCameraExposureSupported`
    * `preloadChannel`
    * `preloadChannelWithUserAccount`
    * `updatePreloadChannelToken`
    * `setRouteInCommunicationMode` (Android)
    * `CodecCapLevels`
    * `VideoCodecCapabilityLevel`
    * `backgroundColor` in `VideoCanvas`
    * `codecLevels` in `CodecCapInfo`
    * `remoteVideoStateReasonCodecNotSupport` in `RemoteVideoStateReason`

    ### v4.2.1 [#v421-7]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-129]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-139]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `setAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * Occasional crash after calling the `destroyMediaPlayer` method. (iOS)
    * In screen sharing use-cases, some Android devices experienced choppy video on the receiving end. (Android)

    ### v4.2.0 [#v420-7]

    v4.2.0 was released on May 29, 2023.

    #### Compatibility changes [#compatibility-changes-70]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture**

    This release optimizes the APIs for camera and screen capture function. As of v4.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter:

    | Deleted Methods               | Alternative Methods  |
    | :---------------------------- | :------------------- |
    | `startSecondaryCameraCapture` | `startCameraCapture` |
    | `stopSecondaryCameraCapture`  | `stopCameraCapture`  |

    **2. Video data acquisition**

    The `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.

    **3. Channel media options**

    * `publishCustomAudioTrackEnableAec` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishTrancodedVideoTrack` is renamed to `publishTranscodedVideoTrack`.
    * `publishCustomAudioSourceId` is renamed to `publishCustomAudioTrackId`.

    **4. Upgrade the default video encoding resolution**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    Call the `setVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **5. Miscellaneous**

    * `onApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * The `IAudioFrameObserver` class is renamed to `IAudioPcmFrameSink`, thus the prototype of the `onFrame` method is updated accordingly.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-115]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode to balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background feature. You can now set custom backgrounds of various types by calling the `enableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `setVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing scenarios, including:

    * Automatically activate multiple anti-weak network technologies to enhance the capability and performance of low-quality video streams in meeting use-cases where high bitrates are required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    This release adds the local video mixing feature. You can use the `startLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `updateLocalTranscoderConfiguration` method and the `onLocalVideoTranscoderError` callback. After enabling local video mixing, you can use the `updateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `onLocalVideoTranscoderError` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `getNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    **6. Instant frame rendering**

    This release adds the `enableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **7. Video rendering tracing**

    This release adds the `startMediaRenderingTracing` and `startMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `onVideoRenderingTracingResult` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks **Join Channel** button and then get the indicators in the video frame rendering process through the `onVideoRenderingTracingResult` callback. This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-130]

    **1. Voice changer**

    This release introduces the `setLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `setLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced screen share**

    This release adds the `queryScreenCaptureCapability` method, which is used to query the screen capture capabilities of the current device. To ensure optimal screen sharing performance, particularly in enabling high frame rates like 60 fps, Agora recommends you to query the device's maximum supported frame rate using this method beforehand.

    This release also adds the `setScreenCaptureScenario` method, which is used to set the scenario type for screen sharing. The SDK automatically adjusts the smoothness and clarity of the shared screen based on the scenario type you set.

    **3. Improved compatibility with audio file types (Android)**

    As of v4.2.0, you can use the following methods to open files with a URI starting with `content://` :

    * `startAudioMixing`
    * `playEffect`,
    * `openWithMediaSource`.

    **4. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `getCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **5. Multi-camera capture**

    This release introduces `startCameraCapture`. By calling this method multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras need to be connected.

    **6. Channel media relay**

    This release introduces `startOrUpdateChannleMediaRelay` and `startOrUpdateChannleMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **7. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `createCustomAudioTrack` and `destroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    **8. Video frame observer**

    As of this release, the SDK optimizes the `onRenderVideoFrame` callback, and the meaning of the return value is different depending on the video processing mode.

    When the video processing mode is `ProcessModeReadOnly`, the return value is reserved for future use.
    When the video processing mode is `ProcessModeReadWrite`, the SDK receives the video frame when the return value is `true`. The video frame is discarded when the return value is `false`.

    **9. Super resolution**

    To optimize the usability of super resolution, this release removes `enableRemoteSuperResolution`. Super resolution no longer needs to be enabled manually. The SDK now automatically optimizes the resolution of the remote video based on the performance of the user's device.

    #### Issues fixed [#issues-fixed-140]

    This release fixed the following issues:

    * Occasional crashes occurred on Android devices when users joined or left a channel (Android).
    * When the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.
    * Occasional failure when enabling in-ear monitoring (Android).
    * Occasional loss of the `firstRemoteVideoFrameOfUid` callback during channel media relay (iOS).
    * The receiver actively subscribed to the high-quality stream but unexpectedly received a low-quality stream (iOS).
    * Occasional echo (Android).
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback.
    * Playing audio files with a sample rate of 48 kHz failed.
    * Crashes occurred after users set the video resolution to 3840 × 2160 and started CDN streaming on Xiaomi Redmi 9A devices (Android).
    * In real-time chorus use-cases, remote users heard noises and echoes when an OPPO R11 device joined the channel in the loudspeaker mode (Android).
    * When the playback of the local music finished, the `onAudioMixingFinished` callback was not properly triggered (Android).
    * When using a video frame observer, the first video frame was occasionally missed on the receiver's end (Android).
    * When sharing screens in use-cases involving multiple channels, remote users occasionally saw black screens (Android).
    * Switching to the rear camera with the virtual background enabled occasionally caused the background to be inverted (Android).
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.

    #### API changes [#api-changes-73]

    **Added**

    * `startCameraCapture`
    * `stopCameraCapture`
    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setVideoScenario`
    * `getCurrentMonotonicTimeInMs`
    * `onLocalVideoTranscoderError`
    * `startLocalVideoTranscoder`
    * `updateLocalTranscoderConfiguration`
    * `queryScreenCaptureCapability`
    * `setScreenCaptureScenario`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioAinsMode`
    * `AudioTrackType`
    * `VideoApplicationScenarioType`
    * `ScreenCaptureFramerateCapability`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * The `sourceType` parameter in `onCaptureVideoFrame` and `onPreEncodeVideoFrame` callbacks
    * The `BackgourndNone` and `BackgroundVideo` enumerators in `BackgroundSourceType`

    **Deprecated**

    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `onChannelMediaRelayEvent`
    * `ChannelMediaRelayEvent`

    **Deleted**

    * `onApiCallExecuted`
    * `publishCustomAudioTrackEnableAec` in `ChannelMediaOptions`

    ### v4.1.0 [#v410-7]

    v4.1.0 was released on December 20, 2022.

    #### Compatibility changes [#compatibility-changes-71]

    This release deletes the `sourceType` parameter in `enableDualStreamMode`, because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK; you no longer need to specify the video source type.

    #### New features [#new-features-116]

    **1. In-ear monitoring**

    This release adds support for in-ear monitoring. You can call `enableInEarMonitoring` to enable the in-ear monitoring function.

    To adjust the in-ear monitoring volume, you can call `setInEarMonitoringVolume`.

    **2. Audio capture device test (Android)**

    This release adds support for testing local audio capture devices before joining a channel. You can call `startRecordingDeviceTest` to start the audio capture device test. After the test is complete, call the `stopPlaybackDeviceTest` method to stop the audio capture device test.

    **3. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `getNetworkType` method. You can use this method to get the type of network connection in use. The available values are `UNKNOWN`, `DISCONNECTED`, `LAN`, `WIFI`, `2G`, `3G`, `4G`, and `5G`. When the local network connection type changes, the SDK triggers the `onNetworkTypeChanged` callback to report the current network connection type.

    **4. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports the three audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Agora also supports publishers in choosing whether the audio streams being published are to be filtered based on volume. Streams that are not filtered bypass this filter mechanism and are transported directly to the receivers. In use-cases with a number of publishers, enabling this function helps reduce the bandwidth and device system pressure for the receivers.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this function, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **5. Dual-stream mode**

    This release optimizes the dual-stream mode. You can call `enableDualStreamMode` and `enableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing to a low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams). Follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `setRemoteVideoStreamType` or `setRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify this default behavior, you can call `setDualStreamMode` and set the `mode` parameter to `disableSimulcastStream` (never send low-quality video streams) or `enableSimulcastStream` (always send low-quality video streams).

    **6. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense-of-presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `setZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user by calling `setPlayerAttenuation` and `setRemoteAudioAttenuation` respectively, and specify whether to use that setting to force an override of the sound attenuation parameter in `setZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`. The receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `setHeadphoneEQPreset` method to improve the audio experience for users with headphones. If you cannot achieve the expected headphone EQ effect after calling `setHeadphoneEQPreset`, you can call `setHeadphoneEQParameters` to adjust the EQ.

    **7. Multiple cameras for video capture (iOS)**

    This release supports multi-camera video capture. You can call `enableMultiCamera` to enable multi-camera capture mode, call `startSecondaryCameraCapture` to start capturing video from the second camera, and then publish the captured video to the second channel.

    To stop using multi-camera capture, you need to call `stopSecondaryCameraCapture` to stop the second camera capture, then call `enableMultiCamera` and set `enabled` to `false`.

    **8. Encoded video frame observer**

    This release adds the `setRemoteVideoSubscriptionOptions` and `setRemoteVideoSubscriptionOptionsEx` methods. When you call the `registerVideoEncodedFrameObserver` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see the [API reference](https://api-ref.agora.io/en/video-sdk/react-native/4.x/API/class_imediaengine.html#api_imediaengine_registervideoencodedframeobserver).

    **9. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this feature, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **10. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `CameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `setVideoEncoderConfiguration` when capturing video with the camera.

    **11. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `muteLocalAudioStreamEx` and `muteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` and `muteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `startRtmpStreamWithoutTranscodingEx`, `startRtmpStreamWithTranscodingEx`, `updateRtmpTranscodingEx`, and `stopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `startChannelMediaRelayEx`, `updateChannelMediaRelayEx`, `pauseAllChannelMediaRelayEx`, `resumeAllChannelMediaRelayEx`, and `stopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * The `options` parameter in the `leaveChannelEx` method, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **12. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advanceOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `CompressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `EncodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **13. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `onClientRoleChanged` callback. The value of this parameter is as follows:

    * `AudienceLatencyLevelLowLatency (1)`: Low latency.
    * `AudienceLatencyLevelUltraLowLatency (2)`: Ultra-low latency.

    **14. Brand-new AI Noise Suppression**

    The SDK supports a new version of AI noise reduction (in comparison to the basic AI noise reduction in v4.0.0). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option.

    To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    #### Improvements [#improvements-131]

    **1. Video information change callback**

    This release optimizes the trigger logic of `onVideoSizeChanged`, which can also be triggered and report the local video size change when `startPreview` is called separately.

    **2. Bluetooth permissions (Android)**

    To simplify integration, as of this release, you can use the SDK to enable Android users to use Bluetooth normally without adding the `BLUETOOTH_CONNECT` permission.

    **3. Relaying media streams across channels**

    This release optimizes the `updateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `RelayEventPacketUpdateDestChannelRefused (8)`, and you need to call the `updateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **4. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **5. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `audioScenarioMeeting` scenario.
    * Improves the smoothness of SDK video rendering.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network use-cases.

    #### Issues fixed [#issues-fixed-141]

    This release fixed the following issues:

    **All**

    * When calling `setVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.
    * When using the Agora media player to play videos, after you played and paused the video, and then called the `seek` method to specify a new position for playback, the video image occasionally remained unchanged; if you called the `resume` method to resume playback, the video was sometimes played at a speed faster than the original one.
    * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.
    * The call `getExtensionProperty` failed and returned an empty string.
    * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.

    **Android**

    * In online meeting use-cases, the local user and the remote user occasionally could not hear each other after the local user was interrupted by a call.
    * After calling `setCloudProxy` to set the cloud proxy, calling `joinChannelEx` to join multiple channels failed.

    **iOS**

    * Calling `startAudioMixing` to play music files in the ipod-library://item path failed.
    * Different timestamps for audio and video data were obtained simultaneously and separately via `onRecordAudioFrame` and `onCaptureVideoFrame` callbacks.

    #### API changes [#api-changes-74]

    **Added**

    * `getNativeHandle`
    * `getMusicContentCenter`
    * `getPlaybackDefaultDevice`
    * `getRecordingDefaultDevice`
    * `enableDualStreamModeEx`
    * `setDualStreamMode`
    * `setDualStreamModeEx`
    * `SimulcastStreamMode`
    * `getNetworkType`
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `setHeadphoneEQPreset`
    * `setHeadphoneEQParameters`
    * `HeadphoneEqualizerPreset`
    * `enableMultiCamera` (iOS)
    * `setRemoteVideoSubscriptionOptions`
    * `setRemoteVideoSubscriptionOptionsEx`
    * `VideoSubscriptionOptions`
    * `AdvancedOptions`
    * `EncodingPreference`
    * `CompressionPreference`
    * `adjustUserPlaybackSignalVolumeEx`
    * `onRhythmPlayerStateChanged`
    * `RhythmPlayerStateType`
    * `RhythmPlayerErrorType`
    * `enableAudioVolumeIndicationEx`
    * `muteLocalAudioStreamEx`
    * `muteLocalVideoStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `muteAllRemoteVideoStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`

    **Modified**

    * Adds `isAudioFilterable` in `ChannelMediaOptions`
    * Adds `enable_doppler` in `SpatialAudioParams`
    * Adds `minimizeWindow` in `ScreenCaptureSourceInfo`
    * Adds `followEncodeDimensionRatio` in `CameraCapturerConfiguration`
    * Adds `options` in `leaveChannelEx`
    * Adds `advanceOptions` in `VideoEncoderConfiguration`
    * Adds `newRoleOptions` in `onClientRoleChanged`
    * Adds `setupMode`, `mediaPlayerId`, and `cropArea` in `VideoCanvas`
    * Adds `hwEncoderAccelerating` in `LocalVideoStats`
    * Removes `sourceType` in `enableDualStreamMode`

    **Deprecated**

    * `onApiCallExecuted`: Use the callbacks triggered by specific methods instead.
    * `RelayEventPacketUpdateDestChannelRefused (8)` in `ChannelMediaRelayEvent`

    ### v4.0.0 [#v400-7]

    v4.0.0 was released on September 29, 2022.

    #### Compatibility changes [#compatibility-changes-72]

    **Integration change**

    This release has changed the SDK package name from `react-native-agora-rtc-ng` to `react-native-agora`, and optimized the implementation of some features, resulting in incompatibility with v4.0.0. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migration guide](/en/realtime-media/video/reference/migration-guide).

    #### New features [#new-features-117]

    **1. Multiple media tracks**

    This release supports one `IRtcEngine` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `RtcEngineEx` and `ChannelMediaOptions.`

    * After calling `joinChannel` to join the first channel, call `joinChannelEx` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `ChannelMediaOptions` settings.
    * You can simultaneously publish multiple sets of video streams captured by multiple cameras or screen sharing by setting `publishSecondaryCameraTrack` and `publishSecondaryScreenTrack` in `ChannelMediaOptions`.

    This release adds `createCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured video in the channel:

    1. Create a custom video track: Call this method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `ChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `pushVideoFrame`, and specify `videoTrackId` as the ID of the custom video track in step 2 in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Full HD and Ultra HD resolution (Beta)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capture, encoding, decoding and rendering, and now supports 4K resolution. The improved FEC (Forward Error Correction) algorithm enables adaptive switches according to the frame rate and number of video frame packets, which further reduces the video stuttering rate in 4K scenes.

    Additionally, you can set the encoding resolution to 4K (3840 × 2160) and the frame rate to 60 fps when calling `SetVideoEncoderConfiguration`. The SDK supports automatic fallback to the appropriate resolution and frame rate if your device does not support 4K.

    The UHD resolution (4K, 60 fps) is currently in beta and requires certain device performance and network bandwidth. If you want to enable this feature, contact [technical support](mailto\:support@agora.io).

    High resolution typically means higher performance consumption. To avoid a decrease in experience due to insufficient device performance, Agora recommends that you enable FHD and UHD video resolutions on devices with better performance.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. After calling the `createMediaPlayer` method to create a media player object, you can then call the methods in the `IMediaPlayer` class to experience a series of functions, such as playing local and online media files, preloading a media file, changing the CDN route for playing according to your network conditions, or sharing the audio and video streams being played with remote users.

    * Plays local and online media files.
    * Preloads media files.
    * Changes the CDN route for playing media files according your network conditions.
    * Shares the audio and video streams being played with remote users.
    * Caches data when playing media files.

    **4. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `UltraHighQualityVoice` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `setVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **5. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AudioScenarioChorus` enumeration in `AudioScenarioType`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **6. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `ChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `ChannelMediaOptions` when calling `joinChannel` or `joinChannelEx` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `updateChannelMediaOptions` to update the settings in `ChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **7. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function in the following ways.

    * Call the `StartScreenCaptureByDisplayId` method before joining a channel, and then call `JoinChannel` \[2/2] to join a channel and set `publishScreenTrack` or `publishSecondaryScreenTrack` as true.
    * Call the `StartScreenCaptureByDisplayId` method after joining a channel, and then call `UpdateChannelMediaOptions` to set `publishScreenTrack` or `publishSecondaryScreenTrack` as true.

    **8. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add a user ID that you want to subscribe to in your allowlist, or add a user ID for the streams you do not wish to see to your blocklists. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `IRtcEngineEx` interface:

    * `SetSubscribeAudioBlocklist`：Set the audio subscription blocklist.
    * `SetSubscribeAudioAllowlist`：Set the audio subscription allowlist.
    * `SetSubscribeVideoBlocklist`：Set the video subscription blocklist.
    * `SetSubscribeVideoAllowlist`：Set the video subscription allowlist.

    If a user is added in a blocklist and a allowlist at the same time, only the blocklist takes effect.

    **9. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `SetAudioScenario` method. For example, if you want to change the audio scenario from `AudioScenarioDefault` to `AudioScenarioGameStreaming` when you are in a channel, you can call this method.

    **10. Replace video feeds with images**

    This release supports replacing video feeds with images when publishing video streams. You can call the `enableVideoImageSource` method to enable this function and choose your own images through the `options` parameter. If you disable this function, the remote users see the video feeds that you publish.

    **11. Spatial audio**

    > ***NOTE:*** This feature is in experimental status. To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `updateSelfPosition` and `updateRemotePosition` to update the spatial coordinates of the local and remote users, respectively, so that the local user can hear the spatial audio effect of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    You can also set the spatial audio for the media player as following:

    * Local Cartesian Coordinate System Calculation: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio. You need to call `updateSelfPosition` and `updatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    #### Improvements [#improvements-132]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v4.0.0 through the `LeaveChannel` and `JoinChannel `methods so that you don't need to take the time to call the `SwitchChannel `method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `pushVideoFrame`\[1/2] method to push such video frames to the SDK.

    **3. Voice pitch of the local user**
    This release adds `voicePitch` in `AudioVolumeInfo` of `onAudioVolumeIndication`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **4. Video preview**

    This release improves the implementation logic of `startPreview`. You can call the `startPreview `method to enable video preview at any time.

    **5. Video types of subscription**

    You can call the `setRemoteDefaultVideoStreamType` method to choose the video stream type when subscribing to streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="javascript">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="javascript" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-8]

    ### v2.5.1 [#v251]

    Released on December 18, 2025.

    This release includes the following changes:

    * Updates the built-in Web SDK to v4.24.1. For details on the changes between Web SDK v4.24.0 to v4.24.1, see the [Web SDK release notes](/en/realtime-media/video/reference?platform=web).

    ### v2.5.0 [#v250]

    Released on September 1, 2025.

    This release includes the following changes:

    * Updates the built-in Web SDK to v4.24.0. For details on the changes between Web SDK v4.23.2 to v4.24.0, see the [Web SDK release notes](/en/realtime-media/video/reference?platform=web).

    ### v2.4.0 [#v240]

    Released on March 19, 2025.

    This release includes the following changes:

    * Internal optimizations to support [Agora Conversational AI Engine](/en/introduction/conversational-ai).
    * Updates the built-in Web SDK to v4.23.2. For details on the changes between Web SDK v4.22.0 to v4.23.2, see the [Web SDK release notes](/en/realtime-media/video/reference?platform=web).
    * Fixes an issue where network state changes could unexpectedly create new tracks.

    ### v2.3.0 [#v230]

    Released on August 21, 2024.

    This version updates the built-in Web SDK to v4.22.0. For more details on the changes between Web SDK v4.21.0 and 4.22
    .0, see the [Web SDK release notes](/en/realtime-media/video/reference?platform=web).

    ### v2.2.0 [#v220]

    Released on June 13, 2024.

    This version updates the built-in Web SDK to v4.21.0. For more details on the changes between Web SDK v4.20.0 and 4.21.0, see the [Web SDK release notes](/en/realtime-media/video/reference?platform=web).

    ### v2.1.0 [#v210]

    Released on January 5, 2024.

    This version updates the built-in SDK for Web in the SDK for React JS to version 4.20.0. Check the related changes in the [Web SDK release notes](/en/realtime-media/video/reference?platform=web).

    ### v2.0.0 [#v200]

    Released on December 22, 2023.

    #### Compatibility changes [#compatibility-changes-73]

    **SDK structural optimization**

    The SDK for ReactJS is developed based on the SDK for Web v4.x. To further enhance usability, this version incorporates all Web SDK APIs into the ReactJS SDK, eliminating the need to integrate the Web SDK separately.

    Upon upgrading to this version, make the following modifications:

    * Reintegrate the React SDK. Taking npm as an example:

      ```sh
      # Remove existing dependencies
      npm uninstall agora-rtc-react agora-rtc-sdk-ng
      # Reinstall dependencies
      npm install agora-rtc-react
      ```

    * Adjust the import of the `AgoraRTC` interface from the Web SDK. Taking the combined import of `AgoraRTC` and `AgoraRTCProvider` as an example:

      ```tsx
      // Before this version
      import AgoraRTC from "agora-rtc-sdk-ng";
      import { AgoraRTCProvider } from "agora-rtc-react";
      // As of this version
      import AgoraRTC, { AgoraRTCProvider } from "agora-rtc-react"
      ```

    **NetworkQuality renaming**

    To avoid redundancy with the Web SDK's API, this version makes the following changes to the ReactJS SDK's `NetworkQuality` interface:

    * Rename `NetworkQuality` to `NetworkQualityEx` and have `NetworkQualityEx` inherit the `NetworkQuality` interface from the Web SDK.
    * Rename the `uplink` and `downlink` properties to `uplinkNetworkQuality` and `downlinkNetworkQuality`, respectively.

    If you use the `NetworkQuality` interface from the ReactJS SDK, make the necessary code modifications after upgrading to this version.

    #### Improvements [#improvements-133]

    This version adds the `cameraVideoTrackConfig` parameter to `useLocalCameraTrack`, enabling you to set video capture configurations such as capture devices and encoder when creating a camera video track.

    #### Issues fixed [#issues-fixed-142]

    This version fixed the issue that the SDK threw the error `CAN_NOT_PUBLISH_MULTIPLE_VIDEO_TRACKS` in Firefox's developer mode.

    #### API Changes [#api-changes-75]

    **Added**

    * `cameraVideoTrackConfig` to `useLocalCameraTrack`

    **Modified**

    * `NetworkQuality` to `NetworkQualityEx`
      * `uplink`  to `uplinkNetworkQuality`
      * `downlink` to `downlinkNetworkQuality`

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="unity">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="unity" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-9]

    ### Known issues [#known-issues-8]

    ### v4.6.2 [#v462-7]

    Released on March 14, 2026.

    #### Compatibility changes [#compatibility-changes-74]

    This release introduces the following compatibility changes:

    * **Deprecation of Direct CDN streaming APIs**

      The following APIs related to Direct CDN streaming are deprecated in this release and will be removed in a future version. Use [Media Push](/en/realtime-media/media-push/get-started/enable-media-push) instead.

      * `SetDirectCdnStreamingAudioConfiguration`
      * `SetDirectCdnStreamingVideoConfiguration`
      * `StartDirectCdnStreaming`
      * `StopDirectCdnStreaming`
      * `DirectCdnStreamingMediaOptions`
      * `DirectCdnStreamingStats`
      * `DIRECT_CDN_STREAMING_STATE`
      * `DIRECT_CDN_STREAMING_REASON`

    * **Deprecation of virtual metronome APIs**

      The following APIs related to the virtual metronome feature are deprecated in this release and will be removed in a future version.

      * `StartRhythmPlayer`
      * `ConfigRhythmPlayer`
      * `OnRhythmPlayerStateChanged`

    * **Deprecation of watermark APIs**

      The following watermark APIs are deprecated in this release. Use the new watermark APIs introduced in this release instead.

      * `AddVideoWatermark` \[2/3]
      * `AddVideoWatermarkEx` \[1/2]

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `SetLocalPublishFallbackOption`
      * `OnLocalPublishFallbackToAudioOnly`
      * `OnDownlinkNetworkInfoUpdated`
      * `OnWlAccStats`
      * `EnableWirelessAccelerate`

    * **Changes to makeup feature implementation**

      Due to the beauty effect refactoring in this release, calling `SetExtensionProperty` to enable the makeup feature is no longer supported starting from v4.6.2. Use the `STYLE_MAKEUP` node instead.

    * **Behavior changes in dual-stream mode**

      Before v4.6.2, when the sender enabled adaptive low-stream mode (`AUTO_SIMULCAST_STREAM`), the low stream was not sent proactively. The sender only started sending the low stream after receiving a request from a host-role receiver calling `SetRemoteVideoStreamType`. Starting from v4.6.2, when the sender enables adaptive low-stream mode, the SDK automatically decides whether to send or stop sending the low stream based on the downlink network quality of subscribing users. If you set `mode` to another sending mode or explicitly configure the width, height, bitrate, or frame rate of the low stream, this adaptive behavior is disabled.

    * **New domains required for domain whitelist**

      If you upgrade from a previous version and use the domain whitelist feature (`domainLimit` in `RtcEngineConfig` set to `true`), add the following domains to ensure uninterrupted communication:

      * `*.rtnsvc.com`
      * `*.realtimemesh.com`

    * **Removal of `uid` from `EncodedVideoFrameInfo` struct**

      The `uid` parameter is removed from the `EncodedVideoFrameInfo` struct. You can retrieve `uid` information directly from the `OnEncodedVideoFrameReceived` callback. Update your integration logic accordingly.

    #### New features [#new-features-118]

    Included in this release:

    * **Multi-resolution video streams**

      This release introduces the Adaptive Bitrate Video Streaming (ABR) feature, which supports sending multiple video streams at different resolutions from the same video source simultaneously, including in multi-channel scenarios. Receivers can automatically or manually subscribe to streams at their preferred resolution.

      After enabling ABR, you can configure up to four video stream layers (one main stream at the highest resolution and up to three lower-resolution streams), and set options such as resolution, bitrate, and layered streaming fallback. When layered streaming fallback is enabled, the SDK automatically switches to lower-resolution streams under poor network conditions to maintain a smooth viewing experience. This feature is suited for meetings, large classes, interactive live streaming, and other multi-device or multi-network environments.

    * **Multi-path network transmission**

      This release introduces multi-path transmission for devices that support multiple network interfaces (such as 5G, Wi-Fi, and LAN). This feature reduces or eliminates experience degradation caused by poor network conditions, making it suitable for real-time audio and video communication in challenging environments such as vehicles, IoT devices, trains, and highways.

      Enable multi-path transmission by setting `enableMultipath` to `true` in `ChannelMediaOptions`. Two transmission modes are supported through `MultipathMode`:

      * **Dynamic mode** (default): Dynamically selects the best available path based on network conditions. Suited for traffic-sensitive scenarios with high experience requirements, such as meetings and online education. In this mode, you can specify the preferred network path (for example, Wi-Fi or mobile network) using `preferMultipathType`.
      * **Full redundancy mode**: Transmits data simultaneously on all available network paths. Suited for scenarios that are not traffic-sensitive but require extreme reliability, such as outdoor broadcasting and parallel control. This mode incurs additional costs. [Contact technical support](mailto\:support@agora.io) to enable it.

      Uplink and downlink paths can also be configured separately using `uplinkMultipathMode` and `downlinkMultipathMode` in `ChannelMediaOptions`. Once enabled, the SDK reports real-time transmission statistics for each path through the `onMultipathStats` callback, including per-path traffic consumption.

    * **Video quality scoring**

      This release adds the `mosValue` field to `RemoteVideoStats`, reporting the quality score of the received remote video stream as evaluated by the Agora real-time video MOS (Mean Opinion Score) system. Scores range from 1 to 5, where 5 indicates excellent video quality and 1 indicates extremely poor quality. Use this field to monitor subjective video quality in real time, adjust video parameters dynamically, or integrate into quality monitoring and alerting workflows. [Contact technical support](mailto\:support@agora.io) to enable this feature.

    * **Support for adding multiple watermarks**

      This release deprecates `AddVideoWatermark` \[2/3] and `AddVideoWatermarkEx` \[1/2], and introduces `AddVideoWatermarkWithConfig` \[3/3] and `AddVideoWatermarkWithConfigEx` \[2/2], which support adding multiple watermarks to a video using watermark IDs and controlling their display order. To remove a specific watermark, call `RemoveVideoWatermark`.

    * **Token renewal result callback**

      This release introduces the `onRenewTokenResult` callback and the `RENEW_TOKEN_ERROR_CODE` error code enum. After calling `renewToken` to update the token, the SDK reports the result through `onRenewTokenResult` and returns detailed error codes defined in `RENEW_TOKEN_ERROR_CODE`, allowing you to handle token renewal failure scenarios accordingly.

    * **App-level screen sharing support on Android**

      Starting from Android 14, the system allows users to choose between sharing the full screen or a single app during screen sharing, enhancing privacy and multitasking. This release adds support for sharing a single app in addition to full-screen sharing. The new `OnLocalVideoEvent` callback reports local video events, especially those related to screen sharing.

    * **New permission granted callback on Android**

      The `OnPermissionGranted` callback helps confirm permission status in screen sharing scenarios. You can use this callback to determine whether the user granted Camera or Screen permission.

    * **Media Player support for getting audio buffer delay**

      To address synchronization issues between the main vocal and background accompaniment in karaoke scenarios, this release adds the `GetAudioBufferDelay` method to the Media Player module. This method returns the millisecond-level audio buffer delay when playing media files.

    * **Advanced Beauty (Beta)**

      This release introduces a new advanced beauty feature with the following capabilities:

      * **Precision beauty effects**:
        * **Face shaping**: Supports independent fine-tuning of 29 facial areas (for example, face slimming, eye enlarging, and nose narrowing) or one-click natural results using presets.
        * **Style makeup options**: Eyeshadow, colored contacts, eyeliner, eyebrow shaping, lipstick, blush, under-eye highlights, and facial contouring.
        * **Skin enhancements**: Teeth whitening, nasolabial fold removal, dark circle reduction, and eye brightening.
      * **Unified API**: Manages all beauty, makeup, and filter functions through three core nodes (`BEAUTY`, `STYLE_MAKEUP`, and `FILTER`) using `IVideoEffectObject` for unified parameter configuration and lifecycle control.
      * **Ready-to-use presets**: Provides multiple style templates (for example, "Natural Beauty," "Senior Makeup," and "Cool White Filter") for immediate use.
      * **Dynamic parameter control**: Supports real-time reading and modifying of granular parameters (for example, smoothing strength and lipstick type) through key-value pairs, with support for saving custom configurations and resetting defaults.
      * **Local resource support**: All beauty resources, including effects, filters, and makeup assets, are packaged as local bundle files to ensure stability and reliability.

    * **Other new features**

      * Adds the `SetPlaybackAudioFrameBeforeMixingParameters` method to set the audio frame format returned in the `OnPlaybackAudioFrameBeforeMixing` callback, including sample rate, number of channels, and number of data samples per callback. After calling this method, the SDK returns the original pre-mix audio data according to the specified parameters.
      * Adds the `PreloadEffectEx` method to preload sound effect files into specified channels, supporting both local and online files for use in multi-channel scenarios.
      * Adds the `PlayEffectEx` method to play sound effect files in specified channels with configurable parameters, including loop count, pitch, spatial position, volume, whether to publish to the channel, and playback start position.
      * The local screenshot upload feature now supports setting the video observation position for screenshots through the new `position` field in `ContentInspectModule`, enabling screenshots of original video data or video streams before or after effect processing.
      * Adds the `screenColorType` property to `SegmentationProperty` to improve portrait segmentation accuracy when using a green or blue screen for virtual backgrounds. You can specify the background color as green, blue, or set it to automatic recognition.

    #### Improvements [#improvements-134]

    This release includes the following enhancements:

    * **Seamless switching for sound effect files**

      Adds support for seamless switching of sound effect files. For the same sound effect file, if you call `PreloadEffectEx` followed by `PlayEffectEx`, the SDK does not close the file after playback completes or when `StopEffect` is called. When you call `PlayEffectEx` again, the SDK reuses the loaded file to enable loop playback and seamless switching. This feature also works in multi-channel scenarios.

    * **Window exclusion support for secondary displays**

      Before v4.6.2, configuring window exclusion (`excludeWindowList` in `ScreenCaptureParameters`) was not supported in multi-screen scenarios when sharing by screen ID (`StartScreenCaptureByDisplayId`). This release adds support for this configuration.

      This release also adds a new member to `LOCAL_VIDEO_STREAM_REASON` to report cases where window exclusion fails during screen sharing.

    * **Improved trigger timing of `OnVideoDeviceStateChanged`**

      Before v4.6.2, the `OnVideoDeviceStateChanged` callback could only be triggered after joining a channel. Starting from this release, you can receive this callback once after `IRtcEngine` initialization completes, and continue to receive it after joining a channel.

    * **Improved accuracy of network quality evaluation**

      Improves the accuracy of network quality evaluation in the `OnNetworkQuality` callback, making the reported data better reflect the user's perceived experience.

    * **Support for 24kHz sampling rate for audio playback**

      Adds support for audio data with a sample rate of 24000 Hz in `OnPlaybackAudioFrame`. When calling `SetPlaybackAudioFrameParameters` to set the playback audio format, you can set `sampleRate` to `24000`.

    * **`OnEncodedVideoFrameReceived` supports `channelId`**

      Adds the `channelId` parameter to the `OnEncodedVideoFrameReceived` callback, helping you identify which channel the encoded video data belongs to.

    * **Additional improvements**

      * Optimizes permission requests on Windows 11 24H2 and later to avoid unnecessary location data acquisition.
      * Adds support for G.711 and G.722 audio codecs when interoperating with Web clients, improving cross-platform audio compatibility and clarity.
      * Improves video clarity in screen sharing scenarios involving documents.
      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

    #### Issues fixed [#issues-fixed-143]

    This release fixes the following issues:

    * When playing multi-track songs with guide vocal enabled, noise occurred after calling `SetAudioPitch` to adjust the pitch.
    * When a broadcaster created a custom audio capture track using `CreateCustomAudioTrack` with `trackType` set to `AUDIO_TRACK_DIRECT`, pushed self-captured audio using `PushAudioFrame`, and then played sound effects using `PlayEffectEx`, the audience in the channel heard noise in the broadcaster's audio.
    * Apps integrated with the SDK occasionally experienced UI freezing due to main thread blocking during audio and video engagements.
    * When screen sharing was enabled with `enableHighLight` set to `true` in `ScreenCaptureParameters`, placing the shared window on top and maximizing it caused the local preview to flicker.
    * When calling `StartScreenCaptureByDisplayId` to share a specified screen and using `excludeWindowList` in `ScreenCaptureParameters` to specify excluded windows, some windows occasionally failed to be excluded.
    * Apps sharing external screen video streams occasionally crashed after the external screen was disconnected.
    * When calling `OpenWithMediaSource` with `isLiveSource` set to `true` to play a pure video stream, playback failed.
    * Receivers occasionally heard noise when the sender transmitted multi-channel encoded audio.
    * When calling `Open` twice to open different media resources, the `OnPlayerInfoUpdated` callback returned information about the first resource when opening the second, which was incorrect.
    * When calling `EnableAudioVolumeIndication` to enable volume indication for local streaming users and remote users, the local user volume returned by `OnAudioVolumeIndication` was 0.
    * When using a 21:9 ultrawide display and setting a high resolution such as 3840×2160 for screen sharing, the shared image was cropped in both local preview and on the receiver side.
    * When calling `EnableVideoImageSource` to enable placeholder streaming, the sender occasionally succeeded in publishing but `OnVideoPublishStateChanged` reported the publish state as something other than `PUB_STATE_PUBLISHED`, which was incorrect.
    * In multi-channel scenarios, when calling `joinChannelEx` successfully before calling `setupRemoteVideoEx` to initialize remote user views, the first frame of remote user views occasionally had a large display delay.
    * After calling `Open` to open an online sound effect file and `PlayEffectEx` to start playback, calling `Seek` to set the playback position caused the file to play from the beginning instead of the specified position.
    * In media volume mode, when a broadcaster published microphone audio while simultaneously playing sound effects with `PlayEffectEx` and a music file with `StartAudioMixing` \[2/2], echo occasionally occurred.
    * After calling `JoinChannelEx` to join a channel and `StartOrUpdateChannelMediaRelay` to start cross-channel media relay, rejoining the channel after going offline and leaving occasionally caused `OnChannelMediaRelayStateChanged` to report `state` as `RELAY_STATE_FAILURE` with `code` as `RELAY_ERROR_SERVER_ERROR_RESPONSE`.
    * On some laptop models with power-saving mode enabled, receivers occasionally heard echo when the sender shared screen and audio.
    * In online education scenarios, teachers occasionally observed audio and video out of sync for multiple students in the local view.
    * The second call to `EnumerateVideoDevices` to retrieve the device list did not take effect.
    * On Windows 7 devices, when sharing a PowerPoint window running in full-screen auto-play mode with a large number of animations, the remote view occasionally flickered.

    ### v4.5.1 [#v451-4]

    v4.5.1 was released on March 13, 2025.

    #### New features [#new-features-119]

    1. **AI conversation scenario**

       This version adds the `AUDIO_SCENARIO_AI_CLIENT` audio scenario specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on AI-generated voice characteristics, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. It enhances conversation continuity and reliability while adapting to complex network conditions.

    2. **16 KB memory page size**

       Starting from Android 15, the system [supports 16 KB memory page sizes](https://developer.android.com/guide/practices/page-sizes). To maintain app stability and performance, the SDK now includes compatibility for both 4 KB and 16 KB memory page sizes. This enhancement ensures reliable operation across a wider range of devices and helps prevent crashes on devices using the newer memory configuration.

    #### Improvements [#improvements-135]

    * Reduces the SDK initialization time on specific device models. (iOS)

    #### Issues fixed [#issues-fixed-144]

    This release fixes the following issues:

    * Apps that integrated the Agora SDK and set the `targetSdkVersion` to 34 encountered crashes when attempting to enable screen sharing for the first time on an Android 14 system. (Android)
    * When joining two or more channels simultaneously, and calling the `TakeSnapshotEx [1/2]` method to take screenshots of the local video streams in each channel consecutively, the screenshot of the first channel failed.
    * When using the `Pause` method to pause playback, then calling `Seek` to move to a specified position, and finally calling `Play` to continue playback, the Media Player resumed from the position where it was paused, not the new specified position.
    * When using the Media Player, the file path of the media resource returned by the `GetPlaySrc` did not change after calling the `SwitchSrc` method to switch to a new media resource.
    * When using Bluetooth headphones on specific device models for audio and video interactions, adjusting the phone volume would occasionally change the media volume instead of the Bluetooth volume. (Android)
    * During audio and video interactions, the local user occasionally experienced a black screen when watching the video streams of remote users. (Android)
    * On specific device models, after calling `SetCameraExposureFactor` to set the exposure coefficient of the current camera at a specific angle of the device, the video screen occasionally became dark when the device was moved to another angle. (Android)
    * When playing a CDN live stream, the video occasionally froze for an extended period after recovering from an interruption. (Android)
    * When pushing video frames in i420 format to the channel, using CVPixelBuffer to handle these frames caused a crash. (iOS)
    * Calling `SetupLocalVideo` to set up two views, then calling `EnableFaceDetection` to start face detection, no face information can be detected in the subsequently passed views. (iOS)
    * In a screen sharing scenario, the receiving-end user saw a green line on the shared image. (iOS)
    * In the interactive live streaming scenario, after joining a channel to watch live streams using `string` user id, the audience members occasionally saw that the audio was not synchronized with the video.
    * Plugins sometimes did not work when using AI noise suppression and AI echo cancellation plugins at the same time.

    ### v4.5.0 [#v450-7]

    v4.5.0 was released on December 10, 2024.

    #### Compatibility changes [#compatibility-changes-75]

    This version includes optimizations to some features, including changes to SDK behavior, API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Member Parameter Type Changes**

       This version has made the following modifications to some API members or parameters:

       | API                            | Members/Parameters               | Change                           |
       | ------------------------------ | -------------------------------- | -------------------------------- |
       | `StartScreenCaptureByWindowId` | `windowId`                       | Changed from `view_t` to `long`  |
       | `ScreenCaptureConfiguration`   | * `displayId`
       * `windowId`       | Changed from `unit` to  `long`   |
       | `ScreenCaptureSourceInfo`      | - `sourceDisplayId`
       - `sourceId` | Changed from `view_t` to  `long` |

    2. **Changes in strong video noise suppression implementation**

       This version adjusts the implementation of strong video noise suppression. `VIDEO_DENOISER_LEVEL_STRENGTH` is removed from `VIDEO_DENOISER_LEVEL`.

       Instead, after enabling video noise suppression by calling `SetVideoDenoiserOptions`, you can call the `SetBeautyEffectOptions` method to enable the beauty skin smoothing feature. Using both together will achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `SetVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, you need to enable video noise suppression first and use specific settings as detailed in `SetLowlightEnhanceOptions`.

    3. **Changes in camera plug and unplug status (macOS, Windows)**

       In previous versions, when the camera was unplugged and replugged, the `OnVideoDeviceStateChanged` callback would report the device status as `MEDIA_DEVICE_STATE_ACTIVE`(1) (device in use). Starting from this version, after the camera is replugged, the device status will change to `MEDIA_DEVICE_STATE_IDLE`(0) (device ready).

    4. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`COMPRESSION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_compressionpreference.html) enumeration class, a new `PREFER_COMPRESSION_AUTO` (-1) enumeration is added, replacing the original `PREFER_QUALITY` (1) as the default value. In this mode, the SDK will automatically choose between `PREFER_LOW_LATENCY` or `PREFER_QUALITY` based on your video scene settings to achieve the best user experience.
       * In the [`DEGRADATION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_degradationpreference.html) enumeration class, a new `MAINTAIN_AUTO` (-1) enumeration is added, replacing the original `MAINTAIN_QUALITY` (1) as the default value. In this mode, the SDK will automatically choose between `MAINTAIN_FRAMERATE`, `MAINTAIN_BALANCED`, or `MAINTAIN_RESOLUTION` based on your video scene settings to achieve the optimal overall quality experience (QoE).

    #### New features [#new-features-120]

    1. **Live show scenario**

       This version adds the `APPLICATION_SCENARIO_LIVESHOW`(3) (Live Show) enumeration to [`VIDEO_APPLICATION_SCENARIO_TYPE`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_videoapplicationscenariotype.html). You can call `SetVideoScenario` to set the video business scenario to show room. To meet the high requirements for first frame rendering time and image quality in this scenario, the SDK has optimized strategies to significantly improve the first frame rendering experience and image quality, while enhancing the image quality in weak network environments and on low-end devices.

    2. **Maximum frame rate for video rendering**

       This version adds the [`SetLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`SetRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (e.g., screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`SetFilterEffectOptions`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (`.cube`) in the `config` parameter to achieve custom filter effects such as whitening, vivid, cool, black and white, etc. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file for quickly achieving a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the `StartLocalAudioMixer` method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `StopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `UpdateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **External `MediaProjection` (Android)**

       This version introduces the [`SetExternalMediaProjection`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setexternalmediaprojection) method, which allows you to set an external `MediaProjection` and replace the `MediaProjection` applied by the SDK.

       If you have the capability to apply for `MediaProjection` on your own, you can use this feature to achieve more flexible screen capture.

    6. **EGL context (Android)**

       This version introduces the [`SetExternalRemoteEglContext`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setexternalremoteeglcontext) method, which is used to set the EGL context for rendering remote video streams. When using Texture format video data for remote video self-rendering, you can use this method to replace the SDK's default remote EGL context, achieving unified EGL context management.

    7. **Color space settings**

       This version adds the **colorSpace** parameter to `VideoFrame` and `ExternalVideoFrame`. You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    8. **Other features**

       * [`OnLocalVideoStateChanged`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback adds the `LOCAL_VIDEO_STREAM_REASON_DEVICE_DISCONNECTED` enumeration, indicating that the currently used video capture device has been disconnected (e.g., unplugged). (Windows)
       * [`MEDIA_DEVICE_STATE_TYPE`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_mediadevicestatetype.html) adds the `MEDIA_DEVICE_STATE_PLUGGED_IN` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-136]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`TakeSnapshot [2/2]`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`TakeSnapshotEx [2/2]`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency. (Android, iOS)
       * Optimizes the logic for calling `QueryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * Supports using virtual cameras in YV12 format as video capture devices. (Windows)
       * When calling `SwitchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `OnPlayerEvent` callback will report the `PLAYER_EVENT_SWITCH_ERROR` event, indicating an error occurred during media resource switching.
       * When calling `SetPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Issues fixed [#issues-fixed-145]

    This version fixes the following issues:

    * When calling `StartScreenCaptureByWindowId` to share the screen, the window capture area specified by **regionRect** was inaccurate, resulting in incorrect width and height of the screen sharing window seen by the receiving end. (Windows)
    * When the video source type of the sender is in JPEG format, the frame rate on the receiving end occasionally falls below expectations. (Android, iOS)
    * During audio and video interaction, after being interrupted by a system call, the user volume reported by the `OnAudioVolumeIndication` callback was incorrect. (Android)
    * When the receiving end subscribes to the low-quality video stream by default and does not automatically subscribe to any video stream when joining the channel, calling `MuteRemoteVideoStream (uid, false)` after joining the channel to resume receiving the video stream results in receiving the high-quality video stream. (Android)
    * Occasional errors of not finding system files during audio and video interaction on Windows 7 systems. (Windows)
    * When calling `FollowSystemRecordingDevice` or `FollowSystemPlaybackDevice` to set the audio capture or playback device used by the SDK to not follow the system default audio playback device, the local audio state callback `OnLocalAudioStateChanged` is not triggered when the audio device is removed. (Windows)
    * Occasional instances where the receiving end cannot hear the sender during audio and video interaction. (iOS)
    * During audio and video interaction, if the sender's device system version is iOS 17, the receiving end occasionally cannot hear the sender. (iOS)
    * In live streaming use-cases, the time taken to reconnect to the live room after the audience end disconnects due to network switching is longer than expected. (iOS)
    * No sound when playing online media resources using the media player after the app starts. (iOS)
    * Occasional instances of no sound in audio capture after resuming from being interrupted by other system apps during audio and video interaction. (iOS)
    * Calling `StartAudioMixing [1/2]` and then immediately calling `PauseAudioMixing` to pause the music file playback does not take effect.
    * Occasional crashes during audio and video interaction. (Android)

    ### v4.4.0 [#v440-7]

    v4.4.0 was released on August 29, 2024.

    #### Compatibility changes [#compatibility-changes-76]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion.
    To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. To distinguish context information in different extension callbacks, this version removes the original extension callbacks and adds corresponding callbacks that contain context information (see the table below). You can identify the extension name, the user ID, and the service provider name through `ExtensionContext` in each callback.

       | Original callback    | New callback                    |
       | -------------------- | ------------------------------- |
       | `onExtensionEvent`   | `OnExtensionEventWithContext`   |
       | `onExtensionStarted` | `OnExtensionStartedWithContext` |
       | `onExtensionStopped` | `OnExtensionStoppedWithContext` |
       | `onExtensionError`   | `OnExtensionErrorWithContext`   |

    2. This version renames the following members in `ExternalVideoFrame`:

    * `d3d11_texture_2d` is renamed to `d3d11Texture2d`.
    * `texture_slice_index` is renamed to `textureSliceIndex`.
    * `metadata_buffer` is renamed to `metadataBuffer`.
    * `metadata_size` is renamed to `metadataSize`.

    #### New features [#new-features-121]

    1. **Alpha transparency effects**

       This version introduces the Alpha transparency effects feature. It supports the transmission and rendering of Alpha
       channel data in video frames for SDK capture and custom capture use-cases, enabling transparent gift effects, custom
       backgrounds on the receiver end, and so on:

       * `VideoFrame` and `ExternalVideoFrame` add the `alphaBuffer` member, which sets the Alpha channel data.
       * `ExternalVideoFrame` adds the `fillAlphaBuffer` member, which sets whether to automatically extract the Alpha channel data and fill it into `alphaBuffer` for BGRA or RGBA formatted video data.
       * `VideoFrame` and `ExternalVideoFrame` add the `alphaStitchMode` member, which sets the relative position of
         `alphaBuffer` and video frame stitching.

       Additionally, `AdvanceOptions` adds a new member `encodeAlpha`, which is used to set whether to encode and send Alpha information to the remote end. By default, the SDK does not encode and send Alpha information; if you need to encode and send Alpha information to the remote end (for example, when virtual background is enabled), explicitly call `SetVideoEncoderConfiguration` to set the video encoding properties and set `encodeAlpha` to `true`.

    2. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a
       physical sound card. You can enable the voice AI tuner feature by calling the `EnableVoiceAITuner` method. Pass in the sound effect types supported in the `VOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice,
       husky singing voice, and so on.

    3. **1v1 video call scenario**

       This version adds `APPLICATION_SCENARIO_1V1` (1v1 video call) in `VIDEO_APPLICATION_SCENARIO_TYPE`. You can call
       `SetVideoScenario` to set the video application scenario to 1v1 video call. The SDK optimizes performance to achieve
       low latency and high video quality, enhancing image quality, first frame rendering, latency on mid-to-low-end devices, and smoothness under poor network conditions.

    #### Improvements [#improvements-137]

    1. **Adaptive hardware decoding support (Android, Windows)**

       This release introduces adaptive hardware decoding support, enhancing rendering smoothness on low-end devices and effectively reducing system load.

    2. **Rendering performance enhancement (Windows)**

       DirectX 11 renderer is now enabled by default on Windows devices, providing high-performance and high-quality graphics rendering capabilities.

    3. **Facial region beautification**

       To avoid losing details in non-facial areas during heavy skin smoothing, this version improves the skin smoothing algorithm. The SDK now recognizes various parts of the face, applying smoothing to facial skin areas excluding the mouth, eyes, and eyebrows. In addition, the SDK supports smoothing up to two faces simultaneously.

    4. **Other improvements**

       This version also includes the following improvements:

       * Optimizes the transmission strategy: Calling `EnableInstantMediaRendering` no longer impacts the security of the transmission link.
       * The `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_DISPLAY_DISCONNECTED` enumerator is added in
         `OnLocalVideoStateChanged` callback, indicating that the display used for screen capture has been disconnected
         (Windows, macOS).
       * Optimizes the video link for window sharing, reducing CPU usage (macOS).
       * Improves echo cancellation for screen sharing use-cases.
       * Adds the `channelId` parameter to `Metadata`, which is used to get the channel name from which the metadata is sent.
       * Deprecates redundant enumeration values `CLIENT_ROLE_CHANGE_FAILED_REQUEST_TIME_OUT` and `CLIENT_ROLE_CHANGE_FAILED_CONNECTION_FAILED` in `CLIENT_ROLE_CHANGE_FAILED_REASON`.

    #### Issues fixed [#issues-fixed-146]

    This release fixed the following issues:

    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time
      interaction (iOS).
    * Remote video occasionally froze or displayed corrupted images when the app returned to the foreground after being in
      the background for a while (iOS).
    * After the sender called `StartDirectCdnStreaming` to start direct CDN streaming, frequent switching or toggling of the
      network occasionally resulted in a black screen on the receiver's end without a streaming failure callback on the sender's end (iOS).
    * Audio playback failed when pushing external audio data using `PushAudioFrame` and the sample rate was not set to a recommended value, such as 22050 Hz and 11025 Hz.

    ### v4.3.2 [#v432-6]

    v4.3.2 was released on June 6, 2024.

    #### Improvements [#improvements-138]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption) method by removing the timing requirements for invocation. It can now be called both before and after joining the channel to dynamically switch audio and video stream fallback options in weak network conditions.

    #### Issues fixed [#issues-fixed-147]

    This version fixed the following issues:

    * The remote video froze or became pixelated when the app returned to the foreground after being in the background for a long time (iOS).
    * The local preview image rotated by 90° on some iPad devices, which did not meet expectations (iOS).
    * Occasional video smoothness issues during audio and video interactions.
    * The app occasionally crashed when the decoded video resolution on the receiving end was an odd number.
    * The app crashed when opening the app and starting screen sharing after the first installation or system reboot (Android).
    * Local audio capture failed after joining a channel while answering a system phone call and hanging up, causing remote users to not hear any sound (Android).
    * During the interaction process on certain devices (for example, Redmi Note8), after answering and hanging up a system call, local media files were played without sound and no sound was heard from the remote end (Android).
    * The app occasionally crashed when remote users left the channel.
    * The screen occasionally flickered on the receiver's side when sharing a PPT window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and playing PPT animations (Windows).
    * The window border did not retain its original size after exiting the presentation and then maximizing the PPT window when sharing a WPS PPT window on Windows 7 using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_screencaptureparameters.html) to `true` (Windows).
    * The specified window could not be brought to the foreground if it was covered by other windows when sharing a window using [startScreenCaptureByWindowId](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_startscreencapturebywindowid) and setting `windowFocus` and `enableHighLight` in [ScreenCaptureParameters](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_screencaptureparameters.html) to `true` (Windows).
    * Clicking on the desktop widget caused the outlined part to flicker when sharing and highlighting a window on a Windows 7 device (Windows).
    * When playing an audio file using [StartAudioMixing \[1/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_startaudiomixing) and the playing finished, the SDK sometimes failed to trigger the [OnAudioMixingStateChanged](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onaudiomixingstatechanged) (`AUDIO_MIXING_STATE_STOPPED`, `AUDIO_MIXING_REASON_ALL_LOOPS_COMPLETED`) callback that reports that the playing is completed (iOS).
    * When calling the [PlayEffect](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_playeffect3) method to play sound effect files shorter than 1 second with `loopCount` set to `0`, there was no sound (iOS).
    * When using the Agora media player to play a video and stopping it during playing, sometimes there was no sound for a short time after the playback was resumed (iOS).

    ### v4.3.1 [#v431-6]

    v4.3.1 was released on May 9, 2024.

    #### New features [#new-features-122]

    1. **Privacy manifest file (iOS)**

       To meet Apple's safety compliance requirements for app publication, the SDK now includes a privacy manifest file, `PrivacyInfo.xcprivacy`, detailing the SDK's API calls that access or use user data, along with a description of the types of data collected.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    If you need to publish an app with SDK versions prior to v4.3.1 to the Apple App Store, manually add the `PrivacyInfo.xcprivacy` file to your Xcode project.
    \:::

    1. **Portrait center stage (iOS, macOS)**

       To enhance the presentation effect in online meetings, shows, and online education use-cases, this version introduces the [EnableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) method to activate the portrait center stage feature. This ensures that presenters, regardless of movement, always remain centered in the video frame, achieving better presentation effects.

       Before enabling portrait center stage it is recommended to verify whether your current device supports this feature by calling [IsCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported). A list of supported devices can be found in the API documentation at [EnableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage).

    2. **Camera stabilization (iOS)**

       To improve video stability in mobile filming, low-light environments, and hand-held shooting use-cases, this version introduces a camera stabilization feature. You can activate this feature and select an appropriate stabilization mode by calling [SetCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode), achieving more stable and clearer video footage.

    3. **Wide and ultra-wide cameras (Android, iOS)**

       To allow users to capture a broader field of view and more complete scene content, this release introduces support for wide and ultra-wide cameras. You can first call [QueryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) to check the device's focal length capabilities, and then call [SetCameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setcameracapturerconfiguration) and set `cameraFocalLengthType` to the supported focal length types, including wide and ultra-wide.

    4. **Multi-camera capture (Android)**

       This release introduces additional functionalities for Android camera capture:

       1. Support for capturing and publishing video streams from the third and fourth cameras:

          * `VIDEO_SOURCE_CAMERA_THIRD` (11) and `VIDEO_SOURCE_CAMERA_FOURTH` (12) in [VIDEO\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_videosourcetype.html) add support for Android, specifically for the third and fourth camera sources. This change allows you to specify up to four camera streams when initiating camera capture by calling [StartCameraCapture](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/api_irtcengine_startcameracapture.html).
          * `publishThirdCameraTrack` and `publishFourthCameraTrack` in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_channelmediaoptions.html) add support for Android. Set these parameters to `true` when joining a channel with [JoinChannel \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_joinchannel2) to publish video streams captured from the third and fourth cameras.

       2. Support for specifying cameras by camera ID:

          A new parameter `cameraId` is added to [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/). For devices with multiple cameras, where `cameraDirection` cannot identify or access all available cameras, you can obtain the camera ID through Android's native system APIs and specify the desired camera by calling [StartCameraCapture](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/api_irtcengine_startcameracapture.html) with the specific `cameraId`.

    5. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_encryptionconfig.html) for enabling data stream encryption. You can set this when you activate encryption with [EnableEncryption](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enableencryption). If there are issues causing failures in data stream encryption or decryption, these can be identified by the newly added `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE` and `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE` enumerations.

    6. **Adaptive configuration for low-quality video streams**

       This version introduces adaptive configuration for low-quality video streams. When you activate the dual-stream mode and set up low-quality video streams on the sending side using [SetDualStreamMode \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setdualstreammode2), the SDK defaults to the following behaviors:

       * The default encoding resolution for low-quality video streams is set to 50% of the original video encoding resolution.
       * The bitrate for the low-quality streams is automatically matched based on the video resolution and frame rate, eliminating the need for manual specification.

    7. **Other features**

       * A new method [EnableEncryptionEx](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex) is added for enabling media stream or data stream encryption in multi-channel use-cases.
       * A new method [SetAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed) is introduced for setting the playback speed of audio files.
       * A new method [GetCallIdEx](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    8. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-139]

    1. **Optimization for game use-case screen sharing (Windows)**

       This version specifically optimizes screen sharing for game use-cases, enhancing performance, stability, and clarity in ultra-high definition (4K, 60 fps) game use-cases, resulting in a clearer, smoother, and more stable gaming experience for players.

    2. **Audio device type detection (macOS)**

       This version adds the following methods to obtain the information and type of audio playback and recording devices:

       * [GetPlaybackDefaultDevice \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getplaybackdefaultdevice2)
       * [GetRecordingDefaultDevice \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getrecordingdefaultdevice2)
       * [GetPlaybackDeviceInfo \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getplaybackdeviceinfo2)
       * [GetRecordingDeviceInfo \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdeviceinfo2)

    3. **Virtual background algorithm optimization**

       To enhance the accuracy and stability of human segmentation when activating virtual backgrounds against solid colors, this version optimizes the green screen segmentation algorithm:

       * Supports recognition of any solid color background, no longer limited to green screens.
       * Improves accuracy in recognizing background colors and reduces the background exposure during human segmentation.
       * After segmentation, the edges of the human figure (especially around the fingers) are more stable, significantly reducing flickering at the edges.

    4. **CPU consumption reduction of in-ear monitoring**

       This release adds an enumerator `EAR_MONITORING_FILTER_REUSE_POST_PROCESSING_FILTER` in `EAR_MONITORING_FILTER_TYPE`. For complex audio processing use-cases, you can specify this option to reuse the audio filter after sender-side processing in in-ear monitoring, thereby reducing CPU consumption. Note that this option may increase the latency of in-ear monitoring, which is suitable for latency-tolerant use-cases requiring low CPU consumption.

    5. **Other improvements**

       This version also includes the following improvements:

       * Optimization of video encoding and decoding strategies in non-screen sharing use-cases to save system performance overhead (Windows).
       * Enhanced media player capabilities to handle the WebM format videos, including support for rendering Alpha channels.
       * In [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_audioeffectpreset.html), a new enumeration `ROOM_ACOUSTICS_CHORUS` (chorus effect) is added, enhancing the spatial presence of vocals in chorus use-cases.
       * In [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_remoteaudiostats.html), a new `e2eDelay` field is added to report the delay from when the audio is captured on the sending end to when the audio is played on the receiving end.

    #### Issues fixed [#issues-fixed-148]

    This version fixed the following issues:

    * Fixed an issue where SEI data output did not synchronize with video rendering when playing media streams containing SEI data using the media player.
    * In screen sharing use-cases, when the app enabled sound card capture with [EnableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording) to capture audio from the shared screen, the transmission of sound card captured audio failed after a local user manually disabled the local audio capture device, causing remote users to not hear the shared screen's audio (Windows).
    * Hosts using certain models of devices in the speaker mode experienced occasional local audio capture failures when switching the app process to the background and then back to the foreground, preventing remote users from hearing the host's audio (Android).
    * An occasional echo was observed when playing the audio stream of a specified user before mixing (macOS, Windows).
    * During interactions, when a local user set the system default playback device to speakers, there was no sound from the remote end (Windows).
    * On devices with Android 8.0, enabling screen sharing occasionally caused the app to crash (Android).
    * When sharing an Excel document window, remote users occasionally saw a green screen (Windows).
    * In use-cases using camera capture for local video, when the app was moved to the background and [DisableVideo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_disablevideo) or [StopPreview](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_stoppreview) was called to stop video capture, camera capture was unexpectedly activated when the app was brought back to the foreground (Android).
    * When the network conditions of the sender deteriorated (for example, in poor network environments), the receiver occasionally experienced a decrease in video smoothness and an increase in lag.

    #### API changes [#api-changes-76]

    **Added**

    * [EnableCameraCenterStage](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (iOS, macOS)
    * [IsCameraCenterStageSupported](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (iOS, macOS)
    * [SetCameraStabilizationMode](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode) (iOS)
    * [CAMERA\_STABILIZATION\_MODE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_camerastabilizationmode.html) (iOS)
    * [RegisterFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_imediaengine_registerfaceinfoobserver)
    * [UnregisterFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [OnFaceInfo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * The `publishLipSyncTrack` member in [ChannelMediaOptions](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_channelmediaoptions.html)
    * [MEDIA\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_mediasourcetype.html) adds `SPEECH_DRIVEN_VIDEO_SOURCE`
    * [VIDEO\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_videosourcetype.html) adds `VIDEO_SOURCE_SPEECH_DRIVEN`
    * [EncryptionConfig](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [ENCRYPTION\_ERROR\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
      * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [GetPlaybackDefaultDevice \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getplaybackdefaultdevice2) (macOS),
    * [`GetRecordingDefaultDevice` \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getrecordingdefaultdevice2) (macOS),
    * [GetPlaybackDeviceInfo \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getplaybackdeviceinfo2) (macOS)
    * [GetRecordingDeviceInfo \[2/2\]](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdeviceinfo2) (macOS)
    * [RemoteAudioStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ERROR\_CODE\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_errorcodetype.html) adds `ERR_DATASTREAM_DECRYPTION_FAILED`
    * [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_audioeffectpreset.html) adds `ROOM_ACOUSTICS_CHORUS`, enhancing the spatial presence of vocals in chorus use-cases.
    * [GetCallIdEx](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [EnableEncryptionEx](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [SetAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [QueryCameraFocalLengthCapability](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability)(Android, iOS)
    * [FocalLengthInfo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_focallengthinfo.html) (Android, iOS)
    * [CAMERA\_FOCAL\_LENGTH\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_camerafocallengthtype.html) (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType` (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId` (Android)
    * [EAR\_MONITORING\_FILTER\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_earmonitoringfiltertype.html) adds a new enumeration `EAR_MONITORING_FILTER_BUILT_IN_AUDIO_FILTERS`

    ### v4.3.0 [#v430-7]

    v4.3.0 was released on February 28, 2024.

    #### Compatibility changes [#compatibility-changes-77]

    This release has optimized the implementation of some functions, involving renaming or deletion of some APIs. To ensure the normal operation of the project, you need to update the code in the app after upgrading to this release.

    1. **Renaming parameters in callbacks**

       In order to make the parameters in some callbacks and the naming of enumerations in enumeration classes easier to understand, the following modifications have been made in this release. Please modify the parameter settings in the callbacks after upgrading to this release.

       | Callback                           | Original parameter name | New parameter name |
       | ---------------------------------- | ----------------------- | ------------------ |
       | `OnLocalAudioStateChanged`         | `error`                 | `reason`           |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`           |
       | `OnDirectCdnStreamingStateChanged` | `error`                 | `reason`           |
       | `OnRtmpStreamingStateChanged`      | `errCode`               | `reason`           |

       | Original enumeration class   | New enumeration class         |
       | ---------------------------- | ----------------------------- |
       | `LOCAL_AUDIO_STREAM_ERROR`   | `LOCAL_AUDIO_STREAM_REASON`   |
       | `LOCAL_VIDEO_STREAM_ERROR`   | `LOCAL_VIDEO_STREAM_REASON`   |
       | `DIRECT_CDN_STREAMING_ERROR` | `DIRECT_CDN_STREAMING_REASON` |
       | `MEDIA_PLAYER_ERROR`         | `MEDIA_PLAYER_REASON`         |
       | `RTMP_STREAM_PUBLISH_ERROR`  | `RTMP_STREAM_PUBLISH_REASON`  |

       **Note:** For specific renaming of enumerations, please refer to [API changes](#api-changes).

    2. **Channel media relay**

       To improve interface usability, this release removes some methods and callbacks for channel media relay. Use the alternative options listed in the table below:

       | Deleted methods and callbacks                              | Alternative methods and callbacks  |
       | ---------------------------------------------------------- | ---------------------------------- |
       | * `startChannelMediaRelay`
       * `updateChannelMediaRelay`     | `startOrUpdateChannelMediaRelay`   |
       | - `startChannelMediaRelayEx`
       - `updateChannelMediaRelayEx` | `startOrUpdateChannelMediaRelayEx` |
       | `onChannelMediaRelayEvent`                                 | `onChannelMediaRelayStateChanged`  |

    3. **Reasons for local video state changes**

       This release makes the following modifications to the enumerations in the [LOCAL\_VIDEO\_STREAM\_REASON](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_localvideostreamreason.html) class:

       * The value of `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_PAUSED` (formerly `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`) has been changed from 23 to 28.
       * The value of `LOCAL_VIDEO_STREAM_REASON_SCREEN_CAPTURE_RESUMED` (formerly `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`) has been changed from 24 to 29.
       * The `LOCAL_VIDEO_STREAM_ERROR_CODEC_NOT_SUPPORT` enumeration has been changed to `LOCAL_VIDEO_STREAM_REASON_CODEC_NOT_SUPPORT`.

    4. **Audio route**

       Starting with this release, `routeBluetooth` in [AudioRoute](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_audioroute.html) is renamed to `ROUTE_BLUETOOTH_DEVICE_HFP`, representing a Bluetooth device using the HFP protocol. `ROUTE_BLUETOOTH_DEVICE_A2DP`(10) is added to represent a Bluetooth device using the A2DP protocol.

    5. **Audio loopback capturing (Windows, macOS)**

       * Before v4.3.0, if you called the [DisableAudio](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing would not be disabled.
       * As of v4.3.0, if you call the [DisableAudio](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_disableaudio) method to disable the audio module, audio loopback capturing will be disabled as well. If you need to enable audio loopback capturing, you need to enable the audio module by calling the [EnableAudio](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [EnableLoopbackRecording](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

    6. **Log encryption behavior changes**

       For security and performance reasons, as of this release, the SDK encrypts logs and no longer supports printing plaintext logs via the console.

       Refer to the following solutions for different needs:

       * If you need to know the API call status, please check the API logs and print the SDK callback logs yourself.
       * For any other special requirements, please contact [technical support](mailto\:support@agora.io) and provide the corresponding encrypted logs.

    #### New features [#new-features-123]

    1. **Local preview with multiple views**

       This release supports local preview with simultaneous display of multiple frames, where the videos shown in the frames are positioned at different observation positions along the video link. Examples of usage are as follows:

       1. Call [SetupLocalVideo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the first view: Set the `position` parameter to `POSITION_POST_CAPTURER_ORIGIN` (introduced in this release) in `VideoCanvas`. This corresponds to the position after local video capture and before preprocessing. The video observed here does not have preprocessing effects.
       2. Call [SetupLocalVideo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setuplocalvideo) to set the second view: Set the `position` parameter to `POSITION_POST_CAPTURER` in `VideoCanvas`, the video observed here has the effect of video preprocessing.
       3. Observe the local preview effect: The first view is the original video of a real person; the second view is the virtual portrait after video preprocessing (including image enhancement, virtual background, and local preview of watermarks) effects.

    2. **Custom mixed video layout on the receiving end (Android, iOS)**

       To facilitate customized layout of mixed video stream at the receiver end, this release introduces the [OnTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo) callback. When the receiver receives the channel's mixed video stream sent by the video mixing server, this callback is triggered, reporting the layout information of the mixed video stream and the layout information of each sub-video stream in the mixed stream. The receiver can set a separate `view` for rendering the sub-video stream (distinguished by `subviewUid`) in the mixed video stream when calling the [SetupRemoteVideo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setupremotevideo) method, achieving a custom video layout effect.

       When the layout of the sub-video streams in the mixed video stream changes, this callback will also be triggered to report the latest layout information in real time.

       Through this feature, the receiver end can flexibly adjust the local view layout. When applied in a multi-person video use-case, the receiving end only needs to receive and decode a mixed video stream, which can effectively reduce the CPU usage and network bandwidth when decoding multiple video streams on the receiving end.

    3. **Query Device Score**

       This release adds the [QueryDeviceScore](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore) method to query the device's score level to ensure that the user-set parameters do not exceed the device's capabilities. For example, in HD or UHD video use-cases, you can first call this method to query the device's score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business use-cases is varied. For specific score recommendations, please contact [technical support](mailto\:support@agora.io).

    4. **Select different audio tracks for local playback and streaming**

       This release introduces the [SelectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack) method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, you need to open the media file through the [OpenWithMediaSource](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayer.html#api_imediaplayer_openwithmediasource) method and enable this function by setting the `enableMultiAudioTrack` parameter in [MediaSource](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_mediasource.html).

    5. **Others**

       This release has passed the test verification of the following APIs and can be applied to the entire series of RTC 4.x SDK.

       * [SetRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setremotesubscribefallbackoption): Sets fallback option for the subscribed video stream in weak network conditions.
       * [OnRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onremotesubscribefallbacktoaudioonly): Occurs when the subscribed video stream falls back to audio-only stream due to weak network conditions or switches back to the video stream after the network conditions improve.
       * [GetRecordingDeviceVolume](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdevicevolume)(Windows): Sets the volume of the audio capturing device.
       * [SetPlayerOption](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [SetPlayerOption](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption2): Sets media player options for providing technical previews or special customization features.
       * [EnableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-140]

    1. **SDK task processing scheduling optimization**

       This release optimizes the scheduling mechanism for internal tasks within the SDK, with improvements in the following aspects:

       * The speed of video rendering and audio playback for both remote and local first frames improves by 10% to 20%.
       * The API call duration and response time are reduced by 5% to 50%.
       * The SDK's parallel processing capability significantly improves, delivering higher video quality (720P, 24 fps) even on lower-end devices. Additionally, image processing remains more stable in use-cases involving high resolutions and frame rates.
       * The stability of the SDK is further enhanced, leading to a noticeable decrease in the crash rate across various specific use-cases.

    2. **In-ear monitoring volume boost**

       This release provides users with more flexible in-ear monitoring audio adjustment options, supporting the ability to set the in-ear monitoring volume to four times the original volume by calling [SetInEarMonitoringVolume](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setinearmonitoringvolume).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [SetZones](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_ilocalspatialaudioengine.html#api_ibasespatialaudioengine_setzones) method, supporting the ability to set the `zones` parameter to `NULL`, indicating the clearing of all echo cancellation zones.
       * As of this release, it is no longer necessary to unsubscribe from the audio streams of all remote users within the channel before calling the methods in [ILocalSpatialAudioEngine](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine).

    4. **Other Improvements**

       This release also includes the following improvements:

       * This release optimizes the SDK's domain name resolution strategy, improving the stability of calling to resolve domain names in complex network environments.
       * When passing in an image with transparent background as the virtual background image, the transparent background can be filled with customized color.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [OnPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats) callback is added to report the statistics of the media file being cached. This callback is triggered once per second after file caching is started.
       * The [OnPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats) callback is added to report the statistics of the media file being played. This callback is triggered once per second after the media file starts playing. You can obtain information like the audio and video bitrate of the media file through [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_playerplaybackstats.html).

    #### Issues fixed [#issues-fixed-149]

    This release fixed the following issues:

    * When sharing two screen sharing video streams simultaneously, the reported `captureFrameRate` in the [OnLocalVideoStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.

    #### API changes [#api-changes-77]

    **Added**

    * [OnTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo)
    * [VideoLayout](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_videolayout.html)
    * The `subviewUid` member in [VideoCanvas](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_videocanvas.html)
    * [EnableCustomAudioLocalPlayback](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [QueryDeviceScore](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CUSTOM_VIDEO_SOURCE` enumeration in [MEDIA\_SOURCE\_TYPE](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_mediasourcetype.html)
    * The `ROUTE_BLUETOOTH_DEVICE_A2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/enum_audioroute.html)
    * [SelectMultiAudioTrack](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [OnPlayerCacheStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [OnPlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/video-sdk/unity/4.x/API/class_playerplaybackstats.html)

    **Modified**

    * All `ERROR` fields in the following enumerations are changed to `REASON`:

      * `LOCAL_AUDIO_STREAM_ERROR_OK`
      * `LOCAL_AUDIO_STREAM_ERROR_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION`
      * `LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY`
      * `LOCAL_AUDIO_STREAM_ERROR_RECORD_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE`
      * `LOCAL_AUDIO_STREAM_ERROR_RECORD_INVALID_ID`
      * `LOCAL_AUDIO_STREAM_ERROR_PLAYOUT_INVALID_ID`
      * `LOCAL_VIDEO_STREAM_ERROR_OK`
      * `LOCAL_VIDEO_STREAM_ERROR_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY`
      * `LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_CODEC_NOT_SUPPORT`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_NOT_FOUND`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_DISCONNECTED`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_INVALID_ID`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_MINIMIZED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_CLOSED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_OCCLUDED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_NO_PERMISSION`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_MINIMIZED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_FAILURE`
      * `LOCAL_VIDEO_STREAM_ERROR_DEVICE_SYSTEM_PRESSURE`
      * `DIRECT_CDN_STREAMING_ERROR_OK`
      * `DIRECT_CDN_STREAMING_ERROR_FAILED`
      * `DIRECT_CDN_STREAMING_ERROR_AUDIO_PUBLICATION`
      * `DIRECT_CDN_STREAMING_ERROR_VIDEO_PUBLICATION`
      * `DIRECT_CDN_STREAMING_ERROR_NET_CONNECT`
      * `DIRECT_CDN_STREAMING_ERROR_BAD_NAME`
      * `PLAYER_ERROR_NONE`
      * `PLAYER_ERROR_INVALID_ARGUMENTS`
      * `PLAYER_ERROR_INTERNAL`
      * `PLAYER_ERROR_NO_RESOURCE`
      * `PLAYER_ERROR_INVALID_MEDIA_SOURCE`
      * `PLAYER_ERROR_UNKNOWN_STREAM_TYPE`
      * `PLAYER_ERROR_OBJ_NOT_INITIALIZED`
      * `PLAYER_ERROR_CODEC_NOT_SUPPORTED`
      * `PLAYER_ERROR_VIDEO_RENDER_FAILED`
      * `PLAYER_ERROR_INVALID_STATE`
      * `PLAYER_ERROR_URL_NOT_FOUND`
      * `PLAYER_ERROR_INVALID_CONNECTION_STATE`
      * `PLAYER_ERROR_SRC_BUFFER_UNDERFLOW`
      * `PLAYER_ERROR_INTERRUPTED`
      * `PLAYER_ERROR_NOT_SUPPORTED`
      * `PLAYER_ERROR_TOKEN_EXPIRED`
      * `PLAYER_ERROR_UNKNOWN`
      * `RTMP_STREAM_PUBLISH_ERROR_OK`
      * `RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT`
      * `RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED`
      * `RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT`
      * `RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR`
      * `RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR`
      * `RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN`
      * `RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT`
      * `RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED`
      * `RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND`
      * `RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED`
      * `RTMP_STREAM_PUBLISH_ERROR_NOT_BROADCASTER`
      * `RTMP_STREAM_PUBLISH_ERROR_TRANSCODING_NO_MIX_STREAM`
      * `RTMP_STREAM_PUBLISH_ERROR_NET_DOWN`
      * `RTMP_STREAM_PUBLISH_ERROR_INVALID_PRIVILEGE`
      * `RTMP_STREAM_UNPUBLISH_ERROR_OK`

    **Deleted**

    * `StartChannelMediaRelay`
    * `UpdateChannelMediaRelay`
    * `StartChannelMediaRelayEx`
    * `UpdateChannelMediaRelayEx`
    * `OnChannelMediaRelayEvent`
    * `CHANNEL_MEDIA_RELAY_EVENT`

    ### v4.2.6 [#v426-6]

    v4.2.6 was released on November 24, 2023.

    #### Issues fixed [#issues-fixed-150]

    This release fixed the following issues:

    * Issues occurring when using Android 14:

      * When switching between portrait and landscape modes during screen sharing, the screen sharing process was interrupted. To restart screen sharing, users needed to confirm recording the screen in the pop-up window.
      * When integrating the SDK, setting the Android `targetSdkVersion` to 34 could cause screen sharing to be unavailable or even cause the app to crash.
      * Calling `StartScreenCapture`\[1/2] without sharing video (setting `captureVideo` to `false`) and then calling `UpdateScreenCaptureParameters` to share video (setting `captureVideo`to `true`) resulted in a frozen shared screen on the receiving end.
      * When screen sharing in the landscape mode, the shared screen seen by the audience was divided into two parts: One side of the screen was compressed, the other side was black.

    * When using an iOS 16 or later device with Bluetooth headphones connected before joining the channel, the audio routing after joining the channel was not as expected: Audio was played from the speaker, not the Bluetooth headphones (iOS).

    * In live streaming use-cases, the video on the audience end was occasionally distorted (Android).

    * In specific use-cases, such as when the network packet loss rate was high or when the broadcaster left the channel without destroying the engine and then re-joined the channel, the video on the receiving end stuttered or froze.

    ### v4.2.4 [#v424-2]

    v4.2.4 was released on October 25, 2023.

    #### Issues fixed [#issues-fixed-151]

    This release fixes the following issue:

    The `AgoraRtcWrapper` version number in `CFBundleShortVersionString` on iOS and macOS is wrong, which interferes with submitting the App to the App Store.

    ### v4.2.3 [#v423-6]

    v4.2.3 was released on October 20, 2023.

    #### New features [#new-features-124]

    1. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `CONTENT_INSPECT_IMAGE_MODERATION` enumeration is added in `CONTENT_INSPECT_TYPE` which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `ContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       In addition, this version also introduces the `EnableContentInspectEx` method, which supports taking screenshots for multiple video streams and uploading them.

    2. **ID3D11Texture2D Rendering on Windows**

       As of this release, the SDK supports video formats of type ID3D11Texture2D, improving the rendering effect of video frames in game use-cases. You can set `format` to `VIDEO_TEXTURE_ID3D11TEXTURE2D` when pushing external raw video frames to the SDK by calling `PushVideoFrame`. By setting the `d3d11_texture_2d` and `texture_slice_index` properties, you can determine the ID3D11Texture2D texture object to use.

    3. **Local video status error code update on Windows and macOS**

       In order to help users understand the exact reasons for local video errors in screen sharing use-cases, the following sets of enumerations have been added to the `OnLocalVideoStateChanged` callback:

       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`(23): Screen capture has been paused. Common use-cases for reporting this error code: The current screen may have been switched to a secure desktop, such as a UAC dialog box or Winlogon desktop.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`(24): Screen capture has resumed from the paused state.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_HIDDEN`(25): The window being captured on the current screen is in a hidden state and is not visible on the current screen.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_HIDDEN`(26): The window for screen capture has been restored from the hidden state.
       * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_MINIMIZED`(27): The window for screen capture has been restored from the minimized state.

    4. **Check device support for advanced features**

       This version adds the `IsFeatureAvailableOnDevice` method to check whether the capability of the current device meets the requirements of the specified advanced feature, such as virtual background and image enhancement.

       Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device's capabilities are insufficient.

       In addition, since this version, calling `EnableVirtualBackground` and `SetBeautyEffectOptions` automatically triggers a test on the capability of the current device. When the device is considered underperformed, the error code `-4:ERR_NOT_SUPPORTED` is returned, indicating the device does not support the feature.

    #### Improvements [#improvements-141]

    1. **Optimize virtual background memory usage**

       This version has upgraded the virtual background algorithm, reducing the memory usage of the virtual background feature. Compared to the previous version, the memory consumption of the app during the use of the virtual background feature on low-end devices has been reduced by approximately 4% to 10%. Specific values may vary depending on the device model and platform.

    2. **Screen sharing use-case optimization**

       This release optimizes the performance and encoding efficiency in ultra-high-definition (4K, 60 fps) game sharing use-cases, effectively reducing the system resource usage during screen sharing.

    **Other Improvements**

    This release includes the following additional improvements:

    * Optimizes the logic of handling invalid parameters. When you call the `SetPlaybackSpeed` method to set the playback speed of audio files, if you pass an invalid parameter, the SDK returns the error code -2, which means that you need to reset the parameter.
    * Optimizes the logic of Token parsing, in order to prevent an app from crashing when an invalid token is passed in.

    #### Issues fixed [#issues-fixed-152]

    This release fixed the following issues:

    * Occasional crashes and dropped frames in screen sharing use-cases on Windows.
    * Occasional crashes when joining a channel on macOS.
    * Occasional failure of joining a channel when the local system time was not set correctly.
    * When calling the `PlayEffect` method to play two audio files using the same `soundId`, the first audio file was sometimes played repeatedly.
    * When the host called the `StartAudioMixing` \[2/2] method to play music, sometimes the host couldn't hear the music while the remote users could hear it on Android.
    * Occasional crashes occurred on certain Android devices.
    * Calling `TakeSnapshotEx` once received the `OnSnapshotTaken` callback for multiple times.
    * In channels joined by calling `JoinChannelEx` exclusively, calling `SetEnableSpeakerphone` did not result in switching audio route from the speaker to the headphone on Android.

    #### API changes [#api-changes-78]

    **Added**

    * The following enumerations in `OnLocalVideoStateChanged` on (Windows and macOS:
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_PAUSED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_RESUMED`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_HIDDEN`
      * `LOCAL_VIDEO_STREAM_ERROR_SCREEN_CAPTURE_WINDOW_RECOVER_FROM_MINIMIZED`
    * `d3d11_texture_2d` and `texture_slice_index` members in `ExternalVideoFrame` on Windows
    * `VIDEO_TEXTURE_ID3D11TEXTURE2D` in `VIDEO_PIXEL_FORMAT` on Windows
    * `EnableContentInspectEx`
    * `CONTENT_INSPECT_IMAGE_MODERATION` in `CONTENT_INSPECT_TYPE`
    * `serverConfig` in `ContentInspectConfig`
    * `IsFeatureAvailableOnDevice`
    * `FeatureType`

    ### v4.2.2 [#v422-6]

    This version was released on August 1, 2023.

    #### Compatibility changes [#compatibility-changes-78]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    1. **Audio frame observer**

    The following methods in the `IAudioFrameObserver` class are deleted:

    * `GetObservedAudioFramePosition`: Use the newly-added `position` parameter in  `RegisterAudioFrameObserver` instead.
    * `GetPlaybackAudioParams`: Use `SetPlaybackAudioFrameParameters` instead.
    * `GetRecordAudioParams`: Use `SetRecordingAudioFrameParameters` instead.
    * `GetMixedAudioParams`: Use `SetMixedAudioFrameParameters` instead.
    * `GetEarMonitoringAudioParams`: Use `SetEarMonitoringAudioFrameParameters` instead.

    2. **Video frame observer**

    The following methods in the `IVideoFrameObserver` class are deleted:

    * `GetVideoFormatPreference`: Use the newly-added `formatPreference` parameter in  `RegisterVideoFrameObserver`.
    * `GetObservedFramePosition`: Use the newly-added `position` parameter in  `RegisterVideoFrameObserver`.

    3. **Metadata**

    This release deletes `GetMaxMetadataSize` and `OnReadyToSendMetadata` in the `IMetadataObserver` class. You can use the newly-added `SetMaxMetadataSize` and `SendMetadata` methods instead.

    #### New features [#new-features-125]

    1. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user id. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can avoid repeated application of tokens every time users joining a new channel, which reduces the pressure on your token server. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

       <CalloutContainer type="info">
         <CalloutDescription>
           All 4.x SDKs support using wildcard tokens.
         </CalloutDescription>
       </CalloutContainer>

    2. **Preloading channels**

       This release adds `PreloadChannel[1/2]` and `PreloadChannel[2/2]` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you joining a new channel, thus saving the time for switching between channels. See [Secure authentication with tokens](/en/realtime-media/video/build/authenticate-users/authentication-workflow).

    3. **Customized background color of video canvas**

       In this release, the `backgroundColor` member has been added to `VideoCanvas`, which allows you to customize the background color of the video canvas when setting the properties of local or remote video display.

    4. **Publishing video streams from different sources** (Windows, macOS)

       This release adds the following members in `ChannelMediaOptions` to allow you publish video streams captured from the third and fourth camera or screen:

       * `publishThirdCameraTrack`: Publishing the video stream captured from the third camera.
       * `publishFourthCameraTrack`: Publishing the video stream captured from the fourth camera.
       * `publishThirdScreenTrack`: Publishing the video stream captured from the third screen.
       * `publishFourthScreenTrack`: Publishing the video stream captured from the fourth screen.

       <CalloutContainer type="info">
         <CalloutDescription>
           For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
         </CalloutDescription>
       </CalloutContainer>

    #### Improvements [#improvements-142]

    1. **Improved camera capture effect** (Android, iOS)

       This release has improved camera capture effect in the following aspects:

       1. Support for camera exposure adjustment

          This release adds `IsCameraExposureSupported` to query whether the device supports exposure adjustment and `SetCameraExposureFactor` to set the exposure ratio of the camera.

       2. Optimization of default camera selection (iOS)

          Since this release, the default camera selection behavior of the SDK is aligned with that of the iOS system camera. If the device has multiple rear cameras, better shooting perspectives, zooming capabilities, low-light performance, and depth sensing can be achieved during video capture, thereby improving the quality of video capture.

    2. **Virtual Background Algorithm Upgrade**

       This version has upgraded the portrait segmentation algorithm of the virtual background, which comprehensively improves the accuracy of portrait segmentation, the smoothness of the portrait edge with the virtual background, and the fit of the edge when the person moves. In addition, it optimizes the precision of the person's edge in use-cases such as meetings, offices, homes, and under backlight or weak light conditions.

    3. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `StartOrUpdateChannelMediaRelay` and `StartOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    4. **Enhancement in video codec query capability**

       To improve the video codec query capability, this release adds the `codecLevels` member in `CodecCapInfo`. After successfully calling `QueryCodecCapability`, you can obtain the hardware and software decoding capability levels of the device for H.264 and H.265 video formats through `codecLevels`.

    This release includes the following additional improvements:

    1. To improve the switching experience between multiple audio routes, this release adds the `SetRouteInCommunicationMode` method. This method can switch the audio route from a Bluetooth headphone to the earpiece, wired headphone or speaker in communication volume mode ([`MODE_IN_COMMUNICATION`](https://developer.android.google.cn/reference/kotlin/android/media/AudioManager?hl=en#mode_in_communication)). (Android)
    2. The SDK automacially adjusts the frame rate of the sending end based on the screen sharing use-case. Especially in document sharing use-cases, this feature avoids exceeding the expected video bitrate on the sending end to improve transmission efficiency and reduce network burden.
    3. To help users understand the reasons for more types of remote video state changes, the `REMOTE_VIDEO_STATE_REASON_CODEC_NOT_SUPPORT` enumeration has been added to the `OnRemoteVideoStateChanged` callback, indicating that the local video decoder does not support decoding the received remote video stream.

    #### Issues fixed [#issues-fixed-153]

    This release fixed the following issues:

    * Occasionally, noise occurred when the local user listened to their own and remote audio after joining the channel. (macOS)
    * Slow channel reconnection after the connection was interrupted due to network reasons.
    * In screen sharing use-cases, the delay of seeing the shared screen was occasionally higher than expected on some devices.
    * In custom video capturing use-cases, `SetBeautyEffectOptions`, `SetLowlightEnhanceOptions`, `SetVideoDenoiserOptions`, and `SetColorEnhanceOptions` could not load extensions automatically.
    * In multi-device audio recording use-cases, after repeatedly plugging and unplugging or enabling/disabling the audio recording device, no sound could be heard occasionally when calling the `StartRecordingDeviceTest` to start an audio capturing device test. (Windows)

    #### API changes [#api-changes-79]

    **Added**

    * `SetCameraExposureFactor` (Android, iOS)
    * `IsCameraExposureSupported` (Android, iOS)
    * `PreloadChannel[1/2]`
    * `PreloadChannel[2/2]`
    * `UpdatePreloadChannelToken`
    * `SetRouteInCommunicationMode` (Android)
    * The following members in `ChannelMediaOptions` (Windows, macOS):
      * `publishThirdCameraTrack`
      * `publishFourthCameraTrack`
      * `publishThirdScreenTrack`
      * `publishFourthScreenTrack`
    * `CodecCapLevels`
    * `VIDEO_CODEC_CAPABILITY_LEVEL`
    * `backgroundColor` in `VideoCanvas`
    * `codecLevels` in `CodecCapInfo`
    * `REMOTE_VIDEO_STATE_REASON_CODEC_NOT_SUPPORT` in `REMOTE_VIDEO_STATE_REASON`
    * `SetMaxMetadataSize`
    * `SendMetadata`
    * `position` parameter in `RegisterAudioFrameObserver`
    * `formatPreference` and `position`  parameters in `RegisterVideoFrameObserver`

    **Deleted**

    * `GetObservedAudioFramePosition`
    * `GetPlaybackAudioParams`
    * `GetRecordAudioParams`
    * `GetMixedAudioParams`
    * `GetEarMonitoringAudioParams`
    * `GetVideoFormatPreference`
    * `GetObservedFramePosition`
    * `GetMaxMetadataSize`
    * `OnReadyToSendMetadata`

    ### v4.2.1 [#v421-8]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-143]

    This version improves the network transmission strategy, enhancing the smoothness of audio and video interactions.

    #### Issues fixed [#issues-fixed-154]

    This version fixed the following issues:

    * Inability to join channels caused by SDK's incompatibility with some older versions of AccessToken.
    * After the sending end called `SetAINSMode` to activate AI noise reduction, occasional echo was observed by the receiving end.
    * Brief noise occurred while playing media files using the media player.
    * After enabling the screen sharing function on the sending end, there was high delay until the receiving end could see the shared screen. (macOS)
    * Occasional crash after calling the `DestroyMediaPlayer` method. (iOS)
    * When the sending end mixed and published two streams of video captured by two cameras locally, the video from the second camera was occasionally missing on the receiving end. (Windows)
    * In screen sharing use-cases, some Android devices experienced choppy video on the receiving end. (Android)

    ### v4.2.0 [#v420-8]

    v4.2.0 was released on May 29, 2023.

    #### Compatibility changes [#compatibility-changes-79]

    If you use the features mentioned in this section, ensure that you modify the implementation of the relevant features after upgrading the SDK.

    **1. Video capture (Windows, iOS)**

    This release optimizes the APIs for camera and screen capture function. As of v4.2.0, ensure you use the alternative methods listed in the table below and specify the video source by setting the `sourceType` parameter:

    | Deleted Methods                                                                       | Alternative Methods        |
    | :------------------------------------------------------------------------------------ | :------------------------- |
    | `StartPrimaryCameraCapture`（Windows）<br />`StartSecondaryCameraCapture`（Windows，iOS）  | `StartCameraCapture`       |
    | `StopPrimaryCameraCapture`（Windows）<br />`StopSecondaryCameraCapture`（Windows，iOS）    | `StopCameraCapture`        |
    | `StartPrimaryScreenCapture `（Windows）<br />`StartSecondaryScreenCapture`（Windows，iOS） | `StartScreenCapture`\[2/2] |
    | `StopPrimaryScreenCapture`（Windows）<br />`StopSecondaryScreenCapture`（Windows，iOS）    | `StopScreenCapture`\[2/2]  |

    **2. Video rendering**

    As of v4.2.0, Agora Unity SDK does not support using `VideoSurface` and `VideoSurfaceYUV` at the same time for video rendering. After one `IRtcEngine` is created, if the first view is rendered through `VideoSurfaceYUV`, all views need to be rendered using `VideoSurfaceYUV` throughout the lifecycle of the `IRtcEngine`.

    **3. Video data acquisition**

    The `OnCaptureVideoFrame` and `OnPreEncodeVideoFrame` callbacks are added with a new parameter called `sourceType`, which is used to indicate the specific video source type.

    **4. Channel media options**

    * `PublishCustomAudioTrackEnableAec` in `ChannelMediaOptions` is deleted. Use `PublishCustomAudioTrack` instead.
    * `PublishTrancodedVideoTrack` in `ChannelMediaOptions` is renamed to `PublishTranscodedVideoTrack`.
    * `PublishCustomAudioSourceId` in `ChannelMediaOptions` is renamed to `PublishCustomAudioTrackId`.

    **5. Local video mixing (Windows)**

    * The `VideoInputStreams` in `LocalTranscoderConfiguration` is changed to `VideoInputStreams`.
    * The `MEDIA_SOURCE_TYPE` in `TranscodingVideoStream` is changed to `VIDEO_SOURCE_TYPE`.

    **6. Virtual sound card (macOS)**

    As of v4.2.0, Agora supports third-party virtual sound cards. You can use a third-party virtual sound card as the audio input or output device for the SDK. You can use the `stateChanged` callback to see whether the current input or output device selected by the SDK is a virtual sound card.

    <CalloutContainer type="info">
      <CalloutDescription>
        If you set AgoraALD or Soundflower as the default input or output device when joining a channel, you will not hear audio.
      </CalloutDescription>
    </CalloutContainer>

    **7. Default video encoding resolution**

    As of this release, the SDK optimizes the video encoder algorithm and upgrades the default video encoding resolution from 640 × 360 to 960 × 540 to accommodate improvements in device performance and network bandwidth, providing users with a full-link HD experience in various audio and video interaction use-cases.

    You can call the `SetVideoEncoderConfiguration` method to set the expected video encoding resolution in the video encoding parameters configuration.

    <CalloutContainer type="info">
      <CalloutDescription>
        In use-cases such as 1-on-1 video calls and video group chats, the increase in the default resolution affects the aggregate resolution and thus the billing rate. For example, before this release, in a 1-on-1 video call use-case, the default aggregate resolution of subscribed video was 460,800 (640 × 360 × 2) and was billed as HD type; as of this release, the default aggregate resolution in the same use-case is 1,036,800 (960 × 540 × 2) and is billed as Full HD type.
      </CalloutDescription>
    </CalloutContainer>

    **8. Miscellaneous**

    * `OnApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.

    * The `IAudioFrameObserver` class is renamed to `IAudioPcmFrameSink`, thus the prototypes of the following methods are updated accordingly:
      * `OnFrame`
      * `RegisterAudioFrameObserver` \[1/2] and `RegisterAudioFrameObserver`\[2/2] in `IMediaPlayer`

    * `EnableDualStreamMode`\[1/2] and `EnableDualStreamMode`\[2/2] are deprecated. Use `SetDualStreamMode`\[1/2] and `SetDualStreamMode`\[2/2] instead.

    * `StartChannelMediaRelay`, `UpdateChannelMediaRelay`, `StartChannelMediaRelayEx`, and `UpdateChannelMediaRelayEx` are deprecated. Use `StartOrUpdateChannelMediaRelay`And `StartOrUpdateChannelMediaRelayEx` instead.

    #### New features [#new-features-126]

    **1. AI Noise Suppression**

    This release introduces public APIs for the AI Noise Suppression function. Once enabled, the SDK automatically detects and reduces background noises. Whether in bustling public venues or real-time competitive arenas that demand lightning-fast responsiveness, this function guarantees optimal audio clarity, providing users with an elevated audio experience. You can enable this function through the newly-introduced `setAINSMode` method and set the noise suppression mode to balance, aggressive, or low latency according to your use-case.

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges separately for this function. See [AI Noise Suppression unit pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. Enhanced Virtual Background**

    To increase the fun of real-time video calls and protect user privacy, this version has enhanced the Virtual Background feature. You can now set custom backgrounds of various types by calling the `EnableVirtualBackground` method, including:

    * Process the background as Alpha information without replacement, only separating the portrait and the background. This can be combined with the local video mixing feature to achieve a portrait-in-picture effect.
    * Replace the background with various formats of local videos.

    See [Virtual Background documentation](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    **3. Video scenario settings**

    This release introduces `SetVideoScenario` for setting the video application scene. The SDK will automatically enable the best practice strategy based on different scenes, adjusting key performance indicators to optimize video quality and improve user experience. Whether it is a formal business meeting or a casual online gathering, this feature ensures that the video quality meets the requirements.

    Currently, this feature provides targeted optimizations for real-time video conferencing use-cases, including:

    * Automatically activate multiple anti-weak-network technologies to enhance the capability and performance of low-quality video streams in meeting use-cases where high bitrates are required, ensuring smoothness when multiple streams are subscribed by the receiving end.
    * Monitor the number of subscribers for the high-quality and low-quality video streams in real time, dynamically adjusting the configuration of the high-quality stream and dynamically enabling or disabling the low-quality stream, to save uplink bandwidth and consumption.

    **4. Local video mixing**

    On Windows, this release adds the `OnLocalVideoTranscoderError` callback. When there is an error in starting or updating the local video mixing, the SDK triggers this callback to report the reason for the failure.

    On Android, iOS, and macOS, this release adds the local video mixing feature. You can use the `StartLocalVideoTranscoder` method to mix and render multiple video streams locally, such as camera-captured video, screen sharing streams, video files, images, etc. This allows you to achieve custom layouts and effects, making it easy to create personalized video display effects to meet various use-case requirements, such as remote meetings, live streaming, online education, while also supporting features like portrait-in-picture effect.

    Additionally, the SDK provides the `UpdateLocalTranscoderConfiguration` method and the `OnLocalVideoTranscoderError` callback. After enabling local video mixing, you can use the `UpdateLocalTranscoderConfiguration` method to update the video mixing configuration. Where an error occurs in starting the local video mixing or updating the configuration, you can get the reason for the failure through the `OnLocalVideoTranscoderError` callback.

    <CalloutContainer type="info">
      <CalloutDescription>
        Local video mixing requires more CPU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
      </CalloutDescription>
    </CalloutContainer>

    **5. Cross-device synchronization**

    In real-time collaborative singing use-cases, network issues can cause inconsistencies in the downlinks of different client devices. To address this, this release introduces `GetNtpWallTimeInMs` for obtaining the current Network Time Protocol (NTP) time. By using this method to synchronize lyrics and music across multiple client devices, users can achieve synchronized singing and lyrics progression, resulting in a better collaborative experience.

    **6. Instant frame rendering**

    This release adds the `EnableInstantMediaRendering` method to enable instant rendering mode for audio and video frames, which can speed up the first video or audio frame rendering after the user joins the channel.

    **7. Video rendering tracing**

    This release adds the `StartMediaRenderingTracing` and `StartMediaRenderingTracingEx` methods. The SDK starts tracing the rendering status of the video frames in the channel from the moment this method is called and reports information about the event through the `OnVideoRenderingTracingResult` callback.

    Agora recommends that you use this method in conjunction with the UI settings, such as buttons and sliders, in your app. For example, call this method when the user clicks the **Join Channel** button, and then get the indicators in the video frame rendering process through the `OnVideoRenderingTracingResult` callback. This enables developers to optimize the indicators and improve the user experience.

    #### Improvements [#improvements-144]

    **1. Voice changer**

    This release introduces the `SetLocalVoiceFormant` method that allows you to adjust the formant ratio to change the timbre of the voice. This method can be used together with the `SetLocalVoicePitch` method to adjust the pitch and timbre of voice at the same time, enabling a wider range of voice transformation effects.

    **2. Enhanced screen share (Android, iOS)**

    This release adds the `QueryScreenCaptureCapability` method, which is used to query the screen capture capabilities of the current device. To ensure optimal screen sharing performance, particularly in enabling high frame rates like 60 fps, Agora recommends you to query the device's maximum supported frame rate using this method beforehand.

    This release also adds the `SetScreenCaptureScenario` method, which is used to set the scenario type for screen sharing. The SDK automatically adjusts the smoothness and clarity of the shared screen based on the scenario type you set.

    **3. Improved compatibility with audio file types (Android)**

    As of v4.2.0, you can use the following methods to open files with a URI starting with `Content://` : `StartAudioMixing` \[2/2], `PlayEffect` \[3/3], `Open`, and `OpenWithMediaSource`.

    **4. Enhanced rendering compatibility (Windows)**

    This release enhances the rendering compatibility of the SDK. Issues like black screens caused by rendering failures on certain devices are fixed.

    **5. Audio and video synchronization**

    For custom video and audio capture use-cases, this release introduces `GetCurrentMonotonicTimeInMs` for obtaining the current Monotonic Time. By passing this value into the timestamps of audio and video frames, developers can accurately control the timing of their audio and video streams, ensuring proper synchronization.

    **6. Multi-camera capture and multi-screen capture**

    This release introduces `StartScreenCapture` \[2/2] (PC only) and `StartCameraCapture`. By calling these methods multiple times and specifying the `sourceType` parameter, developers can start capturing video streams from multiple cameras and screens for local video mixing or multi-channel publishing. This particularly useful for use-cases such as remote medical care and online education, where multiple cameras and displays need to be connected.

    **7. Channel media relay**

    This release introduces `StartOrUpdateChannelMediaRelay` and `StartOrUpdateChannelMediaRelayEx`, allowing for a simpler and smoother way to start and update media relay across channels. With these methods, developers can easily start the media relay across channels and update the target channels for media relay with a single method. Additionally, the internal interaction frequency has been optimized, effectively reducing latency in function calls.

    **8. Custom audio tracks**

    To better meet the needs of custom audio capture use-cases, this release adds `CreateCustomAudioTrack` and `DestroyCustomAudioTrack` for creating and destroying custom audio tracks. Two types of audio tracks are also provided for users to choose from, further improving the flexibility of capturing external audio source:

    * Mixable audio track: Supports mixing multiple external audio sources and publishing them to the same channel, suitable for multi-channel audio capture use-cases.
    * Direct audio track: Only supports publishing one external audio source to a single channel, suitable for low-latency audio capture use-cases.

    **9. Super resolution (Android, iOS)**

    To optimize the usability of super resolution, this release removes `EnableRemoteSuperResolution`. Super resolution no longer needs to be enabled manually. The SDK now automatically optimizes the resolution of the remote video based on the performance of the user's device.

    #### Issues fixed [#issues-fixed-155]

    This release fixed the following issues:

    **Windows**

    * When using Agora Media Player to play RTSP video streams, the video images sometimes appeared pixelated.
    * Adding an Alpha channel to an image in PNG or GIF format failed when the local client mixed video streams.
    * After joining the channel, remote users saw a watermark even though the watermark was deleted.
    * If a watermark was added after starting screen sharing, the watermark was not displayed on the screen.
    * When joining a channel and accessing an external camera, calling `SetDevice` to specify the video capture device as the external camera did not take effect.
    * When trying to outline the shared window and put it on top, the shared window did not stay on top of other windows.

    **Android**

    * Occasional crashes occurred on Android devices when users joined or left a channel.
    * Occasional failure when enabling in-ear monitoring.
    * Occasional echo.
    * Crashes occurred after users set the video resolution to 3840 × 2160 and started CDN streaming on Xiaomi Redmi 9A devices.
    * In real-time chorus use-cases, remote users heard noises and echoes when an OPPO R11 device joined the channel in the loudspeaker mode.
    * When the playback of the local music finished, the `OnAudioMixingFinished` callback was not properly triggered.
    * When using a video frame observer, the first video frame was occasionally missed on the receiver's end.
    * When sharing screens in use-cases involving multiple channels, remote users occasionally saw black screens.
    * Switching to the rear camera with the virtual background enabled occasionally caused the background to be inverted.
    * Abnormal client status caused by an exception in the `OnRemoteAudioStateChanged` callback.

    **iOS**

    * Occasional loss of the `OnFirstRemoteVideoFrame` callback during channel media relay.
    * The receiver actively subscribed to the high-quality stream but unexpectedly received a low-quality stream.
    * Abnormal client status cased by an exception in the `OnRemoteAudioStateChanged` callback.

    **macOS**

    * The receiver was receiving the low-quality stream originally and automatically switched to the high-quality stream after a few seconds.
    * Occasional screen jitter during screen sharing.
    * If the rendering view of the player was set as a `UIViewController`'s view, the video was zoomed from the bottom-left corner to the middle of the screen when entering the full-screen mode.
    * When joining a channel and accessing an external camera, calling `SetDevice` to specify the video capture device as the external camera did not take effect.

    **All platforms**

    * When the host frequently switched the user role between broadcaster and audience in a short period of time, the audience members could not hear the audio of the host.
    * Playing audio files with a sample rate of 48 kHz failed.
    * When there were multiple video streams in a channel, calling some video enhancement APIs occasionally failed.

    #### API changes [#api-changes-80]

    **Added**

    * `StartCameraCapture`
    * `StopCameraCapture`
    * `StartScreenCapture`\[2/2] (Windows, macOS)
    * `StopScreenCapture`\[2/2] (Windows, macOS)
    * `StartOrUpdateChannelMediaRelay`
    * `StartOrUpdateChannelMediaRelayEx`
    * `GetNtpWallTimeInMs`
    * `SetVideoScenario`
    * `GetCurrentMonotonicTimeInMs`
    * `OnLocalVideoTranscoderError`
    * `startLocalVideoTranscoder`（macOS, iOS, Android）
    * `updateLocalTranscoderConfiguration`（macOS, iOS, Android）
    * `QueryScreenCaptureCapability`  (iOS, Android)
    * `SetScreenCaptureScenario`  (iOS, Android)
    * `CreateAudioCustomTrack`
    * `DestroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AUDIO_TRACK_TYPE`
    * `VIDEO_APPLICATION_SCENARIO_TYPE`
    * `SCREEN_CAPTURE_FRAMERATE_CAPABILITY`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * The `sourceType` parameter in `OnCaptureVideoFrame` and `OnPreEncodeVideoFrame` callbacks
    * The `BACKGROUND_NONE` and `BACKGROUND_VIDEO` enumerators in `BACKGROUND_SOURCE_TYPE`
    * `EnableInstantMediaRendering`
    * `StartMediaRenderingTracing`
    * `StartMediaRenderingTracingEx`
    * `OnVideoRenderingTracingResult`
    * `MEDIA_TRACE_EVENT`
    * `VideoRenderingTracingInfo`

    **Deprecated**

    * `EnableDualStreamMode`\[1/2]
    * `EnableDualStreamMode`\[2/2]
    * `StartChannelMediaRelay`
    * `StartChannelMediaRelayEx`
    * `UpdateChannelMediaRelay`
    * `UpdateChannelMediaRelayEx`
    * `OnChannelMediaRelayEvent`
    * `CHANNEL_MEDIA_RELAY_EVENT`

    **Deleted**

    * `StartPrimaryScreenCapture`  (Windows)
    * `StartSecondaryScreenCapture`  (Windows)
    * `StopPrimaryScreenCapture ` (Windows)
    * `StopSecondaryScreenCapture ` (Windows)
    * `StartPrimaryCameraCapture`  (Windows)
    * `StartSecondaryCameraCapture` (Windows, iOS)
    * `StopPrimaryCameraCapture`  (Windows)
    * `StopSecondaryCameraCapture ` (Windows, iOS)
    * `OnApiCallExecuted`
    * `PublishCustomAudioTrackEnableAec ` in` ChannelMediaOptions`
    * `EnableRemoteSuperResolution`
    * `superResolutionType` in `RemoteVideoStats`

    ### v4.1.0 [#v410-8]

    v4.1.0 was released on December 20, 2022.

    #### Compatibility changes [#compatibility-changes-80]

    This release deletes the `EnableDualStreamMode` \[2/3] method and the `sourceType` parameter in `EnableDualStreamMode` \[3/3], because the SDK supports enabling dual-stream mode for various video sources captured by custom capture or SDK; you no longer need to specify the video source type.

    #### New features [#new-features-127]

    **1. In-ear monitoring**

    This release adds support for in-ear monitoring. You can call `EnableInEarMonitoring` to enable the in-ear monitoring function.

    After successfully enabling the in-ear monitoring function, you can call `RegisterAudioFrameObserver` to register the audio observer, and the SDK triggers the `OnEarMonitoringAudioFrame` callback to report the audio frame data. You can use your own audio effect processing module to preprocess the audio frame data of the in-ear monitoring to implement custom audio effects. Agora recommends that you choose one of the following two methods to set the audio data format of the in-ear monitoring:

    * Call the `SetEarMonitoringAudioFrameParameters` method to set the audio data format of in-ear monitoring. The SDK calculates the sampling interval based on the parameters in this method and triggers the `OnEarMonitoringAudioFrame` callback based on the sampling interval.
    * Set the audio data format in the return value of the `GetEarMonitoringAudioParams` callback. The SDK calculates the sampling interval based on the return value of the callback and triggers the `OnEarMonitoringAudioFrame` callback based on the sampling interval.

    To adjust the in-ear monitoring volume, you can call `SetInEarMonitoringVolume`.

    **2. Audio capture device test (Android)**

    This release adds support for testing local audio capture devices before joining a channel. You can call `StartRecordingDeviceTest` to start the audio capture device test. After the test is complete, call the `StopPlaybackDeviceTest` method to stop the audio capture device test.

    **3. Local network connection types**

    To make it easier for users to know the connection type of the local network at any stage, this release adds the `GetNetworkType` method. You can use this method to get the type of network connection in use. The available values are `UNKNOWN`, `DISCONNECTED`, `LAN`, `WIFI`, `2G`, `3G`, `4G`, and `5G`. When the local network connection type changes, the SDK triggers the `OnNetworkTypeChanged` callback to report the current network connection type.

    **4. Audio stream filter**

    This release introduces filtering audio streams based on volume. Once this function is enabled, the Agora server ranks all audio streams by volume and transports the three audio streams with the highest volumes to the receivers by default. The number of audio streams to be transported can be adjusted; contact [support@agora.io](mailto\:support@agora.io) to adjust this number according to your use-case.

    Agora also supports publishers in choosing whether the audio streams being published are to be filtered based on volume. Streams that are not filtered bypass this filter mechanism and are transported directly to the receivers. In use-cases with a number of publishers, enabling this function helps reduce the bandwidth and device system pressure for the receivers.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this function, contact [support@agora.io](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **5. Dual-stream mode**

    This release optimizes the dual-stream mode. You can call `EnableDualStreamMode` and `EnableDualStreamModeEx` before and after joining a channel.

    The implementation of subscribing to a low-quality video stream is expanded. The SDK enables the low-quality video stream auto mode on the sender by default (the SDK does not send low-quality video streams). Follow these steps to enable sending low-quality video streams:

    1. The host at the receiving end calls `SetRemoteVideoStreamType` or `SetRemoteDefaultVideoStreamType` to initiate a low-quality video stream request.
    2. After receiving the application, the sender automatically switches to sending low-quality video stream mode.

    If you want to modify this default behavior, you can call `SetDualStreamMode`\[1/2] or `SetDualStreamMode`\[2/2] and set the `mode` parameter to `DISABLE_SIMULCAST_STREAM` (never send low-quality video streams) or `ENABLE_SIMULCAST_STREAM` (always send low-quality video streams).

    **6. Loopback device (Windows)**

    The SDK uses the playback device as the loopback device by default. As of 4.1.0, you can specify a loopback device separately and publish the captured audio to the remote end.

    * `SetLoopbackDevice`: Specifies the loopback device. If you do not want the current playback device to be the loopback device, you can call this method to specify another device as the loopback device.
    * `GetLoopbackDevice`: Gets the current loopback device.
    * `FollowSystemLoopbackDevice`: Whether the loopback device follows the default playback device of the system.

    **7. Spatial audio effect**

    This release adds the following features applicable to spatial audio effect use-cases, which can effectively enhance the user's sense-of-presence experience in virtual interactive use-cases.

    * Sound insulation area: You can set a sound insulation area and sound attenuation parameter by calling `SetZones`. When the sound source (which can be a user or the media player) and the listener belong to the inside and outside of the sound insulation area, the listener experiences an attenuation effect similar to that of the sound in the real environment when it encounters a building partition. You can also set the sound attenuation parameter for the media player and the user by calling `SetPlayerAttenuation` and `SetRemoteAudioAttenuation` respectively, and specify whether to use that setting to force an override of the sound attenuation parameter in `SetZones`.
    * Doppler sound: You can enable Doppler sound by setting the `enable_doppler` parameter in `SpatialAudioParams`. The receiver experiences noticeable tonal changes in the event of a high-speed relative displacement between the source and receiver (such as in a racing game use-case).
    * Headphone equalizer: You can use a preset headphone equalization effect by calling the `SetHeadphoneEQPreset` method to improve the audio experience for users with headphones.

    **8. Multiple cameras for video capture (iOS)**

    This release supports multi-camera video capture. You can call `EnableMultiCamera` to enable multi-camera capture mode, call `StartSecondaryCameraCapture` to start capturing video from the second camera, and then publish the captured video to the second channel.

    To stop using multi-camera capture, you need to call `StopSecondaryCameraCapture` to stop the second camera capture, then call `EnableMultiCamera` and set `enabled` to `false`.

    **9. Headphone equalization effect**

    This release adds the `SetHeadphoneEQParameters` method, which is used to adjust the low- and high-frequency parameters of the headphone EQ. This mainly useful in spatial audio use-cases. If you cannot achieve the expected headphone EQ effect after calling `SetHeadphoneEQPreset`, you can call setHeadphoneEQParameters to adjust the EQ.

    **10. Encoded video frame observer**

    This release adds the `SetRemoteVideoSubscriptionOptions` and `SetRemoteVideoSubscriptionOptionsEx` methods. When you call the `RegisterVideoEncodedFrameObserver` method to register a video frame observer for the encoded video frames, the SDK subscribes to the encoded video frames by default. If you want to change the subscription options, you can call these new methods to set them.

    For more information about registering video observers and subscription options, see API reference.

    **11. MPUDP (MultiPath UDP) (Beta)**

    As of this release, the SDK supports MPUDP protocol, which enables you to connect and use multiple paths to maximize the use of channel resources based on the UDP protocol. You can use different physical NICs on both mobile and desktop and aggregate them to effectively combat network jitter and improve transmission quality.

    To enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **12. Register extensions (Windows)**

    This release adds the `RegisterExtension` method for registering extensions. When using a third-party extension, you need to call the extension-related APIs in the following order:

    `loadExtensionProvider` -> `registerExtension` -> `setExtensionProviderProperty` -> `enableExtension`

    **13. Device management (Windows,macOS)**

    This release adds a series of callbacks to help you better understand the status of your audio and video devices:

    * `OnVideoDeviceStateChanged`: Occurs when the status of the video device changes.
    * `OnAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `OnAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **14. Camera capture options**

    This release adds the `followEncodeDimensionRatio` member in `CameraCapturerConfiguration`, which enables you to set whether to follow the video aspect ratio already set in `SetVideoEncoderConfiguration` when capturing video with the camera.

    **15. Multi-channel management**

    This release adds a series of multi-channel related methods that you can call to manage audio and video streams in multi-channel use-cases.

    * The `MuteLocalAudioStreamEx` and `MuteLocalVideoStreamEx` methods are used to cancel or resume publishing a local audio or video stream, respectively.
    * The `MuteAllRemoteAudioStreamsEx` and `MuteAllRemoteVideoStreamsEx` are used to cancel or resume the subscription of all remote users to audio or video streams, respectively.
    * The `StartRtmpStreamWithoutTranscodingEx`, `StartRtmpStreamWithTranscodingEx`, `UpdateRtmpTranscodingEx`, and `StopRtmpStreamEx` methods are used to implement Media Push in multi-channel use-cases.
    * The `StartChannelMediaRelayEx`, `UpdateChannelMediaRelayEx`, `PauseAllChannelMediaRelayEx`, `ResumeAllChannelMediaRelayEx`, and `StopChannelMediaRelayEx` methods are used to relay media streams across channels in multi-channel use-cases.
    * Adds the `LeaveChannelEx` \[2/2] method. Compared with the `LeaveChannelEx` \[1/2] method, a new `options` parameter is added, which is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **16. Video encoding preferences**

    In general use-cases, the default video encoding configuration meets most requirements. For certain specific use-cases, this release adds the `advanceOptions` member in `VideoEncoderConfiguration` for advanced settings of video encoding properties:

    * `compressionPreference`: The compression preferences for video encoding, which is used to select low-latency or high-quality video preferences.
    * `encodingPreference`: The video encoder preference, which is used to select adaptive preference, software encoder preference, or hardware encoder video preferences.

    **17. Client role switching**

    In order to enable users to know whether the switched user role is low-latency or ultra-low-latency, this release adds the `newRoleOptions` parameter to the `OnClientRoleChanged` callback. The value of this parameter is as follows:

    * `AUDIENCE_LATENCY_LEVEL_LOW_LATENCY` (1): Low latency.
    * `AUDIENCE_LATENCY_LEVEL_ULTRA_LOW_LATENCY` (2): Ultra-low latency.

    **18.** **Brand-new AI Noise Suppression**

    The SDK supports a new version of AI noise reduction (in comparison to the basic AI noise reduction in v4.0.0). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option. To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    #### Improvements [#improvements-145]

    **1. Video information change callback**

    This release optimizes the trigger logic of `OnVideoSizeChanged`, which can also be triggered and report the local video size change when `StartPreview` is called separately.

    **2. First video frame rendering（Windows）**

    This release speeds up the first video frame rendering time to improve the video experience.

    **3. Screen sharing**

    In addition to the usability enhancements detailed in the fixed issued section, this release includes a number of functional improvements to screen sharing, as follows:

    **Windows**:

    * New `minimizeWindow` member in `ScreenCaptureSourceInfo` to indicate whether the target window is minimized.
    * New `enableHighLight`, `highLightColor`, and `highLightWidth` members in `ScreenCaptureParameters` so that you can place a border around the target window or screen when screen sharing.
    * Compatibility with a greater number of mainstream apps, including WPS Office, Microsoft Office PowerPoint, Visual Studio Code, Adobe Photoshop, Windows Media Player, and Scratch.
    * Compatibility with additional devices and operating systems, including: Window 8 systems, devices without discrete graphics cards, and dual graphics devices.
    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a device with an Intel Core i7-9750H CPU @ 2.60 GHz or better.

    **macOS**:

    * Compatibility with additional devices and use-cases, including dual graphics devices and screen sharing using external screens.
    * Support for Ultra HD video (4K, 60 fps) on devices that meet the requirements. Agora recommends a 2021 16" M1 Macbook Pro or better.

    **4. Bluetooth permissions (Android)**

    To simplify integration, as of this release, you can use the SDK to enable Android users to use Bluetooth normally without adding the `BLUETOOTH_CONNECT` permission.

    **5. Relaying media streams across channels**

    This release optimizes the `UpdateChannelMediaRelay` method as follows:

    * Before v4.1.0: If the target channel update fails due to internal reasons in the server, the SDK returns the error code `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8), and you need to call the `UpdateChannelMediaRelay` method again.
    * v4.1.0 and later: If the target channel update fails due to internal server reasons, the SDK retries the update until the target channel update is successful.

    **6. Reconstructed AIAEC algorithm**

    This release reconstructs the AEC algorithm based on the AI method. Compared with the traditional AEC algorithm, the new algorithm can preserve the complete, clear, and smooth near-end vocals under poor echo-to-signal conditions, significantly improving the system's echo cancellation and dual-talk performance. This gives users a more comfortable call and live-broadcast experience. AIAEC is suitable for conference calls, chats, karaoke, and other use-cases.

    **7. Virtual background**

    This release optimizes the virtual background algorithm. Improvements include the following:

    * The boundaries of virtual backgrounds are handled in a more nuanced way and image matting is now extremely thin.
    * The stability of the virtual background is improved whether the portrait is still or moving, effectively eliminating the problem of background flickering and exceeding the range of the picture.
    * More application use-cases are now supported, and a user obtains a good virtual background effect day or night, indoors or out.
    * A larger variety of postures are now recognized, when half the body is motionless, the body is shaking, the hands are swinging, or there is fine finger movement. This helps to achieve a good virtual background effect in conjunction with many different gestures.

    **Other improvements**

    This release includes the following additional improvements:

    * Reduces the latency when pushing external audio sources.
    * Improves the performance of echo cancellation when using the `AUDIO_SCENARIO_MEETING` scenario.
    * Improves the smoothness of SDK video rendering.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network use-cases.
    * Reduces the CPU usage and power consumption of the local device when the host calls the `MuteLocalVideoStream` method. (Windows, macOS)

    #### Issues fixed [#issues-fixed-156]

    This release fixes the following issues:

    **Screen sharing issues**

    * **macOS**

      * In screen sharing use-cases on Mac devices, when the user minimized or closed a shared application window, another window of the same application was automatically shared.
      * In screen sharing use-cases, the system volume of the local user occasionally decreased.
      * In screen sharing use-cases, the shared window of a split screen was not highlighted correctly.
      * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
      * The uplink network quality reported by the `OnNetworkQuality` callback was inaccurate for the user who was sharing a screen.

    * **Windows**
      * In screen sharing use-cases, when the user minimized and then restored the shared window, the remote video occasionally switched to the low-quality stream.
      * When the host started screen sharing during live streaming, the audience members sometimes heard echoes.
      * In screen sharing use-cases, the system volume of the local user occasionally decreased.
      * In screen sharing use-cases, a black screen appeared when sharing a screen between a landscape monitor and a portrait monitor.
      * In screen sharing use-cases with a window excluded, the application crashed when the specified shared area exceeded the screen resolution.
      * The application failed to exclude a window using the `StartScreenCaptureByDisplayId` method for screen sharing.
      * In screen sharing use-cases, the screen seen by the remote user occasionally crashed, lagged, or displayed a black screen.
      * In screen sharing use-cases, when the user shared the screen by window, the mouse in the shared screen was not in its actual position.
      * When switching from a non-screen sharing use-case to a screen sharing one, the application occasionally crashed if the user did not switch the resolution accordingly.

    **Other issues**

    * **All**
      * The call `GetExtensionProperty` failed and returned an empty string.
      * When entering a live streaming room that has been played for a long time as an audience, the time for the first frame to be rendered was shortened.
      * When calling `SetVideoEncoderConfigurationEx` in the channel to increase the resolution of the video, it occasionally failed.
      * When using the Agora media player to play videos, after you played and paused the video, and then called the seek method to specify a new position for playback, the video image occasionally remained unchanged; if you called the `Resume` method to resume playback, the video was sometimes played at a speed faster than the original one.
      * Audience members heard buzzing noises when the host switched between speakers and earphones during live streaming.
      * Crashes occurred if you call the `RegisterAudioEncodedFrameObserver` method after failing to initialize  `RtcEngine`.

    * **Windows**
      * When `StopPreview` was called to disable the local video preview, the virtual background that had been set up was occasionally invalidated.
      * Crashes occasionally occurred when exiting a channel and joining it multiple times with virtual background enabled and set to blur effect.
      * If the local client used a camera with a resolution set to 1920 × 1080 as the video capture source, the resolution of the remote video was occasionally inconsistent with the local client.
      * When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `SetVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.

    * **Android**
      * After calling `SetCloudProxy` to set the cloud proxy, calling `JoinChannelEx` to join multiple channels failed.
      * In online meeting use-cases, the local user and the remote user occasionally could not hear each other after the local user was interrupted by a call.

    * **iOS**
      * Calling `StartAudioMixing` to play music files in the `ipod-library://item` path failed.
      * Different timestamps for audio and video data were obtained simultaneously and separately via `OnRecordAudioFrame` and `OnCaptureVideoFrame` callbacks.

    * **macOS**
      * After starting and stopping the audio capture device test, there was no sound when the audio playback device was subsequently started.
      * The `OnVideoPublishStateChanged` callback reported an inaccurate video source type.
      * When capturing video through the camera, if the video aspect ratio set in `CameraCapturerConfiguration` was inconsistent with that set in `SetVideoEncoderConfiguration`, the aspect ratio of the local video preview was not rendered according to the latter setting.

    #### API changes [#api-changes-81]

    **Added**

    * `EnableInEarMonitoring`
    * `SetEarMonitoringAudioFrameParameters`
    * `OnEarMonitoringAudioFrame`
    * `SetInEarMonitoringVolume`
    * `GetEarMonitoringAudioParams`
    * `StartRecordingDeviceTest` (Android)
    * `StopRecordingDeviceTest` (Android)
    * `GetNetworkType`
    * `SetRecordingDeviceVolume`  (Windows)
    * `isAudioFilterable` in `ChannelMediaOptions`
    * `SetDualStreamMode` \[1/2]
    * `SetDualStreamMode` \[2/2]
    * `SetDualStreamModeEx`
    * `SIMULCAST_STREAM_MODE`
    * `SetLoopbackDevice`
    * `GetLoopbackDevice`
    * `FollowSystemLoopbackDevice`
    * `SetZones`
    * `SetPlayerAttenuation`
    * `SetRemoteAudioAttenuation`
    * `MuteRemoteAudioStream`
    * `SpatialAudioParams`
    * `SetHeadphoneEQPreset`
    * `HEADPHONE_EQUALIZER_PRESET`
    * `EnableMultiCamera` (iOS)
    * `StartSecondaryCameraCapture` (iOS)
    * `StopSecondaryCameraCapture` (iOS)
    * `SetHeadphoneEQParameters`
    * `SetRemoteVideoSubscriptionOptions`
    * `SetRemoteVideoSubscriptionOptionsEx`
    * `LeaveChannelEx` \[2/2]
    * `VideoSubscriptionOptions`
    * `MuteLocalAudioStreamEx`
    * `MuteLocalVideoStreamEx`
    * `MuteAllRemoteAudioStreamsEx`
    * `MuteAllRemoteVideoStreamsEx`
    * `StartRtmpStreamWithoutTranscodingEx`
    * `StartRtmpStreamWithTranscodingEx`
    * `UpdateRtmpTranscodingEx`
    * `StopRtmpStreamEx`
    * `StartChannelMediaRelayEx`
    * `UpdateChannelMediaRelayEx`
    * `PauseAllChannelMediaRelayEx`
    * `ResumeAllChannelMediaRelayEx`
    * `StopChannelMediaRelayEx`
    * `followEncodeDimensionRatio` in `CameraCapturerConfiguration`
    * `hwEncoderAccelerating` in `LocalVideoStats`
    * `advanceOptions` in `VideoEncoderConfiguration`
    * `newRoleOptions` in `OnClientRoleChanged`
    * `AdjustUserPlaybackSignalVolumeEx`
    * `EnableAudioVolumeIndicationEx`
    * `OnVideoDeviceStateChanged` (Windows,macOS)
    * `OnAudioDeviceStateChanged ` (Windows,macOS)
    * `OnAudioDeviceVolumeChanged ` (Windows,macOS)
    * `SetParameters` in `IRtcEngine` (Windows)

    **Modified**

    * `EnableDualStreamMode` \[3/3]

    **Deprecated**

    * `StartEchoTest` \[2/3]
    * `OnApiCallExecuted`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * `EnableDualStreamMode` \[2/3]
    * Removes deprecated member parameters `backgroundImage` and `watermark` in `LiveTranscoding` class (Android/iOS/macOS)
    * Removes `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8) in `OnChannelMediaRelayEvent callback`

    ### v4.0.0 [#v400-8]

    v4.0.0 was released on September 28, 2022.

    #### Compatibility changes [#compatibility-changes-81]

    This release has optimized the implementation of some features, resulting in incompatibility with v4.0.0. The following are the main features with compatibility changes:

    * Multiple channel
    * Media stream publishing control
    * Warning codes

    After upgrading the SDK, you need to update the code in your app according to your business use-cases. For details, see [Migration guide](/en/realtime-media/video/reference/migration-guide).

    #### New features [#new-features-128]

    **1. Multiple media tracks**

    This release supports one `IRtcEngine` instance to collect multiple audio and video sources at the same time and publish them to the remote users by setting `IRtcEngineEx` and `ChannelMediaOptions.`

    * After calling `JoinChannel` to join the first channel, call `JoinChannelEx` multiple times to join multiple channels, and publish the specified stream to different channels through different user ID (`localUid`) and `ChannelMediaOptions` settings.
    * You can simultaneously publish multiple sets of video streams captured by multiple cameras or screen sharing by setting `publishSecondaryCameraTrack` and `publishSecondaryScreenTrack` in `ChannelMediaOptions`. (Windows)

    This release adds `CreateCustomVideoTrack` method to implement video custom capture. You can refer to the following steps to publish multiple custom captured video in the channel:

    1. Create a custom video track: Call the `CreateCustomVideoTrack` method to create a video track, and get the video track ID.
    2. Set the custom video track to be published in the channel: In each channel's `ChannelMediaOptions`, set the `customVideoTrackId` parameter to the ID of the video track you want to publish, and set `publishCustomVideoTrack` to `true`.
    3. Pushing an external video source: Call `PushVideoFrame`, and specify `videoTrackId` as the ID of the custom video track in step 2 in order to publish the corresponding custom video source in multiple channels.

    You can also experience the following features with the multi-channel capability:

    * Publish multiple sets of audio and video streams to the remote users through different user IDs (`uid`).
    * Mix multiple audio streams and publish to the remote users through a user ID (`uid`).
    * Combine multiple video streams and publish them to the remote users through a user ID (`uid`).

    **2. Ultra HD resolution (Beta) (Windows, macOS)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capture, encoding, decoding and rendering, and now supports 4K resolution. The improved FEC (Forward Error Correction) algorithm enables adaptive switches according to the frame rate and number of video frame packets, which further reduces the video stuttering rate in 4K scenes.

    Additionally, you can set the encoding resolution to 4K (3840 × 2160) and the frame rate to 60 fps when calling `SetVideoEncoderConfiguration`. The SDK supports automatic fallback to the appropriate resolution and frame rate if your device does not support 4K.

    This feature has certain requirements with regards to device performance and network bandwidth, and the supported upstream and downstream frame rates vary on different platforms. To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **3. Full HD and Ultra HD resolution (Beta) (Android, iOS)**

    In order to improve the interactive video experience, the SDK optimizes the whole process of video capturing, encoding, decoding and rendering. Starting from this version, it supports Full HD (FHD) and Ultra HD (UHD) video resolutions. You can set the `dimensions` parameter to 1920 × 1080 or higher resolution when calling the `SetVideoEncoderConfiguration` method. If your device does not support high resolutions, the SDK will automatically fall back to an appropriate resolution.

    The UHD resolution (4K, 60 fps) is currently in beta and requires certain device performance and network bandwidth. If you want to enable this feature, contact [technical support](mailto\:support@agora.io).

    High resolution typically means higher performance consumption. To avoid a decrease in experience due to insufficient device performance, Agora recommends that you enable FHD and UHD video resolutions on devices with better performance.

    The increase in the default resolution affects the aggregate resolution and thus the billing rate. See [Pricing](/en/realtime-media/video/reference/pricing).

    **4. Agora media player**

    To make it easier for users to integrate the Agora SDK and reduce the SDK's package size, this release introduces the Agora media player. You can then call the methods in the `IMediaPlayer` class to experience a series of functions:

    * Plays local and online media files.
    * Preloads media files.
    * Changes the CDN route for playing media files according your network conditions.
    * Shares the audio and video streams being played with remote users.
    * Caches data when playing media files.

    **5. Ultra-high audio quality**

    To make the audio clearer and restore more details, this release adds the `ULTRA_HIGH_QUALITY_VOICE` enumeration. In use-cases that mainly feature the human voice, such as chat or singing, you can call `SetVoiceBeautifierPreset` and use this enumeration to experience ultra-high audio quality.

    **6. Spatial audio**

    > ***NOTE:*** This feature is in experimental status. To enable this feature, contact [Technical Support](mailto\:support@agora.io).

    You can set the spatial audio for the remote user as following:

    * Local Cartesian Coordinate System Calculation Solution: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio by calculating the spatial coordinates of the remote user. You need to call `UpdateSelfPosition` and `UpdateRemotePosition` to update the spatial coordinates of the local and remote users respectively, so that the local user can hear the spatial audio of the remote user.
      ![Spatial effect](/images/video-sdk/video-call-spatial.png)

    * Local Cartesian Coordinate System Calculation Solution: This solution uses the `ILocalSpatialAudioEngine` class to implement spatial audio. You need to call `UpdateSelfPosition` and `UpdatePlayerPositionInfo` to update the spatial coordinates of the local user and media player, respectively, so that the local user can hear the spatial audio effect of media player.
      ![Spatial effect](/images/video-sdk/spatial-audio-effect.png)

    **7. Real-time chorus**

    This release gives real-time chorus the following abilities:

    * Two or more choruses are supported.
    * Each singer is independent of each other. If one singer fails or quits the chorus, the other singers can continue to sing.
    * Very low latency experience. Each singer can hear each other in real time, and the audience can also hear each singer in real time.

    This release adds the `AUDIO_SCENARIO_CHORUS` enumeration in `AUDIO_SCENARIO_TYPE`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **8. Enhanced channel management**

    To meet the channel management requirements of various business use-cases, this release adds the following functions to the `ChannelMediaOptions` structure:

    * Sets or switches the publishing of multiple audio and video sources.
    * Sets or switches channel profile and user role.
    * Sets or switches the stream type of the subscribed video.
    * Controls audio publishing delay.

    Set `ChannelMediaOptions` when calling `JoinChannel` or `JoinChannelEx` to specify the publishing and subscription behavior of a media stream, for example, whether to publish video streams captured by cameras or screen sharing, and whether to subscribe to the audio and video streams of remote users. After joining the channel, call `UpdateChannelMediaOptions` to update the settings in `ChannelMediaOptions` at any time, for example, to switch the published audio and video sources.

    **9. Screen sharing**

    This release optimizes the screen sharing function. You can enable this function through the following ways.

    On Windows and macOS:

    * Call the `StartScreenCaptureByDisplayId` method before joining a channel, and then call `JoinChannel[2/2]`  to join a channel and set `publishScreenTrack`or `publishSecondaryScreenTrack` as `true`.
    * Call the `StartScreenCaptureByDisplayId` method after joining a channel, and then call `UpdateChannelMediaOptions` to set `publishScreenTrack` or `publishSecondaryScreenTrack` as `true`.

    On Android and iOS:

    * Call the `StartScreenCapture` method before joining a channel, and then call `JoinChannel[2/2]`  to join a channel and set `publishScreenCaptureVideo` as `true`.
    * Call the `StartScreenCapture` method after joining a channel, and then call `UpdateChannelMediaOptions` to set `publishScreenCaptureVideo` as `true`.

    **10. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio and video streams. You can add the user ID that you want to subscribe to in your allowlist, or in your blocklist if you do not want to subscribe to. You can experience this feature through the following APIs, and in use-cases that involve multiple channels, you can call the following methods in the `IRtcEngineEx` interface.

    * `SetSubscribeAudioBlacklist`：Set the audio subscription blocklist.
    * `SetSubscribeAudioWhitelist`：Set the audio subscription allowlist.
    * `SetSubscribeVideoBlacklist`：Set the video subscription blocklist.
    * `SetSubscribeVideoWhitelist`：Set the video subscription allowlist.

    If a user is added in a blocklist and allowlist at the same time, only the blocklist takes effect.

    **11. Set audio scenarios**

    To make it easier to change audio scenarios, this release adds the `SetAudioScenario` method. For example, if you want to change the audio scenario from `AUDIO_SCENARIO_DEFAULT` to `AUDIO_SCENARIO_GAME_STREAMING` when you are in a channel, you can call this method.

    **12. Replace video feeds with images**

    This release supports replacing video feeds with images when publishing video streams. You can call the `EnableVideoImageSource` method to enable this function and choose your own images through the `options` parameter. If you disable this function, the remote users see the video feeds that you publish.

    **13. Local video transcoder**

    This release introduces local video transcoder with which you can locally merge multiple video streams into one. Common use-cases are as follows:

    When streaming or using media push, you can merge the frames of multiple anchors into one locally.

    To do this, you should merge multi-channel video streams collected locally (such as video captured by camera, screen sharing stream, video files and pictures) into one video stream. Then, release the merged stream in the channel.

    You can call the `StartLocalVideoTranscoder` method to enable the local video transcoder and call the `StopLocalVideoTranscoder` method to stop the local video transcoder; After the local video transcoder is enabled, you can call `UpdateLocalTranscoderConfiguration` to update the configuration of the local video transcoder.

    **14. Video device management**

    A video capture device may support a variety of video formats, each of which supports a different combination of video frame width, video frame height, and frame rate.

    This release introduces the `NumberOfCapabilities` and `GetCapability` method to obtain the number of video formats supported by video capture devices and the details of video frames under specified video formats. When you call the `StartPrimaryCameraCapture` or `StartSecondaryCameraCapture` method to capture video using camera, you can obtain the video with the specified video format.
    The SDK will automatically select the video format for video capture equipment according to your settings in `VideoEncoderConfiguration`. In general, you don't need to use this set of new methods.

    #### Improvements [#improvements-146]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v4.0.0 through the`LeaveChannel` and `JoinChannel `methods so that you don't need to take the time to call the `SwitchChannel `method.

    **2. Push external video frames**

    This releases supports pushing video frames in I422 format. You can call the `PushVideoFrame` method to push such video frames to the SDK.

    **3. Monitor the width and height of videos**

    This adds the `OnTextureSizeModify` callback that can be used to monitor any change in the width and height of videos.

    **4. Voice pitch of the local user**
    This release adds `voicePitch` in `AudioVolumeInfo` of `OnAudioVolumeIndication`. You can use `voicePitch` to get the local user's voice pitch and perform business functions such as rating for singing.

    **5. Video preview**

    This release improves the implementation logic of `StartPreview`. You can call the `StartPreview ` method to enable video preview at any time.

    **6. Video types of subscription**

    You can call the `SetRemoteDefaultVideoStreamType ` method to choose the video stream type when subscribing streams.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="unreal">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="unreal" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-10]

    ### Known issues [#known-issues-9]

    ### v4.5.1 [#v451-5]

    v4.5.1 was released on March 13, 2025.

    #### New features [#new-features-129]

    1. **AI conversation scenario**

       This version adds the `AUDIO_SCENARIO_AI_CLIENT` audio scenario specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on AI-generated voice characteristics, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. It enhances conversation continuity and reliability while adapting to complex network conditions.

    #### Improvements [#improvements-147]

    * Reduces the SDK initialization time on specific device models. (iOS)

    #### Issues fixed [#issues-fixed-157]

    This release fixes the following issues:

    * Apps that integrated the Agora SDK and set the `targetSdkVersion` to 34 encountered crashes when attempting to enable screen sharing for the first time on an Android 14 system. (Android)
    * When joining two or more channels simultaneously, and calling the `takeSnapshotEx` method to take screenshots of the local video streams in each channel consecutively, the screenshot of the first channel failed.
    * When using the `pause` method to pause playback, then calling `seek` to move to a specified position, and finally calling `play` to continue playback, the Media Player resumed from the position where it was paused, not the new specified position.
    * When using the Media Player, the file path of the media resource returned by the `getPlaySrc` did not change after calling the `switchSrc` method to switch to a new media resource.
    * When using Bluetooth headphones on specific device models for audio and video interactions, adjusting the phone volume would occasionally change the media volume instead of the Bluetooth volume. (Android)
    * During audio and video interactions, the local user occasionally experienced a black screen when watching the video streams of remote users. (Android)
    * On specific device models, after calling `setCameraExposureFactor` to set the exposure coefficient of the current camera at a specific angle of the device, the video screen occasionally became dark when the device was moved to another angle. (Android)
    * When playing a CDN live stream, the video occasionally froze for an extended period after recovering from an interruption. (Android)
    * When pushing video frames in i420 format to the channel, using CVPixelBuffer to handle these frames caused a crash. (iOS)
    * Calling `setupLocalVideo` to set up two views, then calling `enableFaceDetection` to start face detection, no face information can be detected in the subsequently passed views. (iOS)
    * In a screen sharing scenario, the receiving-end user saw a green line on the shared image. (iOS)
    * In the interactive live streaming scenario, after joining a channel to watch live streams using `string` user id, the audience members occasionally saw that the audio was not synchronized with the video.
    * Plugins sometimes did not work when using AI noise suppression and AI echo cancellation plugins at the same time.

    ### v4.5.0 [#v450-8]

    v4.5.0 was released on December 10, 2024.

    #### Compatibility changes [#compatibility-changes-82]

    This version includes optimizations to some features, including changes to SDK behavior, API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Changes in strong video noise suppression implementation**

       This version adjusts the implementation of strong video noise suppression. The `VIDEO_DENOISER_LEVEL` removes `VIDEO_DENOISER_LEVEL_STRENGTH`. Instead, after enabling video noise suppression by calling `setVideoDenoiserOptions`, you can call the `setBeautyEffectOptions` method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `setVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, you need to enable video noise suppression first and use specific settings as detailed in `setLowlightEnhanceOptions`.

    2. **Changes in camera plug and unplug status (macOS, Windows)**

       In previous versions, when the camera was unplugged and replugged, the `onVideoDeviceStateChanged` callback would report the device status as `MEDIA_DEVICE_STATE_ACTIVE(1)` (device in use). Starting from this version, after the camera is replugged, the device status will change to `MEDIA_DEVICE_STATE_IDLE(0)` (device ready).

    3. **16 KB memory page size (Android)**

       Starting from Android 15, the system adds support for 16 KB memory page size, as detailed in [Support 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes). To ensure the stability and performance of the app, starting from this version, the SDK supports 16 KB memory page size, ensuring seamless operation on devices with both 4 KB and 16 KB memory page sizes, enhancing compatibility and preventing crashes.

    4. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`COMPRESSION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/enum_compressionpreference.html) enumeration class, a new `PREFER_COMPRESSION_AUTO (-1)` enumeration is added, replacing the original `PREFER_QUALITY (1)` as the default value. In this mode, the SDK will automatically choose between `PREFER_LOW_LATENCY` and `PREFER_QUALITY` based on your video scene settings to achieve the best user experience.
       * In the [`DEGRADATION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/enum_degradationpreference.html) enumeration class, a new `MAINTAIN_AUTO (-1)` enumeration is added, replacing the original `MAINTAIN_QUALITY (1)` as the default value. In this mode, the SDK will automatically choose between `MAINTAIN_FRAMERATE`, `MAINTAIN_BALANCED`, and `MAINTAIN_RESOLUTION` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    #### New features [#new-features-130]

    1. **Live show scenario**

       This version adds the `APPLICATION_SCENARIO_LIVESHOW(3)` (Live Show) enumeration to [`VIDEO_APPLICATION_SCENARIO_TYPE`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/enum_videoapplicationscenariotype.html). You can call `setVideoScenario` to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency (no need to call `enableInstantMediaRendering`) to achieve better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the [`setLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (e.g., screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`setFilterEffectOptions`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (`.cube`) in the `config` parameter to achieve custom filter effects such as whitening, vivid, cool, black and white, etc. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file for quickly achieving a whitening filter effect.

    4. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the [`startLocalAudioMixer`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_startlocalaudiomixer) method to mix the audio streams from the local microphone, media player, sound card, and remote audio streams into a single audio stream, which can then be published to the channel. When you no longer need audio mixing, you can call the `stopLocalAudioMixer` method to stop local audio mixing. During the mixing process, you can call the `updateLocalAudioMixerConfiguration` method to update the configuration of the audio streams being mixed.

       Example use cases for this feature include:

       * By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
       * In live streaming use-cases, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
       * In educational use-cases, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels.

    5. **External `MediaProjection` (Android)**

       This version introduces the [`setExternalMediaProjection`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_setexternalmediaprojection) method, which allows you to set an external `MediaProjection` and replace the `MediaProjection` applied by the SDK.

       If you have the capability to apply for `MediaProjection` on your own, you can use this feature to achieve more flexible screen capture.

    6. **EGL context (Android)**

       This version introduces the [`setExternalRemoteEglContext`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_setexternalremoteeglcontext) method, which is used to set the EGL context for rendering remote video streams. When using Texture format video data for remote video self-rendering, you can use this method to replace the SDK's default remote EGL context, achieving unified EGL context management.

    7. **Color space settings**

       This version adds the `colorSpace` parameter to `VideoFrame` and `ExternalVideoFrame`. You can use this parameter to set the color space properties of the video frame. By default, the color space uses Full Range and BT.709 standard configuration. You can flexibly adjust according to your own capture or rendering needs, further enhancing the customization capabilities of video processing.

    8. **Other features**

       * The [`onLocalVideoStateChanged`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback adds the `LOCAL_VIDEO_STREAM_REASON_DEVICE_DISCONNECTED` enumeration, indicating that the currently used video capture device has been disconnected (e.g., unplugged). (Windows)
       * The [`MEDIA_DEVICE_STATE_TYPE`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/enum_mediadevicestatetype.html) adds the `MEDIA_DEVICE_STATE_PLUGGED_IN` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-148]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`takeSnapshot [2/2]`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotEx [2/2]`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_audiotrackconfig.html), which is used to control whether to enable 3A audio processing for custom audio capture tracks of the `AUDIO_TRACK_DIRECT` type. The default value of this parameter is `false`, meaning that audio processing is not enabled. Users can enable it as needed, enhancing the flexibility of custom audio processing.

    4. **Other improvements**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency. (Android, iOS)
       * Optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * Supports using virtual cameras in YV12 format as video capture devices. (Windows)
       * When calling `switchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `onPlayerEvent` callback will report the `PLAYER_EVENT_SWITCH_ERROR` event, indicating an error occurred during media resource switching.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Issues fixed [#issues-fixed-158]

    This version fixes the following issues:

    * When calling `startScreenCaptureByWindowId` to share the screen, the window capture area specified by `regionRect` was inaccurate, resulting in incorrect width and height of the screen sharing window seen by the receiving end. (Windows)
    * When the video source type of the sender is in JPEG format, the frame rate on the receiving end occasionally falls below expectations. (Android, iOS)
    * During audio and video interaction, after being interrupted by a system call, the user volume reported by the `onAudioVolumeIndication` callback was incorrect. (Android)
    * When the receiving end subscribes to the low-quality video stream by default and does not automatically subscribe to any video stream when joining the channel, calling `muteRemoteVideoStream(uid, false)` after joining the channel to resume receiving the video stream results in receiving the high-quality video stream, which is not as expected. (Android)
    * Occasional errors of not finding system files during audio and video interaction on Windows 7 systems. (Windows)
    * When calling `followSystemRecordingDevice` or `followSystemPlaybackDevice` to set the audio capture or playback device used by the SDK to not follow the system default audio playback device, the local audio state callback `onLocalAudioStateChanged` is not triggered when the audio device is removed. (Windows)
    * Occasional instances where the receiving end cannot hear the sender during audio and video interaction. (iOS)
    * During audio and video interaction, if the sender's device system version is iOS 17, the receiving end occasionally cannot hear the sender. (iOS)
    * In live streaming use-cases, the time taken to reconnect to the live room after the audience end disconnects due to network switching is longer than expected. (iOS)
    * No sound when playing online media resources using the media player after the app starts. (iOS)
    * Occasional instances of no sound in audio capture after resuming from being interrupted by other system apps during audio and video interaction. (iOS)
    * Calling `startAudioMixing [1/2]` and then immediately calling `pauseAudioMixing` to pause the music file playback does not take effect.

    ### v4.4.0 [#v440-8]

    v4.4.0 was released on August 29, 2024.

    #### Compatibility changes [#compatibility-changes-83]

    1. **Changes to API usage**

       Starting from this release, the \[Get]\([https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine)
       .html#api\_createagorartcengine) and \[Release]\([https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine)
       .html#api\_irtcengine\_release) methods are used for creation and destruction of engine instances, replacing the previous
       `createAgoraRtcEngine` and `release` methods. This change simplifies instance management. Details are as follows:

       * Creating an engine instance: Call \[Get]\([https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine)
         .html#api\_createagorartcengine) to create an `IRtcEngine` instance and return a pointer to
         `AgoraUERtcEngine`. You can directly call methods under \[IRtcEngine]\([https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine)
         .html#class\_irtcengine) using this pointer.

         ```cpp
         // Example of joining a channel using joinChannel
         AgoraUERtcEngine::Get()->joinChannel(TCHAR_TO_UTF8(*Token), TCHAR_TO_UTF8(*ChannelName), 0, ChannelMediaOptions);
         ```

       * Destroying an engine instance: After calling [Get](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_createagorartcengine) to create an `IRtcEngine` instance, call [Release](https://api-ref.agora.io/en/video-sdk/unreal/4.x/API/class_irtcengine.html#api_irtcengine_release) to destroy the engine instance and release related resources.

         ```cpp
         AgoraUERtcEngine::Release();
         ```

    #### New features [#new-features-131]

    1. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a
       physical sound card. You can enable the voice AI tuner feature by calling the `enableVoiceAITuner` method. Pass in
       the sound effect types supported in the `VOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice,
       husky singing voice, and so on.

    2. **Privacy manifest file (iOS)**

       To meet Apple's safety compliance requirements for app publication, the SDK now includes a privacy manifest file, `PrivacyInfo.xcprivacy`, detailing the SDK's API calls that access or use user data, along with a description of the types of data collected.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    If you need to publish an app with SDK versions prior to v4.4.0 to the Apple App Store, add the `PrivacyInfo.xcprivacy` file to your Xcode project.
    \:::

    1. **Multi-camera capture (Android)**

       This release introduces additional functionalities for Android camera capture:

       1. Support for capturing and publishing video streams from the third and fourth cameras:

          * `VIDEO_SOURCE_CAMERA_THIRD` (11) and `VIDEO_SOURCE_CAMERA_FOURTH` (12) in `VIDEO_SOURCE_TYPE` add support for Android, specifically for the third and fourth camera sources. This change allows you to specify up to four camera streams when initiating camera capture by calling `startCameraCapture`.
          * `publishThirdCameraTrack` and `publishFourthCameraTrack` in `ChannelMediaOptions` add support for Android. Set these parameters to `true` when joining a channel with `joinChannel`\[2/2] to publish video streams captured from the third and fourth cameras.

       2. Support for specifying cameras by camera ID:

          A new parameter `cameraId` is added to `CameraCapturerConfiguration`. For devices with multiple cameras, where `cameraDirection` cannot identify or access all available cameras, you can obtain the camera ID through Android's native system APIs and specify the desired camera by calling `startCameraCapture` with the specific `cameraId`.

    2. **Select different audio tracks for local playback and streaming**

       This release introduces the `selectMultiAudioTrack` method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, open the media file through the `openWithMediaSource` method and enable this function by setting the `enableMultiAudioTrack` parameter in `MediaSource`.

    3. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `CONTENT_INSPECT_IMAGE_MODERATION` enumeration is added in `CONTENT_INSPECT_TYPE`, which means using video moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `ContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       Additionally, this version introduces the `enableContentInspectEx` method, which supports simultaneous screenshot and upload of multiple video streams.

    4. **ID3D11Texture2D rendering (Windows)**

       As of this release, the SDK supports video formats of type ID3D11Texture2D, improving the rendering effect of video frames in game use-cases. You can set `format` to `VIDEO_TEXTURE_ID3D11TEXTURE2D` when pushing external raw video frames to the SDK by calling `pushVideoFrame`. By setting the `textureSliceIndex` property, you can determine the ID3D11Texture2D texture object to use.

    5. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a wildcard character. The token generated can be used to join any channel if you use the same user ID. In use-cases involving multiple channels, such as switching between different channels, using a wildcard token can prevent repeated application of tokens every time users join a new channel, which reduces the pressure on your token server. See [Generate wildcard tokens](/en/realtime-media/video/build/authenticate-users/deploy-token-server#generate-wildcard-tokens).

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    All 4.x SDKs support using wildcard tokens.
    \:::

    1. **Preloading channels**

       This release adds `preloadChannel` and `preloadChannelWithUserAccount` methods, which allows a user whose role is set as audience to preload channels before joining one. Calling the method can help shorten the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channels, Agora recommends that you use a wildcard token for preloading to prevent repeated application of tokens every time you join a new channel, thus saving the time for switching between channels. See [Generate wildcard tokens](/en/realtime-media/video/build/authenticate-users/deploy-token-server#generate-wildcard-tokens).

    2. **Publishing video streams from different sources** (Windows, macOS)

       This release adds the following members in `ChannelMediaOptions` to allow you to publish video streams captured from the third and fourth camera or screen:

       * `publishThirdCameraTrack`: Publishing the video stream captured from the third camera.
       * `publishFourthCameraTrack`: Publishing the video stream captured from the fourth camera.
       * `publishThirdScreenTrack`: Publishing the video stream captured from the third screen.
       * `publishFourthScreenTrack`: Publishing the video stream captured from the fourth screen.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
    \:::

    #### Improvements [#improvements-149]

    1. **Header file management simplification**

       To reference other header files, you can add them uniformly to `AgoraHeaderBase.h`, simplifying the management of header files in the project and facilitating future maintenance.

    2. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    #### Issues fixed [#issues-fixed-159]

    In Unreal Engine 5.3 and 5.4, adding the following code to the `/Source/xxx.Target.cs` file in your project to solve iOS memory allocation issues may lead to missing iOS compilation symbols. To address this issue, this version adds three function definitions (`StdMalloc`, `StdRealloc`, and `StdFree`) related to the standard library in the `UnrealMemory.cpp` file, ensuring proper handling of memory management needs when using the standard memory allocator (iOS).

    ```csharp
    if (Target.Platform == UnrealTargetPlatform.IOS)
    {
        bOverrideBuildEnvironment = true;
        GlobalDefinitions.Add("FORCE_ANSI_ALLOCATOR=1");
    }
    ```

    ### v4.2.1 [#v421-9]

    v4.2.1 was released on November 16, 2023.

    This the first GA release of the SDK. It provides a simple and user-friendly real-time interactive solution for Unreal Engine users.

    **Unreal Engine**

    The SDK for Unreal Engine provides a powerful set of C++ APIs, allowing developers to easily build games or apps with real-time interactive features. It can also leverage the powerful graphics engine functionality of Unreal Engine to add various visual effects and interactive performance to the app, providing users with a more immersive experience.

    **Unreal Blueprint**

    The SDK for Unreal Blueprint offers a visual interface and a set of intuitive and easy-to-use nodes. This enables developers to effortlessly implement real-time interactive features in games or apps within the Unreal project. No need to know C++ - just drag, connect, and configure nodes.

    Read more:

    * [SDK quickstart](/en/realtime-media/video/get-started-sdk)
    * [API Reference](/en/api-reference)

    Agora provides an [open source example project](https://github.com/AgoraIO-Extensions/Agora-Unreal-RTC-SDK/tree/main/Agora-Unreal-SDK-CPP-Example) on GitHub for your reference.

    If you have already integrated the 3.x version of the SDK and wish to upgrade to this version, please refer to [Migration Guide](/en/realtime-media/video/reference/migration-guide) for upgrade instructions.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="blueprint">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="blueprint" />

    This page provides the release notes for the Video SDK release streams used by Video Calling.

    * [Video SDK](#video-sdk)
    * [Notifications](#notifications)

    ## Video SDK [#video-sdk-11]

    ### Known issues [#known-issues-10]

    ### v4.5.1 [#v451-6]

    v4.5.1 was released on March 13, 2025.

    #### New features [#new-features-132]

    1. **AI conversation scenario**

       This version adds the `AUDIO_SCENARIO_AI_CLIENT` audio scenario specifically designed for interacting with the conversational AI agent created by [Conversational AI Engine](/en/introduction/conversational-ai). This scenario optimizes the audio transmission algorithm based on AI-generated voice characteristics, ensuring stable voice data transmission even in weak network conditions with up to 80% packet loss. It enhances conversation continuity and reliability while adapting to complex network conditions.

    #### Improvements [#improvements-150]

    * Reduces the SDK initialization time on specific device models. (iOS)

    #### Issues fixed [#issues-fixed-160]

    This release fixes the following issues:

    * Apps that integrated the Agora SDK and set the `targetSdkVersion` to 34 encountered crashes when attempting to enable screen sharing for the first time on an Android 14 system. (Android)
    * When joining two or more channels simultaneously, and calling the `TakeSnapshotEx` method to take screenshots of the local video streams in each channel consecutively, the screenshot of the first channel failed.
    * When using the `Pause` method to pause playback, then calling `Seek` to move to a specified position, and finally calling `Play` to continue playback, the Media Player resumed from the position where it was paused, not the new specified position.
    * When using the Media Player, the file path of the media resource returned by the `GetPlaySrc` did not change after calling the `SwitchSrc` method to switch to a new media resource.
    * When using Bluetooth headphones on specific device models for audio and video interactions, adjusting the phone volume would occasionally change the media volume instead of the Bluetooth volume. (Android)
    * During audio and video interactions, the local user occasionally experienced a black screen when watching the video streams of remote users. (Android)
    * On specific device models, after calling `SetCameraExposureFactor` to set the exposure coefficient of the current camera at a specific angle of the device, the video screen occasionally became dark when the device was moved to another angle. (Android)
    * When playing a CDN live stream, the video occasionally froze for an extended period after recovering from an interruption. (Android)
    * When pushing video frames in i420 format to the channel, using CVPixelBuffer to handle these frames caused a crash. (iOS)
    * Calling `SetupLocalVideo` to set up two views, then calling `EnableFaceDetection` to start face detection, no face information can be detected in the subsequently passed views. (iOS)
    * In a screen sharing scenario, the receiving-end user saw a green line on the shared image. (iOS)
    * In the interactive live streaming scenario, after joining a channel to watch live streams using `string` user id, the audience members occasionally saw that the audio was not synchronized with the video.
    * Plugins sometimes did not work when using AI noise suppression and AI echo cancellation plugins at the same time.

    ### v4.5.0 [#v450-9]

    v4.5.0 was released on December 10, 2024.

    #### Compatibility changes [#compatibility-changes-84]

    This version includes optimizations to some features, including changes to SDK behavior and API renaming and deletion. To ensure normal operation of the project, update the code in the app after upgrading to this release.

    1. **Changes in strong video noise suppression implementation**

       This version adjusts the implementation of strong video noise suppression. The `VIDEO_DENOISER_LEVEL_STRENGTH` enumeration is removed from `EUABT_VIDEO_DENOISER_LEVEL`. Instead, after enabling video noise suppression by calling `SetVideoDenoiserOptions`, you can call the `SetBeautyEffectOptions` method to enable the beauty skin smoothing feature. Using both together will help achieve better video noise suppression effects. For strong noise suppression, it is recommended to set the skin smoothing parameters as detailed in `SetVideoDenoiserOptions`.

       Additionally, due to this adjustment, to achieve the best low-light enhancement effect with a focus on image quality, enable video noise suppression first and use specific settings as detailed in `SetLowlightEnhanceOptions`.

    2. **Changes in camera plug and unplug status (macOS, Windows)**

       In previous versions, when the camera was unplugged and replugged, the `OnVideoDeviceStateChanged` callback would report the device status as `MEDIA_DEVICE_STATE_ACTIVE(1)` (device in use). Starting from this version, after the camera is replugged, the device status will change to `MEDIA_DEVICE_STATE_IDLE(0)` (device ready).

    3. **Changes in video encoding preferences**

       To enhance the user’s video interaction experience, this version optimizes the default preferences for video encoding:

       * In the [`ECOMPRESSION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/enum_compressionpreference.html) enumeration class, a new `PREFER_COMPRESSION_AUTO (-1)` enumeration is added, replacing the original `PREFER_QUALITY (1)` as the default value. In this mode, the SDK will automatically choose between `PREFER_LOW_LATENCY` or `PREFER_QUALITY` based on your video scene settings to achieve the best user experience.
       * In the [`EUABT_DEGRADATION_PREFERENCE`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/enum_degradationpreference.html) enumeration class, a new `MAINTAIN_AUTO (-1)` enumeration is added, replacing the original `MAINTAIN_QUALITY (1)` as the default value. In this mode, the SDK will automatically choose between `MAINTAIN_FRAMERATE`, `MAINTAIN_BALANCED`, or `MAINTAIN_RESOLUTION` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

    4. **16 KB memory page size (Android)**

       Starting from Android 15, the system adds support for 16 KB memory page size, as detailed in [Support 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes). To ensure the stability and performance of the app, starting from this version, the SDK supports 16 KB memory page size, ensuring seamless operation on devices with both 4 KB and 16 KB memory page sizes, enhancing compatibility and preventing crashes.

    #### New features [#new-features-133]

    1. **Live show scenario**

       This version adds the `APPLICATION_SCENARIO_LIVESHOW(3)` (Live Show) enumeration to [`EVIDEO_APPLICATION_SCENARIO_TYPE`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/enum_videoapplicationscenariotype.html). You can call `SetVideoScenario` to set the video business scenario to show room. In this scenario, fast video rendering and high image quality are crucial. The SDK implements several performance optimizations, such as enabling accelerated audio and video frame rendering to minimize first-frame latency (no need to call `EnableInstantMediaRendering`) to achieve better image quality and bandwidth efficiency.

    2. **Maximum frame rate for video rendering**

       This version adds the [`SetLocalRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`SetRemoteRenderTargetFps`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_setremoterendertargetfps) methods, which support setting the maximum frame rate for video rendering locally and remotely. The actual frame rate for video rendering by the SDK will be as close to this value as possible.

       In use-cases where the frame rate requirement for video rendering is not high (e.g., screen sharing, online education) or when the remote end uses mid-to-low-end devices, you can use this set of methods to limit the video rendering frame rate, thereby reducing CPU consumption and improving system performance.

    3. **Filter effects**

       This version introduces the [`SetFilterEffectOptions`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_setfiltereffectoptions) method. You can pass a cube map file (`.cube`) in the `config` parameter to implement custom filter effects such as whitening, vivid, cool, black and white, etc. Additionally, the SDK provides a built-in `built_in_whiten_filter.cube` file for quickly achieving a whitening filter effect.

    4. **Other features**

       * The [`OnLocalVideoStateChanged`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostatechanged) callback adds the `LOCAL_VIDEO_STREAM_REASON_DEVICE_DISCONNECTED` enumeration, indicating that the currently used video capture device has been disconnected (for example, unplugged). (Windows)
       * [`EMEDIA_DEVICE_STATE_TYPE`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/enum_mediadevicestatetype.html) adds the `MEDIA_DEVICE_STATE_PLUGGED_IN` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-151]

    1. **Virtual background algorithm optimization**

       This version upgrades the virtual background algorithm, making the segmentation between the portrait and the background more accurate. There is no background exposure, the body contour of the portrait is complete, and the detail recognition of fingers is significantly improved. Additionally, the edges between the portrait and the background are more stable, reducing edge jumping and flickering in continuous video frames.

    2. **Snapshot at specified video observation points**

       This version introduces the [`TakeSnapshotWithConfig`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`TakeSnapshotWithConfigEx`](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengineex.html#api_irtcengineex_takesnapshotex2) methods. You can use the `config` parameter when calling these methods to take snapshots at specified video observation points, such as before encoding, after encoding, or before rendering, to achieve more flexible snapshot effects.

    3. **Other features**

       * In use-cases where Alpha transparency effects are achieved by stitching video frames and Alpha data, the rendering performance on the receiving end has been improved, effectively reducing stuttering and latency. (Android, iOS)
       * Optimizes the logic for calling `QueryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * Supports using virtual cameras in YV12 format as video capture devices. (Windows)
       * When calling `SwitchSrc` to switch between live streams or on-demand streams of different resolutions, smooth and seamless switching can be achieved. An automatic retry mechanism has been added in case of switching failures. The SDK will automatically retry 3 times after a failure. If it still fails, the `OnPlayerEvent` callback will report the `PLAYER_EVENT_SWITCH_ERROR` event, indicating an error occurred during media resource switching.
       * When calling `SetPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

    #### Issues fixed [#issues-fixed-161]

    This version fixes the following issues:

    * When calling `StartScreenCaptureByWindowId` to share the screen, the window capture area specified by `regionRect` was inaccurate, resulting in incorrect width and height of the screen sharing window seen by the receiving end. (Windows)
    * When the video source type of the sender is in JPEG format, the frame rate on the receiving end occasionally falls below expectations. (Android, iOS)
    * During audio and video interaction, after being interrupted by a system call, the user volume reported by the `OnAudioVolumeIndication` callback was incorrect. (Android)
    * When the receiving end subscribes to the low-quality video stream by default and does not automatically subscribe to any video stream when joining the channel, calling `MuteRemoteVideoStream(uid, false)` after joining the channel to resume receiving the video stream results in receiving the high-quality video stream. (Android)
    * Occasional errors of not finding system files during audio and video interaction on Windows 7 systems. (Windows)
    * When calling `FollowSystemRecordingDevice` or `FollowSystemPlaybackDevice` to set the audio capture or playback device used by the SDK to not follow the default system audio playback device, the local audio state callback `OnLocalAudioStateChanged` is not triggered when the audio device is removed. (Windows)
    * Occasional instances where the receiving end cannot hear the sender during audio and video interaction. (iOS)
    * During audio and video interaction, if the sender's device system version is iOS 17, the receiving end occasionally cannot hear the sender. (iOS)
    * In live streaming use-cases, the time taken to reconnect to the live room after the audience end disconnects due to network switching is longer than expected. (iOS)
    * No sound when playing online media resources using the media player after the app starts. (iOS)
    * Occasional instances of no sound in audio capture after resuming from being interrupted by other system apps during audio and video interaction. (iOS)
    * Calling `StartAudioMixing` and then immediately calling `PauseAudioMixing` to pause the music file playback does not take effect.
    * Occasional crashes during audio and video interaction. (Android)

    ### v4.4.0 [#v440-9]

    v4.4.0 was released on August 29, 2024.

    #### Compatibility changes [#compatibility-changes-85]

    This version simplifies the way methods are called and callbacks are implemented in Blueprints.

    1. **Method calls**

       In this version, there is no need to manually maintain instance variables. You can directly retrieve the desired class at any point in your Blueprint using the `Get` node, and connect the appropriate function nodes to complete the call. This improvement makes calling methods in Blueprints more convenient and streamlines the development process.

       ![](/images/video-sdk/blueprint-assets/ue-bp-release440-01.png)

       The image below demonstrates how to obtain the [IRtcEngine](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#class_irtcengine) instance through the [GetAgoraRtcEngine](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#api_createagorartcengine) node and connect it to the [Initialize](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_initialize) node to perform initialization:

       ![](/images/video-sdk/blueprint-assets/ue-bp-release440-02.png)

    2. **Callback implementation**

       This version introduces the concept of `CallbackExecutor`. You can bind the corresponding `CallbackExecutor` in
       Blueprints using `EventHandler`, allowing for the execution of callbacks. This improvement offers the following advantages:

       * Callback implementation is more convenient.
       * Enhanced security, with bound callbacks executing without causing crashes when destroyed.
       * Easier reuse and code management.

       ![](/images/video-sdk/blueprint-assets/ue-bp-release440-03.png)

       The image below demonstrates how to obtain `EventHandler` through the `GetEventHandler` node and connect it to the `AddBlueprintCallbackExecutor` node to bind the specified `CallbackExecutor`, thereby executing the related callbacks under the [IRtcEngineEventHandler](https://api-ref.agora.io/en/video-sdk/blueprint/4.x/API/class_irtcengineeventhandler.html#class_irtcengineeventhandler) interface class:

       ![](/images/video-sdk/blueprint-assets/ue-bp-release440-04.png)

    #### New features [#new-features-134]

    1. **Voice AI tuner**

       This version introduces the voice AI tuner feature, which can enhance the sound quality and tone, similar to a
       physical sound card. You can enable the voice AI tuner feature by calling the `EnableVoiceAITuner` method. Pass in
       the sound effect types supported in the `EVOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice,
       husky singing voice, and so on.

    2. **Privacy manifest file (iOS)**

       To meet Apple's safety compliance requirements for app publication, the SDK now includes a privacy manifest file, `PrivacyInfo.xcprivacy`, detailing the SDK's API calls that access or use user data, along with a description of the types of data collected.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    If you need to publish an app with SDK versions prior to v4.4.0 to the Apple App Store, add the `PrivacyInfo.xcprivacy` file to your Xcode project.
    \:::

    1. **Multi-camera capture (Android)**

       This release introduces additional functionalities for Android camera capture:

       1. Support for capturing and publishing video streams from the third and fourth cameras:

          * `VIDEO_SOURCE_CAMERA_THIRD` (11) and `VIDEO_SOURCE_CAMERA_FOURTH` (12) in `EVIDEO_SOURCE_TYPE` add support for Android, specifically for the third and fourth camera sources. This change allows you to specify up to four camera streams when initiating camera capture by calling `StartCameraCapture`.
          * `publishThirdCameraTrack` and `publishFourthCameraTrack` in `FChannelMediaOptions` add support for Android. Set these parameters to `true` when joining a channel with `JoinChannelWithOptions` to publish video streams captured from the third and fourth cameras.

       2. Support for specifying cameras by camera ID:

          A new parameter `cameraId` is added to `FCameraCapturerConfiguration`. For devices with multiple cameras, where `cameraDirection` cannot identify or access all available cameras, you can obtain the camera ID through Android's native system APIs and specify the desired camera by calling `StartCameraCapture` with the specific `cameraId`.

    2. **Select different audio tracks for local playback and streaming**

       This release introduces the `SelectMultiAudioTrack` method that allows you to select different audio tracks for local playback and streaming to remote users. For example, in use-cases like online karaoke, the host can choose to play the original sound locally and publish the accompaniment in the channel. Before using this function, open the media file through the `OpenWithMediaSource` method and enable this function by setting the `EnableMultiAudioTrack` parameter in `FAgoraMediaSource`.

    3. **Update video screenshot and upload**

       To facilitate the integration of third-party video moderation services from Agora Extensions Marketplace, this version has the following changes:

       * The `CONTENT_INSPECT_IMAGE_MODERATION` enumeration is added in `ECONTENT_INSPECT_TYPE`, which means using video
         moderation extensions from Agora Extensions Marketplace to take video screenshots and upload them.
       * An optional parameter `serverConfig` is added in `FContentInspectConfig`, which is for server-side configuration related to video screenshot and upload via extensions from Agora Extensions Marketplace. By configuring this parameter, you can integrate multiple third-party moderation extensions and achieve flexible control over extension switches and other features. For more details, please contact [technical support](mailto\:support@agora.io).

       Additionally, this version introduces the `EnableContentInspectEx` method, which supports simultaneous screenshot and upload of multiple video streams.

    4. **Wildcard token**

       This release introduces wildcard tokens. Agora supports setting the channel name used for generating a token as a
       wildcard character. The token generated can be used to join any channel if you use the same user ID. In use-cases
       involving multiple channels, such as switching between different channels, using a wildcard token can prevent
       repeated application of tokens every time users join a new channel, which reduces the pressure on your token server. See [Generate wildcard tokens](/en/realtime-media/video/build/authenticate-users/deploy-token-server#generate-wildcard-tokens).

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    All 4.x SDKs support using wildcard tokens.
    \:::

    1. **Preloading channels**

       This release adds `PreloadChannel` and `PreloadChannelWithUserAccount` methods, which allow a user whose role is set as audience to preload channels before joining one. Calling the method can help shorten the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host.

       When preloading more than one channel, Agora recommends that you use a wildcard token for preloading to avoid repeated application of tokens every time you join a new channel, thus saving the time for switching between channels. See [Generate wildcard tokens](/en/realtime-media/video/build/authenticate-users/deploy-token-server#generate-wildcard-tokens).

    2. **Publishing video streams from different sources** (Windows, macOS)

       This release adds the following members in `FChannelMediaOptions` to allow you to publish video streams captured from the third and fourth camera or screen:

       * `publishThirdCameraTrack`: Publishing the video stream captured from the third camera.
       * `publishFourthCameraTrack`: Publishing the video stream captured from the fourth camera.
       * `publishThirdScreenTrack`: Publishing the video stream captured from the third screen.
       * `publishFourthScreenTrack`: Publishing the video stream captured from the fourth screen.

       <CalloutContainer type="info">
         <CalloutTitle>
           Note
         </CalloutTitle>
       </CalloutContainer>

    For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
    \:::

    #### Improvements [#improvements-152]

    1. **Improved rendering usability**

       When using the UImage widget, you can control the size of the displayed image by setting the properties of the Brush. Starting from this version, the **Size To Content** option is supported, allowing UImage to automatically adjust to the size of the incoming video frames from the remote end. This improvement enhances the usability of image rendering.

       ![](/images/video-sdk/blueprint-assets/ue-bp-release440-05.png)

    2. **Channel media relay**

       The number of target channels for media relay has been increased to 6. When calling `StartOrUpdateChannelMediaRelay` and `StartOrUpdateChannelMediaRelayEx`, you can specify up to 6 target channels.

    #### Issues fixed [#issues-fixed-162]

    In Unreal Engine 5.3 and 5.4, adding the following code to the `/Source/xxx.Target.cs` file in your project to solve iOS memory allocation issues may lead to missing iOS compilation symbols. To address this issue, this version adds three function definitions (`StdMalloc`, `StdRealloc`, and `StdFree`) related to the standard library in the `UnrealMemory.cpp` file, ensuring proper handling of memory management needs when using the standard memory allocator (iOS).

    ```csharp
    if (Target.Platform == UnrealTargetPlatform.IOS)
    {
        bOverrideBuildEnvironment = true;
        GlobalDefinitions.Add("FORCE_ANSI_ALLOCATOR=1");
    }
    ```

    ### v4.2.1 [#v421-10]

    This version was released on November 16, 2023.

    This the first release of Video SDK for Unreal Blueprint.

    #### New features [#new-features-135]

    Video SDK for Unreal Blueprint provides a simple and user-friendly real-time interactive solution for Unreal Engine users.

    Video SDK for Unreal Blueprint offers a visual interface and a set of intuitive and easy-to-use nodes. This enables developers to effortlessly implement real-time interactive features in games or apps within the Unreal project. You don't need to know C++, just drag, connect, and configure nodes.

    To integrate real-time engagement functionality into your app using Video SDK for Unreal Engine, see:

    * [SDK quickstart](/en/realtime-media/video/get-started-sdk)
    * [API reference](/en/api-reference/api-ref/rtc?platform=blueprint)

    Agora provides the open source [example project](https://github.com/AgoraIO-Extensions/Agora-Unreal-RTC-SDK/tree/main/Agora-Unreal-SDK-Blueprint-Example) on GitHub for your reference.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>
</_PlatformTabsGroup>

## Extensions [#extensions]

<_PlatformTabsGroup groupMode="structured" canonicalPlatform="web" platforms="[&#x22;web&#x22;,&#x22;android&#x22;,&#x22;ios&#x22;]" showTabs="true">
  <_PlatformPanel platform="web">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="web" />

    ## AI Noise Suppression [#ai-noise-suppression]

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges additionally for this extension. See [Pricing](/en/realtime-media/video/reference/pricing#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    ### v2.0.2 [#v202]

    Released on June 24, 2026.

    #### New features [#new-features-136]

    * Added background voice removal.
    * Suitable for noisy environments or scenarios with multiple speakers to further highlight the target voice and improve audio capture.

    ### v2.0.1 [#v201]

    Released on April 1, 2026.

    #### Compatibility changes [#compatibility-changes-86]

    This version no longer supports calling the `disable` method before `pipe` to disable the processor. Ensure that you call `pipe` before invoking `disable`.

    #### New features [#new-features-137]

    * Added the `setLogLevel` method to the `IAIDenoiserExtension` interface class to set the log level for the plugin and WASM module.
    * Added the `setLatency` method to the `IAIDenoiserProcessor` interface class to configure latency for noise reduction processing.

    #### Improvements [#improvements-153]

    * Updated the noise reduction algorithm for improved noise suppression, voice fidelity, and overall robustness.
    * Significantly improved voice fidelity after AI noise suppression in scenarios with sampling rates of 16 kHz and above.
    * Optimized CPU resource allocation strategy to enhance runtime efficiency.

    #### API changes [#api-changes-82]

    The implementation of callbacks has been revised in this version. The original callbacks `onloaderror`, `onoverload`, `ondump`, and `ondumpend` are deprecated. Use the `on` method with event names `"pipeerror"`, `"overload"`, `"dump"`, or `"dumpend"` to listen for the corresponding events instead.

    ### v1.1.0 [#v110]

    #### Improvement [#improvement]

    This release improves the calculation performance of the AI-powered noise suppression algorithm.

    #### New features [#new-features-138]

    This release adds the following APIs and parameters:

    * APIs:
      * `checkCompatibility`: Checks whether the AI Noise Suppression extension is supported on the current browser.
      * `setMode`: Sets the noise suppression mode as AI noise suppression or stationary noise suppression.
      * `setLevel`: Sets the AI noise suppression level.
    * Parameters:
      * `elapsedTime` in `onoverload`: Reports the time in ms that the extension needs to process one audio frame.

    For API details, see [AI Noise Suppression](/en/realtime-media/video/build/enhance-the-audio-experience/ai-noise-suppression).

    #### Compatibility changes [#compatibility-changes-87]

    This release brings the following changes:

    * AI Noise Suppression supports Agora Video SDK for Web v4.15.0 or later.
    * The extension has Wasm dependencies only. Because JS dependencies are removed, you need to publish the Wasm files located in the `node_modules/agora-extension-ai-denoiser/external` directory again. If you have enabled the Content Security Policy (CSP), you need to modify the CSP configuration. See [AI Noise Suppression](/en/realtime-media/video/build/enhance-the-audio-experience/ai-noise-suppression) for details.
    * The audio data is dumped in PCM format instead of WAV format.
    * To adjust the intensity of noise suppression, best practice is to call `setLevel`.

    ### v1.0.0 [#v100]

    First release.

    ## Noise suppression for use cases involving AI [#noise-suppression-for-use-cases-involving-ai]

    ### v1.0.0-beta2 [#v100-beta2]

    [`agora-conversational-ai-denoiser`](https://www.npmjs.com/package/agora-conversational-ai-denoiser) v1.0.0-beta2 was released on March 5, 2025, to enhance the user experience in applications powered by [Agora Conversational AI Engine](/en/introduction/conversational-ai).

    <CalloutContainer type="warning">
      <CalloutDescription>
        The `agora-conversational-ai-denoiser` plugin has high CPU usage. Agora recommends using it only for AI-related use cases.
      </CalloutDescription>
    </CalloutContainer>

    #### Key features [#key-features]

    * Significantly improved voice protection, especially for singing.
    * Reduced risk of audio capture and playback stuttering during operation.
    * When AI noise suppression is enabled, the default maximum AGC gain is reduced from 24dB to 12dB.

    ## Virtual background [#virtual-background]

    ### Key features [#key-features-1]

    * Seamless integration.
      * Integrate directly through an HTML `<script>` tag or through npm using:

        ```js
        import VirtualBackgroundExtension from 'agora-extension-virtual-background';
        ```

      * Works within Agora WebRTC video processing pipelines.
    * Support for multiple background types.
      * Blurred background: Users can blur their actual background with low, medium, or high blur intensity.
      * Image background: Allows replacing the background with an image (`HTMLImageElement`).
      * Video background: Supports setting a video as the virtual background.
      * Solid color background: Allows setting a solid color as the background.

    ### Browser support and limitations [#browser-support-and-limitations]

    * Safari and Firefox: Limited support.

      While the virtual background feature may work on Safari and Firefox, it is not officially supported due to performance limitations. Safari users may experience reduced performance due to browser-specific constraints, while Firefox users may encounter video freezing when minimizing the browser or switching tabs. For optimal performance and reliability, Agora recommends using the latest version of Chrome on desktop.

    * Mobile browsers: Not optimal.

      The virtual background feature requires significant CPU and GPU processing power, which exceeds the capabilities of most mobile devices. Due to these hardware-intensive requirements, performance on mobile browsers is inconsistent and varies across devices.

    ### v2.1.0 [#v210-1]

    v2.1.0 was released on April 29, 2025, with the following changes:

    * Optimizes memory and CPU usage.
    * Fixes black screen issues at specific resolutions.

    ### v2.0.0 [#v200-1]

    v2.0.0 was released on December 18, 2024.

    This release upgrades the extension algorithm to version 2.0.0. [Virtual Background 2.0.0](https://www.npmjs.com/package/agora-extension-virtual-background/v/2.0.0) provides a more distinct face edge and clearer and more stable video images.

    #### New features [#new-features-139]

    * Support for VP9 codec, which provides better video compression and quality.

    #### Improvements [#improvements-154]

    * Dynamic background switching. Users can change backgrounds without restarting the video stream.
    * Ability to disable or re-enable virtual backgrounds dynamically.
    * Processor optimization for better real-time segmentation.

    #### Upgrading considerations [#upgrading-considerations]

    Version 2.0.0 is suitable for users who prioritize quality over frame rate, especially in use-cases requiring:

    * Superior portrait edge detection
    * Complex background handling
    * Premium video quality

    It is recommended for high-end devices such as:

    * Apple M1 or M2
    * Latest iPhones (A13 Bionic and newer)
    * Premium Android devices (Snapdragon 865 or equivalent)

    Version 1.3.0 is suitable for mid-range devices and is recommended for users who prioritize smooth performance over edge precision, such as in standard video conferencing. It is recommended for use cases requiring:

    * Higher FPS
    * Lower resource consumption
    * Consistent performance

    Implementation guidelines:

    * For premium applications, implement device detection. Use 2.0.0 for capable devices and default to 1.3.0 for others.
    * For general applications, default to 1.3.0. Optionally, allow users to upgrade to 2.0.0 with a performance warning.

    ### v1.2.0 [#v120]

    v1.2.0 was released on December 10, 2023.

    #### Compatibility changes [#compatibility-changes-88]

    As of this version, the Virtual Background extension incorporates the necessary Wasm module. You no longer need to publish the Wasm file separately, and pass the `wasmDir` parameter when calling the `init` method to initialize the extension.

    After upgrading to this version, please modify your code accordingly.

    #### Improvements [#improvements-155]

    This release upgrades the background segmentation algorithm of the extension, optimizing the segmentation effects on the subject, edges, and fingers in complex static and dynamic backgrounds.

    #### Fixed issues [#fixed-issues-2]

    This release fixed the issue that `checkCompatibility` could return inaccurate results on specific devices.

    #### API changes [#api-changes-83]

    The `wasmDir` parameter of the `init` method is now optional.

    ### v1.1.3 [#v113]

    #### Fixed issues [#fixed-issues-3]

    This release fixes the occasional issue of jagged background images on Chrome for Android.

    ### v1.1.2 [#v112]

    #### New features [#new-features-140]

    You can now specify the `fit` property when calling `setOptions`. This sets how the background is resized to fit the container. For API details, see [Virtual background](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    #### Compatibility changes [#compatibility-changes-89]

    Virtual Background supports Agora Video SDK for Web v4.15.0 or later.

    ### v1.1.1 [#v111]

    #### New features [#new-features-141]

    You can now call `checkCompatibility` and test if the Virtual Background extension is supported on the current browser. For API details, see [Virtual background](/en/realtime-media/video/build/apply-video-effects/virtual-background).

    #### Fixed issues [#fixed-issues-4]

    A black bar is no longer displayed to the left of the virtual background.

    ### v1.1.0 [#v110-1]

    #### New features [#new-features-142]

    You can create multiple `VirtualBackgroundProcessor` instances to process multiple video streams.

    ### v1.0.0 [#v100-1]

    First release.

    ## Super Clarity extension [#super-clarity-extension]

    This extension leverages Agora's AI quality enhancement algorithm to intelligently improve video quality without altering the resolution, thereby optimizing the viewing experience at the receiving end. For integration steps, see [Super Clarity](/en/realtime-media/video/build/apply-video-effects/super-clarity).

    ### v2.0.1 [#v201-1]

    Released on April 1, 2026.

    This version optimizes the sharpening algorithm, improving video experience in some scenarios.

    ### v2.0.0 [#v200-2]

    Released on November 18, 2025.

    #### Improvements [#improvements-156]

    This version includes the following improvements:

    * Reduces extension size by approximately 30%.
    * Handles WebGL context loss to improve video robustness.
    * Improves smoothness when the sender app goes to the background by aligning frame rates.
    * Expands compatibility with Safari browser.

    ### v1.0.1 [#v101]

    Released on November 10, 2024. This is the first version of `agora-extension-super-clarity`.

    ## Watermark extension [#watermark-extension]

    ### v1.0.0 [#v100-2]

    Released on November 18, 2025.

    This is the first version of `agora-extension-video-watermark`. For integration steps, see [Watermark](/en/realtime-media/video/build/apply-video-effects/watermark).

    ## Video Compositor extension [#video-compositor-extension]

    This extension enables local users to seamlessly merge multiple video streams and images into a single video track. This feature allows for the simultaneous display of multiple video feeds in the same video container.

    ### v1.0.0-beta [#v100-beta]

    Released on October 25, 2022.

    This is the first version of `agora-extension-videp-compositor`. For integration steps, see [Video Compositor](/en/realtime-media/video/build/apply-video-effects/video-compositor).

    ## Beauty Effect extension [#beauty-effect-extension]

    This extension enables your users to apply beauty effects to their videos. They can adjust settings for whitening, skin smoothing, acne removal, and redness to achieve a natural beauty effect.

    ### v1.0.2-beta [#v102-beta]

    Released on November 26, 2022.

    This is the first version of `agora-extension-beauty-effect`. For integration steps, see [Beauty Effect](/en/realtime-media/video/build/apply-video-effects/beauty-effect).

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="android">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="android" />

    ## MetaKit extension [#metakit-extension]

    ### v2.2.0 [#v220-1]

    v2.2.0 was released on September 13, 2024.

    #### New features [#new-features-143]

    **Stickers**

    This version adds the sticker feature that uses the face capture driver and follows the character's head movements. The SDK provides subpackages for glasses (`material_sticker_glass`), masks (`material_sticker_facemask`), veils (`material_sticker_veil`), and dragon head hats (`material_sticker_dragonhat`). You can load the corresponding scene resources to quickly experience the effects of different stickers.

    **Portrait edge light**

    This release adds a new portrait edge light effect. To experience it, specify the subpackage resource as `material_effect_ray` when loading scene resources.

    **Advertising light text-to-image**

    This version adds a text-to-image feature for the advertising lights. When setting the advertising light effects, you can specify the text content through the `text` parameter and add animation effects through the `animation` parameter. This includes jumping, waving, or swaying, to make the text appear dynamically on the screen.

    #### Improvements [#improvements-157]

    This update adds support for `loadMaterial` and `unloadMaterial` in `setExtensionProperty`.

    * When using `loadMaterial` to load scene resources, you can specify the resource path of the required subpackage. The engine will automatically request the scene texture and render the scene.
    * If you need to switch to another scene, just use `loadMaterial` again to pass in another subpackage resource path. The engine will automatically switch to the new scene.
    * When you no longer need to experience the scene, use `unloadMaterial` to uninstall scene resources.

    This improvement significantly enhances the usability of the extension. You can quickly experience different functional use-cases by simply specifying different subpackage resource paths when loading.

    #### API changes [#api-changes-84]

    **Added**

    * `loadMaterial`
    * `unloadMaterial`

    ### v2.1.0 [#v210-2]

    v2.1.0 was released on March 6, 2024.

    #### Improvements [#improvements-158]

    This update optimizes the performance of the MetaKit extension and adds support for two new keys in `setExtensionProperty`: [`requestTexture`](/en/realtime-media/video/build/add-advanced-video-features/metakit#enable-texture-request) and [`switchTextureAvatarMode`](/en/realtime-media/video/build/add-advanced-video-features/metakit#switch-texture-scene). These replace the original `addSceneView` and `switchAvatarMode` functions, respectively. The new interface supports automatic generation and return of texture data, which is then directly rendered, previewed, encoded, and transmitted through the SDK. This enhancement improves rendering performance, reduces latency, and ensures more efficient operation and a better user experience.

    #### API changes [#api-changes-85]

    **Added**

    * [`requestTexture`](/en/realtime-media/video/build/add-advanced-video-features/metakit#enable-texture-request)
    * [`switchTextureAvatarMode`](/en/realtime-media/video/build/add-advanced-video-features/metakit#switch-texture-scene)

    ### v2.0.0 [#v200-3]

    v2.0.0 was released on February 23, 2024.

    This is the first release of the MetaKit extension. This extension integrates multiple AI technologies to provide users with diverse video enhancement functions in audio and video interaction use-cases.

    ## Camera Movement extension [#camera-movement-extension]

    ### v1.2.0 [#v120-1]

    v1.2.0 was released on April 29, 2024.

    #### Improvements [#improvements-159]

    * Added support for Video SDK v4.3.x.
    * Improved the performance of the Camera Movement extension, reducing potential stuttering issues on low-end devices.

    ### v1.0.0 [#v100-3]

    v1.0.0 was released on February 23, 2024.

    This is the initial release of the Agora Camera Movement extension.

    The extension uses AI technology and intelligent camera movement algorithms to provide various features for audio and video interaction use-cases.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>

  <_PlatformPanel platform="ios">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="ios" />

    ## MetaKit extension [#metakit-extension-1]

    ### v2.2.0 [#v220-2]

    v2.2.0 was released on September 13, 2024.

    #### New features [#new-features-144]

    **Stickers**

    This version adds the sticker feature that uses the face capture driver and follows the character's head movements. The SDK provides subpackages for glasses (`material_sticker_glass`), masks (`material_sticker_facemask`), veils (`material_sticker_veil`), and dragon head hats (`material_sticker_dragonhat`). You can load the corresponding scene resources to quickly experience the effects of different stickers.

    **Portrait edge light**

    This release adds a new portrait edge light effect. To experience it, specify the subpackage resource as `material_effect_ray` when loading scene resources.

    **Advertising light text-to-image**

    This version adds a text-to-image feature for the advertising lights. When setting the advertising light effects, you can specify the text content through the `text` parameter and add animation effects through the `animation` parameter. This includes jumping, waving, or swaying, to make the text appear dynamically on the screen.

    #### Improvements [#improvements-160]

    This update adds support for `loadMaterial` and `unloadMaterial` in `setExtensionPropertyWithVendor`.

    * When using `loadMaterial` to load scene resources, you can specify the resource path of the required subpackage. The engine will automatically request the scene texture and render the scene.
    * If you need to switch to another scene, just use `loadMaterial` again to pass in another subpackage resource path. The engine will automatically switch to the new scene.
    * When you no longer need to experience the scene, use `unloadMaterial` to uninstall scene resources.

    This improvement significantly enhances the usability of the extension. You can quickly experience different functional use-cases by simply specifying different subpackage resource paths when loading.

    #### API changes [#api-changes-86]

    **Added**

    * `loadMaterial`
    * `unloadMaterial`

    ### v2.1.0 [#v210-3]

    v2.1.0 was released on March 6, 2024.

    This update focuses on optimizing the performance of the MetaKit extension, ensuring more efficient operation and a better user experience.

    ### v2.0.0 [#v200-4]

    v2.0.0 was released on February 23, 2024.

    This is the first release of the MetaKit extension. This extension integrates multiple AI technologies to provide users with diverse video enhancement functions in audio and video interaction use-cases.

    ## Camera Movement extension [#camera-movement-extension-1]

    ### v1.2.0 [#v120-2]

    v1.2.0 was released on April 29, 2024.

    #### Improvements [#improvements-161]

    * Added support for Video SDK v4.3.x.
    * Improved the performance of the Camera Movement extension, reducing potential stuttering issues on low-end devices.

    ### v1.0.0 [#v100-4]

    v1.0.0 was released on February 23, 2024.

    This is the initial release of the Agora Camera Movement extension.

    The extension uses AI technology and intelligent camera movement algorithms to provide various features for audio and video interaction use-cases.

    <_PlatformProcessedMarker close="true" />
  </_PlatformPanel>
</_PlatformTabsGroup>

## Notifications [#notifications]

### 2022.10 [#202210]

* After you enable Agora Notifications, your server receives the events that you subscribe to in the form of HTTPS requests.
* To improve communication security between the Agora Notifications and your server, Agora backend uses signatures
  for identity verification.
* As of this release, you can use Agora Notifications in conjunction with this product.
