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

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

<_PlatformTabsGroup groupMode="structured" canonicalPlatform="web" platforms="[&#x22;android&#x22;,&#x22;ios&#x22;,&#x22;macos&#x22;,&#x22;web&#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="android">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="android" />

    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]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    <CalloutContainer type="info">
      <CalloutDescription>
        Starting from v4.5.0, both Voice SDK and Signaling SDK (v2.2.0 and above) include the `libaosl.so` library. If you manually integrate Voice SDK via CDN and also use the Signaling SDK, delete the earlier version of the `libaosl.so` library to avoid conflicts.
      </CalloutDescription>
    </CalloutContainer>

    ### v4.6.3 [#v463]

    Released on February 12, 2026.

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

    This release fixed the following issues:

    * The app occasionally crashed in audio interaction scenarios.

    ### v4.6.2 [#v462]

    Released on January 19, 2026.

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

    Included in this release:

    * **New permission granted callback on Android**

      The `onPermissionGranted` callback helps confirm permission status. You can use this callback to determine whether the user granted the necessary permissions.

    #### Improvements [#improvements]

    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`.

    * **Additional improvements**

      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.
      * The Media Recorder module now supports recording audio from Media Player and Audio Mixing.

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

    This release introduces the following compatibility changes:

    * **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-1]

    This release fixed the following issues:

    * 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 engagements.
    * During audio engagements, after calling `playEffect` locally, if a remote user switched to broadcaster and started speaking, electrical noise was occasionally heard locally.
    * 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 engagements.
    * Occasional crashes occurred during audio engagements.

    ### v4.6.1 [#v461]

    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-2]

    This version fixes the following issues:

    * The app occasionally crashed during audio communication when connected to a network via VPN.
    * The app occasionally crashed during audio communication.
    * In multi-channel scenarios, the app occasionally crashed during audio communication with other devices.

    ### v4.6.0 [#v460]

    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-1]

    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/api-reference/rtc) 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`

    * **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.

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

    * **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.

    * **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`.

    * **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.

    #### Improvements [#improvements-1]

    * 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++.

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

    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]

    v4.5.2 was released on April 22, 2025.

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

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

    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]

    v4.5.1 was released on March 6, 2025.

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

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

    **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/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-5]

    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.
    * 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]

    v4.5.0 was released on November 27, 2024.

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

    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">
      <CalloutDescription>
        As of v4.5.0, both Voice SDK and Signaling SDK (v2.2.0 and above) include the `libaosl.so` library. If you manually integrate Voice 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. **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-3]

    1. **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.

    2. **External MediaProjection**

       This version introduces the [`setExternalMediaProjection`](https://api-ref.agora.io/en/voice-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.

    #### Improvements [#improvements-2]

    1. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing`member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/voice-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.

    2. **Other improvements**

       * This version optimizes the logic for calling `queryDeviceScore` to obtain device score levels, improving the accuracy of the score results.
       * When calling `setPlaybackSpeed` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

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

    This version fixes the following issues:

    * 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.
    * 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]

    v4.4.1 was released on August 8, 2024.

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

    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]

    v4.4.0 was released on August 5, 2024.

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

    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">
      <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/voice-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-4]

    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 `VOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-3]

    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. **Other improvements**

       This version also includes the following improvements:

       * 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`.
       * 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-7]

    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-4]

    1. This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-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 fully supports playing music files located in the `/assets/` directory or from URI starting with `content://`.

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

    This version fixed the following issues:

    * 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.

    ### v4.3.1 [#v431]

    v4.3.1 was released on April 29, 2024.

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

    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-5]

    1. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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.

    2. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    3. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](https://docs-beta.agora.io/en/realtime-media/voice/reference/release-notes) for details.

    #### Improvements [#improvements-5]

    1. **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.

    2. **Other improvements**

       This version also includes the following improvements:

       * Enhanced performance and stability of the local compositing feature, reducing its CPU usage.
       * 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/voice-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-9]

    This version fixed the following issues:

    * After joining a channel and calling [disableAudio](https://api-ref.agora.io/en/voice-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.

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

    **Added**

    * [registerFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/android/4.x/API/enum_mediasourcetype.html) adds `SPEECH_DRIVEN_VIDEO_SOURCE`
    * [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * `EAR_MONITORING_FILTER_BUILT_IN_AUDIO_FILTERS`

    ### v4.3.0 [#v430]

    v4.3.0 was released on February 22, 2024.

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

    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. **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 | Existing parameter name |
       | ---------------------------------- | ----------------------- | ----------------------- |
       | `onLocalAudioStateChanged`         | `error`                 | `reason`                |
       | `onLocalVideoStateChanged`         | `error`                 | `reason`                |
       | `onDirectCdnStreamingStateChanged` | `error`                 | `reason`                |
       | `onPlayerStateChanged`             | `error`                 | `reason`                |
       | `onRtmpStreamingStateChanged`      | `errCode`               | `reason`                |

       | Original enumeration class | Current enumeration class  |
       | -------------------------- | -------------------------- |
       | `DirectCdnStreamingReason` | `DirectCdnStreamingReason` |
       | `MediaPlayerReason`        | `MediaPlayerReason`        |

       **Note:** For specific renaming of enumerations, 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**

       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.

    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. **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-6]

    1. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/android/4.x/API/class_mediasource.html).

    3. **Audio playback device test**

       This release introduces the [startPlaybackDeviceTest](https://api-ref.agora.io/en/voice-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/voice-sdk/android/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_stopplaybackdevicetest) method to stop the test.

    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.

       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/voice-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/voice-sdk/android/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionString](https://api-ref.agora.io/en/voice-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/voice-sdk/android/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-6]

    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/voice-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/voice-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/voice-sdk/android/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) method.

    4. **Other improvements**

       This release also includes the following improvements:

       * Adds `allowCaptureCurrentApp` member in [AudioCaptureParameters](https://api-ref.agora.io/en/voice-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.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-sdk/android/4.x/API/class_playerplaybackstats.html).

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

    This release fixed the following issue:

    * In an online meeting use-case, occasional audio freezes occurred when the local user was listening to remote users.

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

    **Added**

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

    **Modified**

    * `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-11]

    This release fixed the following issues occurring when using Android 14:

    * When integrating the SDK, setting the Android `targetSdkVersion` to `34` could cause screen sharing to be unavailable or even the app to crash.

    ### v4.2.3 [#v423]

    v4.2.3 was released on October 11, 2023.

    #### Improvements [#improvements-7]

    **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-12]

    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 [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.
    * In channels joined by calling `joinChannelEx` exclusively, calling `setEnableSpeakerphone` is unable to switch audio route from the speaker to the headphone.

    ### v4.2.2 [#v422]

    v4.2.2 was released on july 27, 2023.

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

    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).

    <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 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).

    #### Improvements [#improvements-8]

    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.

    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)).

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

    This release fixed the following issues:

    * Slow channel reconnection after the connection was interrupted due to network reasons.

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

    **Added**

    * `preloadChannel[1/2]`
    * `preloadChannel[2/2]`
    * `updatePreloadChannelToken`
    * `setRouteInCommunicationMode`

    ### v4.2.1 [#v421]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-9]

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

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

    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.

    ### v4.2.0 [#v420]

    v4.2.0 was released on May 24, 2023.

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

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

    **1. Channel media options**

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

    **2. Miscellaneous**

    * `onApiCallExecuted` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

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

    **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](pricing.mdx).
      </CalloutDescription>
    </CalloutContainer>

    **2. 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-10]

    **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. 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`

    **3. 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.

    **4. 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-15]

    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-3]

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioTrackType`
    * The `mDomainLimit` and `mAutoRegisterAgoraExtensions` members in `RtcEngineConfig`

    **Deprecated**

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

    **Deleted**

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

    ### v4.1.1 [#v411]

    v4.1.1 was released on February 8, 2023.

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

    **Instant audio 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.

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

    This release fixed the following issues:

    * Playing audio files with a sample rate of 48 kHz failed.
    * 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.
    * 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-4]

    **Added**

    `enableInstantMediaRendering`

    ### v4.1.0 [#v410]

    v4.1.0 was released on December 15, 2022.

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

    **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. 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 <a href="mailto:support@agora.io">[support@agora.io](mailto\:support@agora.io)</a>.

    **3. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream.
    * The `muteAllRemoteAudioStreamsEx` is used to cancel or resume the subscription of all remote users to audio stream.
    * 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.

    **4. 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.

    #### Improvements [#improvements-11]

    **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. 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.

    **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.
    * 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-17]

    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.

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

    **Added**

    * `setHeadphoneEQParameters`

    * `leaveChannelEx` \[2/2]

    * `muteLocalAudioStreamEx`

    * `muteAllRemoteAudioStreamsEx`

    * `startRtmpStreamWithoutTranscodingEx`

    * `startRtmpStreamWithTranscodingEx`

    * `updateRtmpTranscodingEx`

    * `stopRtmpStreamEx`

    * `startChannelMediaRelayEx`

    * `updateChannelMediaRelayEx`

    * `pauseAllChannelMediaRelayEx`

    * `resumeAllChannelMediaRelayEx`

    * `stopChannelMediaRelayEx`

    * `followEncodeDimensionRatio` in `CameraCapturerConfiguration`

    * `newRoleOptions` in `onClientRoleChanged`

    * `adjustUserPlaybackSignalVolumeEx`

    **Deprecated**

    * `onApiCallExecuted`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8) in `onChannelMediaRelayEvent` callback

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

    * The package manager download is listed as 4.1.0-1. This the correct download for Voice SDK for Android v4.1.0.

    ### v4.0.1 [#v401]

    v4.0.1 was released on September 29, 2022.

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

    **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. 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.

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

    This release fixed the following issues.

    1. 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.
    2. After calling `setCloudProxy` to set the cloud proxy, calling `joinChannelEx` to join multiple channels failed.

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

    **Added**

    * `getEarMonitoringAudioParams`
    * `stopRecordingDeviceTest`
    * `stopRecordingDeviceTest`
    * `getNetworkType`
    * `isAudioFilterable` in the `ChannelMediaOptions`
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `muteRemoteAudioStream`
    * `SpatialAudioParams`
    * `setHeadphoneEQPreset`
    * `HEADPHONE_EQUALIZER_PRESET`

    **Deprecated**

    * `startEchoTest` \[2/3]

    ### v4.0.0 [#v400]

    v4.0.0 was released on September 15, 2022.

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

    **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
    * 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.x](migration-guide.mdx).

    **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-12]

    **1. Multiple media tracks**

    This release supports one `RtcEngine` instance to collect multiple audio 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 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. 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 streams being played with remote users.

    **3. 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 enable this feature, contact [support@agora.io](mailto\:support@agora.io).

    **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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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 interactive activities based on the Agora SDK, this release supports the one-stop solution for the extensions from the [Agora extensions marketplace](http://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](../build/customize-audio-processing/use-an-extension.mdx).
    * 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/realtime-media/marketplace/quickstart-implement).

    **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 sources.
    * Sets or switches channel profile and user role.
    * 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 subscribe to the audio 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 sources.

    **9. 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 `RtcEngineEx` 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.

    **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 `AUDIO_SCENARIO_DEFAULT` to `AUDIO_SCENARIO_GAME_STREAMING` when you are in a channel, you can call this method.

    #### Improvements [#improvements-12]

    **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. 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.

    **3. 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.

    ## Notifications [#notifications]

    ### 2022.10 [#202210]

    * After you enable Notifications, your server receives the events that you subscribe to in the form of HTTPS requests.
    * To improve communication security between the Notifications and your server, Agora SDRTN® uses signatures
      for identity verification.
    * As of this release, you can use Notifications in conjunction with this product.

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

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

    ### Known issues [#known-issues-2]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * iOS SDK v4.2.6

      **AirPods Pro Bluetooth connection issue**

      AirPods Pro does not support A2DP protocol in communication audio mode, which may lead to connection failure in that mode.

    <CalloutContainer type="info">
      <CalloutDescription>
        As of v4.5.0, both Voice SDK and Signaling SDK (v2.2.0 and above) include the `aosl.xcframework` library. If you manually integrate Voice SDK via CDN and also use Signaling SDK, delete the earlier version of the `aosl.xcframework` library to avoid conflicts.
      </CalloutDescription>
    </CalloutContainer>

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

    Released on January 19, 2026.

    #### Improvements [#improvements-13]

    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`.

    * **Additional improvements**

      * Adds error codes `AgoraErrorCodePcmSendFormat (200)` and `AgoraErrorCodePcmSendBufferOverflow (201)` to report PCM data transmission errors.

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

    This release introduces the following compatibility changes:

    * **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.

    * **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-19]

    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.

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

    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-9]

    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/voice/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/api-reference/rtc) 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:`

    * **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.

    * **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-13]

    * **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.

    * **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:`.

    * **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.

    #### Improvements [#improvements-14]

    * Added support for G.711 and G.722 audio codecs when inter-operating with the Web SDK for better cross-platform audio compatibility.

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

    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">
      <CalloutDescription>
        The `aosl.xcframework` library version in Voice SDK v4.5.2 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

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

    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 6, 2025.

    <CalloutContainer type="info">
      <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-14]

    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/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-15]

    * Reduced SDK initialization time on specific device models.

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

    This release resolves the following issues:

    * 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-1]

    v4.5.0 was released on November 27, 2024.

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

    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">
      <CalloutDescription>
        As of v4.5.0, both Voice SDK and Signaling SDK (v2.2.0 and above) include the `aosl.xcframework` library. If you manually integrate Voice 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 Voice SDK v4.5.0 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

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

    1. **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.

    #### Improvements [#improvements-16]

    1. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AgoraAudioTrackConfig`](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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.

    2. **Other improvements**

       * 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 `setPlaybackSpeed:` to set the playback speed of an audio file, the minimum supported speed is 0.3x.

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

    This version fixes the following issues:

    * 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.
    * 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-1]

    v4.4.0 was released on August 5, 2024.

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

    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">
      <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/voice/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. Before v4.4.0, when a user role was set to `audience` and `setAudioScenario` was called to set the audio scenario to chatroom (`AgoraAudioScenarioChatRoom`), the user would see a microphone permission request popup. As of v4.4.0, the SDK uses native iOS APIs to control the microphone, so audience members in a chatroom scenario will no longer receive the microphone permission request popup.

    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-16]

    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 `AgoraVoiceAITunerType` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-17]

    This version 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-22]

    This release fixes the following issues:

    * Occasional app crashes occurred when multiple remote users joined a channel simultaneously during real-time interaction.
    * 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-18]

    1. This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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-23]

    This version fixed the following issues:

    * 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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/startaudiomixing\(_\:loopback\:cycle:\)) and the playing finished, the SDK sometimes failed to trigger the [audioMixingStateChanged](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/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.

    ### v4.3.1 [#v431-1]

    v4.3.1 was released on April 29, 2024.

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

    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">
         <CalloutDescription>
           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).
         </CalloutDescription>
       </CalloutContainer>

    2. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [AgoraEncryptionConfig](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraencryptionconfig) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\)) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/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](https://docs-beta.agora.io/en/realtime-media/voice/reference/release-notes) for details.

    #### Improvements [#improvements-19]

    1. **Custom audio capture optimization**

       To enhance the flexibility of custom audio capture, this release deprecates [pushExternalAudioFrameSampleBuffer \[1/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\)) and introduces [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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.

    2. **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.

    3. **Other improvements**

       This version also includes the following improvements:

       * Enhanced media player capabilities to handle WebM format videos, including support for rendering alpha channels.
       * In [AgoraAudioEffectPreset](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/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.

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

    **Added**

    * [setFaceInfoDelegate](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setfaceinfodelegate\(_:\))
    * [AgoraFaceInfoDelegate](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorafaceinfodelegate)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorafaceinfodelegate/onfaceinfo\(_:\))
    * [AgoraMediaSourceType](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoramediasourcetype) adds `AgoraMediaSourceTypeSpeechDriven`
    * [AgoraEncryptionConfig](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraencryptionconfig) adds `datastreamEncryptionEnabled`
    * [AgoraEncryptionErrorType](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraencryptionerrortype) adds the following enumerations:
    * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
    * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [AgoraRtcRemoteAudioStats](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcremoteaudiostats) adds `e2eDelay`
    * [AgoraErrorCode](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraerrorcode) adds `AgoraErrorCodeDatastreamDecryptionFailed`
    * [AgoraAudioEffectPreset](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraaudioeffectpreset) adds `AgoraAudioEffectPresetRoomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases
    * [getCallIdEx](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/getcallidex\(_:\))
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/enableencryptionex\(_\:encryptionconfig\:connection:\))
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\))
    * [AgoraEarMonitoringFilterType](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraearmonitoringfiltertype) adds a new enumeration `AgoraEarMonitoringFilterBuiltInAudioFilters`
    * [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_\:samplerate\:channels\:trackid:\))

    **Deprecated**

    * [pushExternalAudioFrameSampleBuffer \[1/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\))

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

    v4.3.0 was released on February 22, 2024.

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

    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. **Audio route**

       Starting with this release, `AgoraAudioOutputRoutingBluetooth` in [AgoraAudioOutputRouting](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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.

    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.

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

    1. **Query Device Score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/agorartckit/agoramediasource).

    3. **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/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/stoprecordingdevicetest\(\)) method to stop the test.
       * [startPlaybackDeviceTest](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/stopplaybackdevicetest\(\)) method to stop the test.

    4. **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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setremotesubscribefallbackoption\(_:\)): Sets fallback option for the subscribed video stream in weak network conditions.
       * [didRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcmediaplayerprotocol/setplayeroption\(_\:value:\)) and \[setPlayerOption [2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcmediaplayerprotocol/setplayeroptionstring\(_\:value:\)): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\)): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-20]

    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/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setinearmonitoringvolume\(_:\)).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/agorartckit/agoralocalspatialaudiokit).
       * This release introduces the [updateSelfTransform](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/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. **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/voice-sdk/ios/4.x/documentation/agorartckit/agorartclocalaudiostats) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.
       * The [cacheStats](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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/voice-sdk/ios/4.x/documentation/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`.

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

    **Added**

    * [`didTranscodedStreamLayoutInfoUpdatedWithUserId`](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginedelegate/rtcengine\(_\:didtranscodedstreamlayoutinfoupdatedwithuserid\:videolayoutinfo:\))
    * [AgoraVideoLayoutInfo](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoravideolayoutinfo)
    * The `subviewUid` member in [AgoraRtcVideoCanvas](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcvideocanvas)
    * [updateSelfTransform](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraspatialaudiokitbase/updateselftransform\(_:\))
    * The `AgoraAudioLocalReasonInterrupted` enumeration in [AgoraAudioLocalReason](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraaudiolocalreason)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\))
    * [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/querydevicescore\(\))
    * The `AgoraMediaSourceTypeCustomVideo` enumeration in [AgoraMediaSourceType](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoramediasourcetype)
    * \[setBeautyEffectOptions [2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setbeautyeffectoptions\(_\:options\:sourcetype:\))
    * \[setLowlightEnhanceOptions [2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setlowlightenhanceoptions\(_\:options\:sourcetype:\))
    * \[setVideoDenoiserOptions [2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setvideodenoiseroptions\(_\:options\:sourcetype:\))
    * \[setColorEnhanceOptions [2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/setcolorenhanceoptions\(_\:options\:sourcetype:\))
    * \[enableVirtualBackground [2/2\]](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/enablevirtualbackground\(_\:backdata\:segdata\:sourcetype:\))
    * The `AgoraAudioOutputRoutingBluetoothDeviceA2dp` enumeration in [AgoraAudioOutputRouting](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoraaudiooutputrouting)
    * Adds the `earMonitorDelay` and `aecEstimatedDelay` in [AgoraRtcLocalAudioStats](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartclocalaudiostats)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcmediaplayerprotocol/selectmultiaudiotrack\(_\:publishtrackindex:\))
    * [cacheStats](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:cachestats:\))
    * [playbackStats](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:playbackstats:\))
    * [AgoraMediaPlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agoramediaplayerplaybackstats)
    * [startPlaybackDeviceTest](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/agorartckit/agorartcenginekit/startplaybackdevicetest\(_:\))
    * [stopPlaybackDeviceTest](https://api-ref.agora.io/en/voice-sdk/ios/4.x/documentation/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-24]

    This release fixed the following issue:

    * 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.

    ### v4.2.3 [#v423-1]

    v4.2.3 was released on October 11, 2023.

    #### Improvements [#improvements-21]

    **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-25]

    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.

    ### v4.2.2 [#v422-1]

    v4.2.2 was released on july 27, 2023.

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

    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 [Deploy a token server](/en/realtime-media/video/build/authenticate-users/deploy-token-server).

       <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 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 [Deploy a token server](/en/realtime-media/video/build/authenticate-users/deploy-token-server).

    #### Improvements [#improvements-22]

    **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-26]

    This release fixed slow channel reconnection after the connection was interrupted due to network reasons.

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

    **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-1]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-23]

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

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

    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-1]

    v4.2.0 was released on May 24, 2023.

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

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

    **1. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishCustomAudioSourceId` in `AgoraRtcChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **2. Miscellaneous**

    * `didApiCallExecute` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

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

    **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](pricing.mdx).
      </CalloutDescription>
    </CalloutContainer>

    **2. 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-24]

    **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. 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.

    **3. 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-27]

    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.
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback.

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

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AgoraAudioTrackType`
    * `AgoraApplicationScenarioType`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `AgoraRtcEngineConfig`
    * The `channelId` and `uid` parameters in `stateDidChanged` and `informationDidUpdated` callbacks

    **Deprecated**

    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    **Deleted**

    * `didApiCallExecute`
    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions`

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

    v4.1.1 was released on February 8, 2023.

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

    **Instant frame rendering**

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

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

    This release fixed the issue that playing audio files with a sample rate of 48 kHz failed.

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

    **Added**

    `enableInstantMediaRendering`

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

    v4.1.0 was released on December 15, 2022.

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

    **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. 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 <a href="mailto:support@agora.io">[support@agora.io](mailto\:support@agora.io)</a>.

    **3. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` is used to cancel or resume the subscription of all remote users to audio 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.

    **4. 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-25]

    **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.

    **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 `AgoraAudioScenarioMeeting`.
    * 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-29]

    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 data were obtained simultaneously and separately via `onRecordAudioFrame` callbacks.
    * The call `getExtensionProperty` failed and returned an empty string.

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

    **Added**

    * `enableMultiCamera`
    * `startSecondaryCameraCapture`
    * `stopSecondaryCameraCapture`
    * `setHeadphoneEQParameters`
    * `muteLocalAudioStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`
    * `followEncodeDimensionRatio` in `AgoraCameraCapturerConfiguration`
    * `leaveChannelEx` \[2/2]
    * `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-1]

    v4.0.1 was released on September 29, 2022.

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

    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-23]

    **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).

    **4. 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.

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

    **Added**

    * `getEarMonitoringAudioParams`

    * `getNetworkType`

    * `isAudioFilterable` in the `ChannelMediaOptions`

    * `setZones`

    * `setPlayerAttenuation`

    * `setRemoteAudioAttenuation`

    * `muteRemoteAudioStream`

    * `SpatialAudioParams`

    * `setHeadphoneEQPreset`

    * `AgoraHeadphoneEQPreset`

    **Deprecated**

    * `startEchoTest` \[2/3]

    ### v4.0.0 [#v400-1]

    v4.0.0 was released on September 15, 2022.

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

    **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](migration-guide.mdx).

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

    **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`).

    **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. 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).
    The SDK supports a new version of Noise Suppression (in comparison to the basic Noise Suppression in v3.7.0). The new AI Noise Suppression has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option. To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    **5. 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.

    **6. 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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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 `AgoraAudioScenarioChorus` enumeration in `AgoraAudioScenario`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **8. 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](http://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](../build/customize-audio-processing/use-an-extension.mdx).
    * 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/realtime-media/marketplace/quickstart-implement).

    **9. 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.

    **11. 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.

    **12. 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-26]

    **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.

    ## Notifications [#notifications-1]

    ### 2022.10 [#202210-1]

    * After you enable Notifications, your server receives the events that you subscribe to in the form of HTTPS requests.
    * To improve communication security between the Notifications and your server, Agora SDRTN® uses signatures
      for identity verification.
    * As of this release, you can use Notifications in conjunction with this product.

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

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

    ### Known issues [#known-issues-3]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * MacOS SDK v4.4.0

      **MacOS 15 Sequoia beta system issue**

      When the app path (including the App name) contains non-English characters (such as Chinese characters), the compiled `Metal shader library` may not contain any methods, causing the app to crash. See [this article](/en/api-reference/faq/other/macos_15_beta) for the workaround.

    <CalloutContainer type="info">
      <CalloutDescription>
        As of v4.5.0, both Voice SDK and Signaling SDK (v2.2.0 and above) include the `aosl.xcframework` library. If you manually integrate Voice SDK via CDN and also use Signaling SDK, delete the earlier version of the `aosl.xcframework` library to avoid conflicts.
      </CalloutDescription>
    </CalloutContainer>

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

    Released on January 19, 2026.

    #### Improvements [#improvements-27]

    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`.

    * **Additional improvements**

      * Adds error codes `AgoraErrorCodePcmSendFormat (200)` and `AgoraErrorCodePcmSendBufferOverflow (201)` to report PCM data transmission errors.

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

    This release introduces the following compatibility changes:

    * **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-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-17]

    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/voice/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](/media-push/product-overview) 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:`

    * **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.

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

    * **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.

    * **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.

    * **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.

    #### Improvements [#improvements-28]

    * Added support for G.711 and G.722 audio codecs when interoperating with the Web SDK for improved cross-platform audio compatibility and clarity.

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

    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">
      <CalloutDescription>
        The `aosl.xcframework` library version in Voice SDK v4.5.2 is 1.2.13. You can check the version in the `Info.plist` file.
      </CalloutDescription>
    </CalloutContainer>

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

    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 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 6, 2025.

    <CalloutContainer type="info">
      <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-26]

    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/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-31]

    This release resolves the following issues:

    * 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-2]

    v4.5.0 was released on November 27, 2024.

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

    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">
      <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/API/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.

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

    1. **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.

    2. **Others**

       * The `rtcEngine:device:type:stateChanged:` callback supports reporting that the device has been plugged in.

    #### Improvements [#improvements-29]

    1. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AgoraAudioTrackConfig`](https://api-ref.agora.io/en/video-sdk/macos/4.x/API/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.

    2. **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-2]

    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-2]

    v4.4.0 was released on August 5, 2024.

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

    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">
      <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/voice/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-28]

    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 `AgoraVoiceAITunerType` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-30]

    This version includes the following improvements:

    * Optimizes transmission strategy: Calling `enableInstantMediaRendering` no longer impacts the security of the transmission link.
    * 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-31]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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-32]

    This version fixed the following issues:

    * Occasional video smoothness issues during audio and video interactions.
    * 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-29]

    1. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [AgoraEncryptionConfig](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraencryptionconfig) for enabling data stream encryption. You can set this when you activate encryption with [enableEncryption](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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.

    2. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\)) is introduced for setting the playback speed of audio files.
       * A new method [getCallIdEx](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/getcallidex\(_:\)) is introduced for retrieving call IDs in multi-channel use-cases.

    3. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](https://docs-beta.agora.io/en/realtime-media/voice/reference/release-notes) for details.

    #### Improvements [#improvements-32]

    1. **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.

    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/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\)) and introduces [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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:

       * In [AgoraAudioEffectPreset](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/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-33]

    This version fixed the following issues:

    * When a user plugged and unplugged a Bluetooth or wired headset once, the audio state change callback `stateChanged` was triggered multiple times.

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

    **Added**

    * [setFaceInfoDelegate](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/setfaceinfodelegate\(_:\))
    * [AgoraFaceInfoDelegate](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorafaceinfodelegate)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorafaceinfodelegate/onfaceinfo\(_:\))
    * [AgoraMediaSourceType](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoramediasourcetype) adds `AgoraMediaSourceTypeSpeechDriven`
    * [AgoraEncryptionConfig](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraencryptionconfig) adds `datastreamEncryptionEnabled`
    * [AgoraEncryptionErrorType](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraencryptionerrortype) adds the following enumerations:
      * `ENCRYPTION_ERROR_DATASTREAM_DECRYPTION_FAILURE`
      * `ENCRYPTION_ERROR_DATASTREAM_ENCRYPTION_FAILURE`
    * [AgoraRtcDeviceInfo](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcdeviceinfo) adds `deviceTypeName`
    * [AgoraRtcRemoteAudioStats](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcremoteaudiostats) adds `e2eDelay`
    * [AgoraErrorCode](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraerrorcode) adds `AgoraErrorCodeDatastreamDecryptionFailed`
    * [AgoraAudioEffectPreset](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraaudioeffectpreset) adds `AgoraAudioEffectPresetRoomAcousticsChorus`, enhancing the spatial presence of vocals in chorus use-cases.
    * [getCallIdEx](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/getcallidex\(_:\))
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/enableencryptionex\(_\:encryptionconfig\:connection:\))
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/setaudiomixingplaybackspeed\(_:\))
    * [AgoraEarMonitoringFilterType](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraearmonitoringfiltertype) adds a new enumeration `AgoraEarMonitoringFilterBuiltInAudioFilters`
    * [pushExternalAudioFrameSampleBuffer \[2/2\]](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_\:samplerate\:channels\:trackid:\))

    **Deprecated**

    * [pushExternalAudioFrameSampleBuffer](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/pushexternalaudioframesamplebuffer\(_:\))

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

    v4.3.0 was released on February 22, 2024.

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

    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. **Audio loopback capturing**

       * Before v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/enableaudio\(\)) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/enableloopbackrecording\(_\:devicename:\)).

    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.

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

    1. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/agorartckit/agoramediasource).

    3. **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/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/setremotesubscribefallbackoption\(_:\)): Sets fallback option for the subscribed video stream in weak network conditions.
       * [didRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/agorartckit/agorartcmediaplayerprotocol/setplayeroption\(_\:value:\)) and \[setPlayerOption [2/2\]](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcmediaplayerprotocol/setplayeroptionstring\(_\:value:\)): Sets media player options for providing technical previews or special customization features.
       * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\)): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-33]

    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/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/setinearmonitoringvolume\(_:\)).

    3. **Spatial audio effects usability improvement**

       * This release optimizes the design of the [setZones](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorabasespatialaudiokit/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/voice-sdk/macos/4.x/API/agorartckit/agoralocalspatialaudiokit).

    4. **Local audio state changed callback optimization**

       This release introduces the following enumerations in [AgoraAudioLocalReason](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraaudiolocalreason), enabling users to obtain more details about local audio errors through the [localAudioStateChanged](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginedelegate/rtcengine\(_\:localaudiostatechanged\:error:\)) 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/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/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/voice-sdk/macos/4.x/API/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.

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

    **Added**

    * The `subviewUid` member in [AgoraRtcVideoCanvas](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcvideocanvas)
    * The following enumerations in [AgoraAudioLocalReason](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraaudiolocalreason):
      * `AgoraAudioLocalReasonNoRecordingDevice`
      * `AgoraAudioLocalReasonNoPlayoutDevice`
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/enablecustomaudiolocalplayback\(_\:enabled:\))
    * [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcenginekit/querydevicescore\(\))
    * The `AgoraMediaSourceTypeCustomVideo` enumeration in [AgoraMediaSourceType](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoramediasourcetype)
    * The `AgoraAudioOutputRoutingBluetoothDeviceA2dp` enumeration in [AgoraAudioOutputRouting](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agoraaudiooutputrouting)
    * Adds the `earMonitorDelay` and `aecEstimatedDelay` in [AgoraRtcLocalAudioStats](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartclocalaudiostats)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcmediaplayerprotocol/selectmultiaudiotrack\(_\:publishtrackindex:\))
    * [cacheStats](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/agorartckit/agorartcmediaplayerdelegate/agorartcmediaplayer\(_\:cachestats:\))
    * [playbackStats](https://api-ref.agora.io/en/voice-sdk/macos/4.x/API/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-34]

    This release fixed the following issue:

    * 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.

    ### v4.2.3 [#v423-2]

    v4.2.3 was released on October 11, 2023.

    #### Improvements [#improvements-34]

    **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-35]

    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.

    ### v4.2.2 [#v422-2]

    v4.2.2 was released on july 27, 2023.

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

    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 [Deploy a token server](/en/realtime-media/voice/build/set-up-token-authentication/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 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 [Deploy a token server](/en/realtime-media/voice/build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

    #### Improvements [#improvements-35]

    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.

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

    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.

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

    **Added**

    * `preloadChannelByToken [1/2]`
    * `preloadChannelByToken [2/2]`
    * `updatePreloadChannelToken`

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

    This version was released on June 21, 2023.

    #### Improvements [#improvements-36]

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

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

    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.

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

    v4.2.0 was released on May 24, 2023.

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

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

    **1. Channel media options**

    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishCustomAudioSourceId` in `AgoraRtcChannelMediaOptions` is renamed to `publishCustomAudioTrackId`.

    **2. 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>

    **3. Miscellaneous**

    * `didApiCallExecute` is deleted. Agora recommends getting the results of the API implementation through relevant channels and media callbacks.
    * `startChannelMediaRelay`, `updateChannelMediaRelay`, `startChannelMediaRelayEx`, and `updateChannelMediaRelayEx` are deprecated. Use `startOrUpdateChannelMediaRelay` and `startOrUpdateChannelMediaRelayEx` instead.

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

    **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](pricing-legacy.md#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. 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-37]

    **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. 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.

    **3. 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-37]

    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.
    * Incorrect information in the `type` field of the return value after calling `getDefaultAudioDevice`.

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

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AgoraAudioTrackType`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `AgoraRtcEngineConfig`
    * The `channelId` and `uid` parameters in `stateDidChanged` and `informationDidUpdated` callbacks

    **Deprecated**

    * `startChannelMediaRelay`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelay`
    * `updateChannelMediaRelayEx`
    * `didReceiveChannelMediaRelayEvent`
    * `AgoraChannelMediaRelayEvent`

    **Deleted**

    * `didApiCallExecute`
    * `publishCustomAudioTrackEnableAec` in `AgoraRtcChannelMediaOptions`

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

    v4.1.1 was released on February 8, 2023.

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

    **Instant frame rendering**

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

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

    This release fixed the issue that playing audio files with a sample rate of 48 kHz failed.

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

    **Added**

    `enableInstantMediaRendering`

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

    v4.1.0 was released on December 15, 2022.

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

    **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. 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).

    **3. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream, respectively.
    * The `muteAllRemoteAudioStreamsEx` is used to cancel or resume the subscription of all remote users to audio 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.

    **4. 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-38]

    **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.

    **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.
    * 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-39]

    This release fixed the following issues:

    * 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 call `getExtensionProperty` failed and returned an empty string.

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

    **Added**

    * `setHeadphoneEQParameters`
    * `muteLocalAudioStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`
    * `followEncodeDimensionRatio` in `AgoraCameraCapturerConfiguration`
    * `leaveChannelEx` \[2/2]
    * `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-2]

    v4.0.1 was released on September 29, 2022.

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

    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-35]

    **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. 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.

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

    **Added**

    * `getEarMonitoringAudioParams`

    * `getNetworkType`

    * `isAudioFilterable` in the `ChannelMediaOptions`

    * `setZones`

    * `setPlayerAttenuation`

    * `setRemoteAudioAttenuation`

    * `muteRemoteAudioStream`

    * `SpatialAudioParams`

    * `setHeadphoneEQPreset`

    * `AgoraHeadphoneEQPreset`

    **Deprecated**

    * `startEchoTest` \[2/3]

    ### v4.0.0 [#v400-2]

    v4.0.0 was released on September 15, 2022.

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

    **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](./migration-guide).

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

    **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`).

    **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. 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).

    **5. 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.

    **6. 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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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 `AgoraAudioScenarioChorus` enumeration in `AgoraAudioScenario`. With this enumeration, users can experience ultra-low latency in real-time chorus when the network conditions are good.

    **8. 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://console.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](../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/realtime-media/voice/quickstart).

    **9. 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.

    **11. 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.

    **12. 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-39]

    **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="web">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="web" />

    Voice 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](supported-platforms.md).

    ### Known issues [#known-issues-4]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * **Desktop**

      ****Chrome****

      * Starting from Chrome 117, the `getStats()` method is no longer supported in the SDK v4.9.3 and earlier versions. Calling this method will return all values as `0`. This caused by the fact that the old version of the `getStats()` WebRTC API will be removed from Chrome 117, as stated in the [Chrome official documentation](https://developer.chrome.com/blog/getstats-migration).
        &#x2A;*Solution:** Upgrade to a higher version of the SDK.
      * On all AMD-based and some Intel-based devices with the Windows operating system, if Chrome uses the H.264 codec, the video transmission bitrate may be lower than the set value.
        &#x2A;*Solution:** To resolve this issue, you can set the browser to use the VP9 codec or try to disable hardware acceleration.
      * Chrome 84 on macOS has a known issue: When using the H.264 codec, WebRTC can experience a sudden drop in the frame rate. For details, see the official Google bug reports: [Issue 1088650](https://bugs.chromium.org/p/chromium/issues/detail?id=1203206\&can=2\&q=webrtc%20drop%20component%3ABlink%3EWebRTC%3EVideo) and [Issue 12704](https://bugs.chromium.org/p/webrtc/issues/detail?id=12704#c3).
        &#x2A;*Solution:** Agora recommends using VP9 instead of H.264 for Chrome 84 and later versions on macOS.
      * Acoustic Echo Cancellation(AEC) fails to work on Chrome in certain use-cases.
        &#x2A;*Cause:** If you apply extra processing (for example, spatial audio) to the received remote audio stream, AEC fails to get the AEC Reference signal. For details, see the Chrome [Issue 687574](https://bugs.chromium.org/p/chromium/issues/detail?id=687574).
        &#x2A;*Solution:** Agora recommends that all users wear headphones instead of using speakers. To use speakers in this use-case, contact [support@agora.io](mailto\:support@agora.io).
      * Chrome plans to deprecate and remove the Plan B dialect in WebRTC. For details, see the [Chrome feature description](https://www.chromestatus.com/feature/5823036655665152). If you use any of the following versions of Voice Calling, best practice is to upgrade to the latest version:

        | Version      | Impact                                                        |
        | ------------ | ------------------------------------------------------------- |
        | v4.0.0-4.0.1 | The `publish` and `subscribe` methods do not have any effect. |

      ****Safari****

      * On Safari 17.2, the SDK cannot switch to the small stream properly.

      * On Safari browsers of some Mac devices with Intel chips, calling `enableDualStream` to enable H.264-encoded dual-stream mode may result in system lag when the ratio of the small stream to the large stream resolution is below 1/4.

      * On Safari 15.4, if you set the sample rate of the local audio track as 32,000 Hz, the local audio track ends (triggering the `AgoraRTCClient.on('track-ended'` event).

      * If you use H.264 on Safari 15.1, setting [MediaStreamTrack.enabled](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/enabled) as `false` crashes the web tab.

      * On Safari 14.0.1, the audio can experience stuttering.

      * Safari 13 users may not be able to hear other users.

      * Safari 12.1 or earlier only supports the H.264 codec.

      * Safari 11 only supports video resolutions of 480P and higher.

      * Safari does not support getting the output device information, so it does not support the `getPlayoutDevices` and `setAudioOutput` methods.

      * On Safari, when calling APIs to get quality statistics, the values of some properties are 0. For example, when calling `getLocalAudioStats` to get the quality statistics of the local audio track, the value of `sendPacketsLost` is 0.

      * If **Auto-Play** is not enabled on Safari (as the following figure shows), the stream playback has no audio. You have to call the `navigator.mediaDevices.getUserMedia` method to get the device permissions before playing a stream.
        ![img](https://assets-docs.agora.io/images/video-sdk/safari-auto-play.png)

      ****Firefox****

      **Firefox**

      * Black screen issue on the receiver's side with Firefox version 138

        **Issue description**: When users interact using real-time audio and video on Firefox version 138, the receiver may see a black screen instead of video.

        **Root cause**: This issue is caused by a rollback in the Firefox browser. Version 138 introduced a temporary change that causes video stream decoding to fail. This is a compatibility issue introduced by the browser vendor. For details, see [Bugzilla 1965831](https://bugzilla.mozilla.org/show_bug.cgi?id=1965831).

        **Workaround**: Agora has implemented a temporary fix through configuration delivery. In incognito or private browsing mode, this configuration may not take effect, and integration changes may be required. Contact [technical support](mailto\:support@agora.io) for assistance.

      * The default setting for the minimum video bitrate in Web SDK does not take effect on Firefox.

      * Sending SEI data in H.264 video streams is not supported on Firefox.

      * On Firefox 98, when sending H.264 video from Windows devices, the keyframes cannot be received immediately after the video is subscribed, thus slowing down the rendering of the first video frame.

      * When the Web SDK on Firefox communicates with the SDK on some devices, the video on Firefox is rotated.

      * Firefox does not support changing the frame rate (30 fps by default).

      * Firefox does not support setting the audio encoding rate.

      * Setting the video profile on Firefox does not take effect on the following devices:
        * MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)
        * Windows 10 (MI)

      * On Macs with the Apple M1 chip, Firefox does not support H.264. For details, see the [Firefox documentation](https://bugzilla.mozilla.org/show_bug.cgi?id=1686470).

      * Firefox does not support getting `CodecType`, `sendFrameRate` and `captureFrameRate`.

      **Other restrictions on desktop**

      * On Chrome 81 or later, Safari, and Firefox, device IDs are only available after the user has granted permission to use the media device. This restriction affects the `getMicrophones`, `getCameras`, and `getPlaybackDevices` methods.
      * The `setPlaybackDevice` method is only supported on Chrome. Calling this method on other browsers throws the `NOT_SUPPORTED` error.
      * The `setOptimizationMode` method and the `optimizationMode` parameter in `CameraVideoTrackInitConfig`, `ScreenVideoTrackInitConfig`, and `CustomVideoTrackInitConfig` are only supported on Chrome.

    * **Mobile**

      ****iOS****

    **iOS known issues**

    iOS 16.0: The video is stretched after the screen changes to a certain orientation

    **Impact**: All browsers and apps that use WKWebView on iOS 16.0, such as Safari and Chrome.

    **Reason**: Due to the regression of the WebRTC module of WebKit on iOS 16.0, RTP streaming with coordination of video orientation (CVO) does not work properly, which causes the video to be stretched after rotation.

    **Workaround**: Agora recommends that you add a prompt to remind users of this issue.

    **iOS 15.1.x: The browser crashes when sending the H.264 video stream**

    **Impact**: All browsers and apps that use WKWebView on iOS 15.1.x, such as Safari and Chrome.

    **Details**: If you set `codec` as `'h264'` when calling `createClient`, the browsers on iOS 15.1.x crash after you send the video stream.

    **Reason**: This issue happens due to the regression of the WebKit video encoder on iOS 15.1.x. For details, see [WebKit Bug 231505](https://bugs.webkit.org/show_bug.cgi?id=231505).

    **Workaround**: Use the VP9 codec for video encoding.

    ```javascript
    createClient({codec:'vp9', mode})
    ```

    **iOS 15.x: The actual bitrate of sending the H.264 video stream is lower than expected**

    **Impact**: Safari on iOS 15.x

    **Reason**: The issue occurs because **WebRTC H264 LowLatency encoder** is enabled by default for Safari on iOS 15.x. For details, see [Webkit bug 238366](https://bugs.webkit.org/show_bug.cgi?id=238366).

    **Workaround**: The following workarounds are available:

    * Use the VP9 codec for video encoding. The sample code is as follows:

      ```javascript
      createClient({codec:'vp9', mode})
      ```
    * On the iOS device, go to **Settings** > **Safari** > **Advanced** > **Experimental Features**, and disable **WebRTC H264 LowLatency encoder**.

    **iOS 15.0 to 15.3: Low audio volume**

    **Impact**: All browsers and apps that use WKWebView on iOS 15.0 to 15.3, such as Safari and Chrome.

    **Details**: On iOS 15.0 to 15.3, after the local user subscribes to the `RemoteAudioTrack` and plays it, sometimes the audio is routed to the earpiece instead of the speaker, and the volume that the local user hear may be very low.

    **Reason**: This issue happens due to the regression of the WebKit audio module on iOS 15.0 to 15.3. For details, see [ WebKit Bug 230902](https://bugs.webkit.org/show_bug.cgi?id=230902).

    **Workaround**: On iOS 15.0 to 15.3, use `WebAudio` to play the audio, and use `GainNode` to increase the audio volume level. Use the following workaround:

    1. Upgrade to the Web SDK 4.9.0 or later versions.
    2. Set the SDK private parameter `REMOTE_AUDIO_TRACK_USES_WEB_AUDIO` as `true`. The SDK uses `WebAudio` to play the remote audio stream. Sample code:
       ```javascript
       function isIOS15(ua){
         // Use UA to judge whether the iOS version is 15
       }

       if(isIOS15(navigator.userAgent)){
         // If you are using Typescript, add the "@ts-ignore" tag before calling setParameter
         // @ts-ignore
         AgoraRTC.setParameter("REMOTE_AUDIO_TRACK_USES_WEB_AUDIO", true);
       }
       ```

    **iOS 15.x: The video playback goes black**

    **Impact**: All browsers and apps that use WKWebView on iOS 15.x, such as Safari and Chrome.

    **Details**: On iOS 15.x, if you play the video in DOM node and add some CSS properties (such as `transform` and `animation`) to the` video` element or its parent element, or if you change the CSS properties to redraw the video rendering area, sometimes the video goes black.

    **Reason**: This issue happens due to the regression of the WebKit video renderer on iOS 15.x. For details, see [WebKit Bug 230902](https://bugs.webkit.org/show_bug.cgi?id=230902).

    **Workaround**: Upgrade to the Web SDK v4.7.3 or later and minimize changes to the CSS properties of the `video` element and its parent elements.

    **iOS 15.x: If a user wears a Bluetooth headset, the audio may be significantly distorted**

    **Impact**: All browsers and apps that use WKWebView on iOS 15.x, such as Safari and Chrome.

    **Reason**: This issue happens due to the regression of the WebKit audio playback module on iOS 15.x. For details, see [WebKit Bug 231422](https://bugs.webkit.org/show_bug.cgi?id=231422).

    **Workaround**: Agora recommends that you add a prompt to remind users of possible audio distortion issues when they use a Bluetooth headset.

    **Backgrounding the browser or app causes the audio streaming to be cut off.**

    **Impact**:

    * Safari on iOS 15.x.
    * Browsers and apps that use WKWebView (such as Chrome) on iOS 14.4 to iOS 15.x.

    **Reason**:

    * For Safari: This happens primarily due to this WebKit [bug](https://bugs.webkit.org/show_bug.cgi?id=231105). After the browser switches to the background, the `AudioContext` of `WebAudio` stops processing audio.
    * For browsers and apps using WKWebView: This happens because iOS `WKWebView` prohibits microphone usage while in the background. For details, see [Microphone gets muted in background](https://developer.apple.com/forums/thread/689182).

    **Workaround**: Currently there is no workaround for browsers and apps using WKWebView. For Safari on iOS 15.x, you can follow these steps to avoid this issue:

    1. Upgrade to the Web SDK v4.7.3 or later versions.
    2. When calling `createMicrophoneAudioTrack`, set `bypassWebAudio` as `true`. The Web SDK directly publishes the local audio stream without processing it through `WebAudio`.

       ```javascript
       const localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack({bypassWebAudio: true});
       ```

    > Note that this workaround has a side effect. After applying this workaround, the audio mixing function (`MixingAudioTrack`) in the SDK fails.

    **iOS 15.x: Audio and video playback might not resume automatically after being interrupted by a system phone call, another real-time interaction app, Siri, or an alarm.**

    **Impact**: All browsers and apps that use WKWebView on iOS 15.x, such as Safari and Chrome.

    **Reason**: Such interruptions can cause the state of the `video` and `audio` elements to be `paused`. After the interruption finishes, the state cannot be automatically switched back to `playing`, and even calling `HTMLMediaElement.play` cannot resume the media playback. See the WebKit bug [232599](https://bugs.webkit.org/show_bug.cgi?id=232599) and [226698](https://bugs.webkit.org/show_bug.cgi?id=226698) for more details.
    **Workaround**: Upgrade to the Web SDK v4.7.3 or later versions. The SDK attempts to resume media playback after the interruption. Agora recommends that you add a prompt that instructs users to refresh the page.

    **iOS 15.x and 16.x: Certain iPad and iPhone models may experience noise issues after entering a channel.**

    **Impact**: Chrome and Safari browsers on specific iPad and iPhone models with iOS 15.x and 16.x. Specific models include:

    * iPad (5th Gen)
    * iPad (6th Gen)
    * iPad (7th Gen)
    * iPad Pro (1st Gen)
    * iPhone SE (1st Gen)

    **Workaround**: Update to the latest iOS version.

    **Other known issues**

    * The volume of a remote user can change randomly on iOS 13 and 14.

      * Switching between the front and rear cameras can momentarily rotate the video.
      * The audio routing can change randomly. Sometimes, the audio is routed to the speakerphone when a headset is connected or to the earpiece when no headset is connected.
      * If you call `getUserMedia` twice to get two tracks of the same media type, the first track goes muted or black.
      * After a user switches to another app that uses the microphone or camera (such as Siri or Skype) and then switches back, the audio sampling or video capture fails.

      **iOS known limitations**

      **The `createScreenVideoTrack` method is not supported**

    Reason: iOS Safari and WKWebView do not support the `mediaDevices.getDisplayMedia` method.

    **The `setBeautyEffect` method is not supported**

    Reason: WebGL is not well supported on iOS Safari and WKWebView, and the image enhancement algorithm can reduce the system performance below acceptable levels.

    **`The IBufferSourceAudioTrack.seekAudioBuffer` method is not supported**

    Reason: `WebAudio` on iOS does not support this method.

    **Cannot send H.264 video streams with a resolution of 1080p or higher**

    Reason: The Web SDK uses the H.264 Baseline Profile for negotiation, so encoding and sending a video stream with a resolution of 1080p or higher is not supported on iOS.

    **When sending a low-quality stream on iOS Safari, you cannot set `LowStreamParameter.bitrate`, and the resolution of the low-quality stream must be proportional to the resolution of the high-quality stream.**

    Reason: iOS Safari and WkWebView do not support setting the frame rate with the `RTCRTPSender.setParameters` method. After compressing the resolution with the `scaleResolutionDownBy` property, the resolution of the low-quality stream stays proportional to the resolution of the high-quality stream.

    **The `encodeDelay` property is not supported**

    Reason: The `encodeDelay` property cannot be calculated through the `getStats` method of WebRTC on iOS.

    **Backgrounding the browser or app causes the user's video to display as a black screen**

    Reason: iOS `AVCaptureSession` prohibits camera usage while in the background. For details, see [AVCaptureSessionInterruptionReason](https://developer.apple.com/documentation/avfoundation/avcapturesessioninterruptionreason/avcapturesessioninterruptionreasonvideodevicenotavailableinbackground?preferredLanguage=occ) or [Chromium issue 4294](https://bugs.chromium.org/p/webrtc/issues/detail?id=4294).

    **Calling `RemoteAudioTrack.setVolume` has no effect on the playback volume of the remote audio**

    Reason: iOS and iOS WebView do not support setting the volume of a media object through the `HTMLMediaElement.volume` property.

    ****Android****

    **Android known issues**

    Android 12: Video distortion on Chrome when hardware acceleration is enabled

    **Impact**: The Chrome browser or Chromium kernel browser 97 or earlier on certain devices with Android 12, such as Pixel 3 and Pixel 4.

    **Details**: If the Chrome browser on Android 12 enables the WebRTC `H264` or `VP9` hardware acceleration by default, video distortion can occur.

    **Reason**: This issue happens due to the regression of the Chromium WebRTC video encoder. For details, see [Chromium issue 1237677](https://bugs.chromium.org/p/chromium/issues/detail?id=1237677).

    **Workaround**: Chrome 97 fixed this issue. You can instruct users to upgrade to Chrome 97 or later versions.

    **The bitrate when sending video on Android Chrome fails to reach the preset value.**

    **Scope**: Certain Android devices, such as Xiaomi and OnePlus.

    **Reason**: This is a hardware encoder issue. The bitrate fails to reach the preset value at a specific video encoding frame rate.

    **Workaround**: In most cases, the bitrate is relatively lower when the frame rate is set as 15 fps. If you set the frame rate as 30 fps, the bitrate increases. So Agora recommends trying to set the frame rate as 30 fps when encountering a bitrate issue. However, setting the frame rate as fps may cause performance issues.

    **The autoplay of inaudible media is blocked on WeChat**

    **Impact**: The WeChat browser using Chromium 89 kernel

    **Details**: The autoplay of inaudible media is blocked. Even after the user interacts with the webpage to resume the video playback, the autoplay block is still not removed.

    **Reason**: This issue happens because the WeChat browser implements a custom autoplay policy.

    **Workaround**: Follow these steps to avoid this issue:

    1. Upgrade to the Web SDK v4.6.0 or later versions.
    2. Listen to the `AgoraRTC.onAutoplayFailed` event. Instruct the user to click on the page to resume playback:

       ```javascript
       AgoraRTC.onAutoplayFailed = ()=>{
         document.alert('Please click the page to resume playback');
       }
       ```

    **If a local user wears a Bluetooth headset, after they start to send the audio, the remote audio is lost**

    **Scope**: Certain Xiaomi and OnePlus devices

    **Details**: If a local user wears a Bluetooth headset, when the Bluetooth headset starts capturing the audio, there is a possibility that the remote audio is lost.

    **Reason**: It may be due to the audio issue on Chromium regarding the profile switch of the Bluetooth.

    **Workaround**: Agora recommends that you add a prompt to remind users of possible audio-loss issues when they use a Bluetooth headset.

    **When a local user is sending audio, switching the audio output device does not take effect**

    **Scope**: Chromium-based browsers on Android devices

    **Details**: When a local users is sending audio, if the user switches from using the speaker to using a Bluetooth headset, the remote audio still comes from the speaker.

    **Reason**: The audio routing on Android devices is controlled by the Android operating system and cannot be fixed at Chromium's level. For details, see [Chromium issue 1317548](https://bugs.chromium.org/p/chromium/issues/detail?id=1317548\&q=bluetooth\&can=2).

    **Issues specific to certain Android devices**

    * On devices equipped with **MediaTek chips**, the Web SDK cannot encode and send video streams in H.264.

      * On devices equipped with Huawei **HiSilicon Kirin** chips, if you use Chrome versions earlier than 88, the Web SDK cannot encode and send video streams in H.264.
      * When receiving video streams on Chrome on **OnePlus 6**, if the screen turns off, the video can freeze.
      * **Harmony OS** does not support sending the video stream of 180p.

      **Other known issues**

    * On some Android devices, the device labels might not be available.

      * On some Android devices, tracks can end if the audio and video streams are interrupted by system phone calls or other audio or video calling apps. To resume the call, the Web SDK needs to re-capture the audio and video.
      * On Android Chrome, the Web SDK cannot send high-quality and low-quality streams in H.264.
      * On Android Chrome earlier than 90, the volume obtained by `getVolumeLevel` is 0, but the user can hear the audio.
      * On Android system Webview versions from 55 to 75, the `decodeFrameRate` property stays 0.
      * When running Android 11 on certain OPPO models, such as Reno4 and A11, users will experience black screens and no sound due to the lack of WebRTC support.

      **Android known limitations**

      **The `createScreenVideoTrack` method is not supported**

    Reason: The `mediaDevices.getDisplayMedia` method is not implemented on mobile browsers and WkWebView.

    **The `setBeautyEffect` method is not supported**

    Reason: The image enhancement algorithm can reduce the system performance of mobile devices below acceptable levels.

    ### 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/voice/reference/firewall).

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

    * **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-40]

    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-4]

    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-41]

    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-38]

    * **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-42]

    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-39]

    * **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-43]

    * **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-3]

    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-40]

    * **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="info">
      <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-44]

    * **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-40]

    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/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-24]

    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-41]

    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-45]

    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](../build/optimize-and-operate/app-size-optimization.mdx).

    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="info">
      <CalloutDescription>
        Safari does not support VP9 SVC.
      </CalloutDescription>
    </CalloutContainer>

    #### Bug fixes [#bug-fixes-4]

    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-21]

    **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-42]

    **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/voice-sdk/web/4.x/interfaces/iagorartc.html#createscreenvideotrack).

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

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

    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-46]

    This release includes several internal improvements.

    ### v4.22.0 [#v4220]

    v4.22.0 was released on 16 August, 2024.

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

    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](../build/optimize-and-operate/app-size-optimization.mdx) for details on how to integrate.

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

    **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](pricing.mdx).

    **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-47]

    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-41]

    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-23]

    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-26]

    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-44]

    **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-48]

    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-42]

    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-24]

    **Added**

    * `AgoraRTC.preload`

    ### v4.20.2 [#v4202]

    v4.20.2 was released on March 21, 2024.

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

    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-45]

    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)](../build/secure-and-protect-channels/media-stream-encryption.mdx) 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-49]

    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-44]

    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-25]

    **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-27]

    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-46]

    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/voice-sdk/web/4.x/interfaces/iagorartc.html#resumeaudiocontext).

    #### Improvements [#improvements-50]

    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-26]

    **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-45]

    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-51]

    **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-27]

    **Added**

    * `"720p_auto"` to `VideoEncoderConfigurationPreset`

    ### v4.19.1 [#v4191]

    v4.19.1 was released on October 11, 2023.

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

    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">
      <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: <ul><li> If you intend to use Webpack 4.x, upgrade the SDK to v4.19.1.</li><li> If you prefer to continue using v4.19.0, Agora recommends bundling your app with Webpack 5.x or other tools such as Vite.</li></ul>
      </CalloutDescription>
    </CalloutContainer>

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

    **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-47]

    **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/api-reference/sdks).

    **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/voice-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/voice-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](https://docs-beta.agora.io/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-52]

    **Optimized automatic mode**

    In the automatic mode, the SDK initially attempts a direct connection to Agora SDRTN®. 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-47]

    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-28]

    **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-48]

    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-49]

    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-53]

    **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-50]

    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-48]

    **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](https://docs-beta.agora.io/en/realtime-media/video/reference/release-notes) for details.

    #### Improvements [#improvements-54]

    **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-29]

    **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-51]

    v4.18.0 fixes the following issues:

    * Mobile devices experienced delays in receiving notifications for the [broadcaster leave channel event](../build/optimize-and-operate/receive-notifications.mdx).
    * 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-52]

    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-29]

    <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/voice-sdk/web/4.x/interfaces/screenvideotrackinitconfig.html) in the API reference.

    #### Improvements [#improvements-55]

    **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/broadcast-streaming/build/manage-video-and-streaming/configure-video-encoding).

    **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-30]

    **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-49]

    **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-56]

    **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-31]

    **Added**

    * `ILocalVideoTrack.replaceTrack`

    **Deleted**

    * `ILocalVideoTrack.setBeautyEffect`

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

    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]

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

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

    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]

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

    #### Improvements [#improvements-57]

    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`

    * `sendResolutionHeight`

    * `sendResolutionWidth`                                                 |
    | `RemoteVideoTrackStats` | - `receiveFrameRate`

    - `receiveResolutionHeight`

    - `receiveResolutionWidth`

    - `renderFrameRate`

    - `receiveDelay` |
    | `RemoteAudioTrackStats` | * `receiveDelay`

    * `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-55]

    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-56]

    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-50]

    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 SDRTN® 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①                                                                                              |
    | ------- | ---------------------------------------------------------------------------------------------------------------- |
    | Desktop | * Chrome 65 or later

    * Firefox 69 or later

    * Edge 79 or later

    * Safari 16 or later                            |
    | Android | - Chrome 68 or later

    - Wechat v8.0.6 or later

    - 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-58]

    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-32]

    **Added**

    * `IAgoraRTC.onSecurityPolicyViolation`

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

    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](../build/manage-connection-and-quality/cloud-proxy.mdx).

    ### v4.14.2 [#v4142]

    v4.14.2 was released on October 27, 2022.

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

    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-58]

    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-31]

    **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-59]

    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-51]

    #### Improvements [#improvements-59]

    **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-33]

    **Added**

    * `RemoteAudioTrack.pipe`
    * `RemoteAudioTrack.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 SDRTN®; 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.

    ### v4.12.0 [#v4120]

    v4.12.0 was released on June 15, 2022.

    #### Improvements [#improvements-60]

    **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/marketplace/build/add-video-and-ar-effects/banuba).

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

    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-32]

    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 SDRTN®; 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-61]

    **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-5]

    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-52]

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

    **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-53]

    **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`.

    #### Improvements [#improvements-62]

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

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

    v4.9.0 fixed the following issues:

    * 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-35]

    **Added**

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

    ### v4.8.2 [#v482]

    ### 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-54]

    #### Improvements [#improvements-63]

    v4.8.0 made some internal improvements.

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

    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-36]

    ### 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 Voice 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:

    * 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-33]

    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-64]

    This release makes the following improvements:

    * Optimizes the end-user experience of the Voice 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-63]

    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-1]

    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-3]

    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-1]

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

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

    v4.6.0 was released on July 16, 2021.

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

    **Interactive Live Streaming Standard**

    As of v4.6.0, the Voice 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](../product-overview.md) and [pricing](pricing.mdx) 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:

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

    #### Improvements [#improvements-65]

    **Dealing with autoplay blocking**

    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-64]

    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-37]

    **Added**

    * `localTrack.setMuted`

    * `onAutoplayFailed`

    * `clientRoleOptions` in `ClientConfig`

    * `options` in the `setClientRole` method

    **Deprecated**

    * `onAudioAutoplayFailed`

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

    v4.5.0 was released on May 25, 2021.

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

    **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-66]

    **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](../build/secure-and-protect-channels/media-stream-encryption.mdx).

    **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).

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

    v4.5.0 fixes the following issues:

    * The `OptimizationMode` setting did not take effect.

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

    * 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-38]

    **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-3]

    v4.4.0 was released on April 2, 2021.

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

    **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-67]

    **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**

    **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-66]

    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-39]

    **Added**

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

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

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

    v4.3.0 was released on January 26, 2021.

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

    **Cloud proxy**

    This release optimizes the Agora cloud proxy architecture and enhances the connectivity of the Voice 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](../build/manage-connection-and-quality/cloud-proxy.mdx).

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

    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-3]

    v4.2.0 was released on December 1, 2020.

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

    **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.

    **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-68]

    * 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-67]

    * 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.

    * 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-40]

    **Added**

    * `AgoraRTC.setArea`

    * `AgoraRTCClient.getRemoteNetworkQuality`

    **Changed**

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

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

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

    * Improved the accuracy of the `event_network_quality` event.

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

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

    v4.1.0 was released on September 4, 2020.

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

    **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-69]

    * 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-68]

    * 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-41]

    **Added**

    * `AgoraRTC.getPlaybackDevices`

    * `LocalAudioTrack.setPlaybackDevice`

    * `RemoteAudioTrack.setPlaybackDevice`

    * `AgoraRTC.onPlaybackDeviceChanged`

    * `Client.getLocalAudioStats`

    * `Client.getRemoteAudioStats`

    **Deprecated**

    ### v4.0.1 [#v401-3]

    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-3]

    v4.0.0 was released on July 15, 2020.

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

    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.

    > 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-60]

    #### Improvements [#improvements-70]

    * The `Client.subscribe` method.

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

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

    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.

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

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

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

    **Added**

    * The `Client.localTracks` interface

    * The `LocalTrack.setEnabled` method

    **Updated**

    * 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 `RemoteAudioTrackStats.muteState` property

    **Deleted**

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

    * The `LocalTrack.setMute` method

    * The `AgoraRTCRemoteUser.audioMuted` property

    * The `LocalTrack.getUserId` method

    ## AI Noise Suppression [#ai-noise-suppression]

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges additionally for this extension. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    ### v2.0.2 [#v202]

    Released on June 24, 2026.

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

    * 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-36]

    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-62]

    * 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-71]

    * 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-43]

    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-63]

    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-37]

    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/interactive-live-streaming/build/apply-effects-and-enhancements/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/ai).

    <CalloutContainer type="warning">
      <CalloutDescription>
        The `agora-conversational-ai-denoiser` plugin has high CPU usage. Agora recommend 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 & Limitations [#browser-support--limitations]

    * **Safari & 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, we recommend 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]

    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]

    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-64]

    * Support for VP9 codec, which provides better video compression and quality.

    #### Improvements [#improvements-72]

    * Dynamic background switching. Users can change backgrounds without restarting the video stream.
    * Ability to disable/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/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-38]

    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-73]

    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-6]

    This release fixed the issue that `checkCompatibility` could return inaccurate results on specific devices.

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

    The `wasmDir` parameter of the `init` method is now optional.

    ### v1.1.3 [#v113]

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

    This release fixes the occasional issue of jagged background images on Chrome for Android.

    ### v1.1.2 [#v112]

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

    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/interactive-live-streaming/build/apply-effects-and-enhancements/virtual-background).

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

    Virtual Background supports Agora Video SDK for Web v4.15.0 or later.

    ### v1.1.1 [#v111]

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

    You can now call `checkCompatibility` and test if AI Noise Suppression extension is supported on the current browser. For API details, see [Virtual background](/en/realtime-media/interactive-live-streaming/build/apply-effects-and-enhancements/virtual-background).

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

    A black bar is no longer displayed to the left of the virtual background.

    ### v1.1.0 [#v110-1]

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

    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 improves video quality without altering the resolution, thereby optimizing the viewing experience at the receiving end. For detailed integration steps, refer to the [Super Clarity integration guide](/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-1]

    Released on November 18, 2025

    #### Improvements [#improvements-74]

    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 the first version of `agora-extension-super-clarity`. For detailed integration steps, refer to Super Clarity.

    ## Watermark extension [#watermark-extension]

    ### v1.0.0 [#v100-2]

    Released on November 18, 2025.

    This the first version of `agora-extension-video-watermark`. For detailed integration steps, refer to Video 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 the first version of `agora-extension-videp-compositor`. For detailed integration steps, refer to [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 the first version of `agora-extension-beauty-effect`. For detailed integration steps, refer to [Beauty Effect](/en/realtime-media/video/build/apply-video-effects/beauty-effect).

    ## Notifications [#notifications-2]

    ### 2022.10 [#202210-2]

    * After you enable Notifications, your server receives the events that you subscribe to in the form of HTTPS requests.
    * To improve communication security between the Notifications and your server, Agora SDRTN® uses signatures
      for identity verification.
    * As of this release, you can use Notifications in conjunction with this product.

    ## AI Noise Suppression [#ai-noise-suppression-1]

    <CalloutContainer type="info">
      <CalloutDescription>
        Agora charges additionally for this extension. See [Pricing](/en/realtime-media/video/reference/pricing).
      </CalloutDescription>
    </CalloutContainer>

    ### v2.0.1 [#v201-2]

    Released on April 1, 2026.

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

    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-68]

    * 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-75]

    * 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-45]

    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-2]

    #### Improvement [#improvement-1]

    This release improves the calculation performance of the AI-powered noise suppression algorithm.

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

    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-41]

    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/interactive-live-streaming/build/apply-effects-and-enhancements/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-3]

    First release.

    ## Noise suppression for use cases involving AI [#noise-suppression-for-use-cases-involving-ai-1]

    ### v1.0.0-beta2 [#v100-beta2-1]

    [`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/ai).

    <CalloutContainer type="warning">
      <CalloutDescription>
        The `agora-conversational-ai-denoiser` plugin has high CPU usage. Agora recommend using it only for AI-related use cases.
      </CalloutDescription>
    </CalloutContainer>

    #### Key features: [#key-features-2]

    * 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.

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

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

    ### Known issues [#known-issues-5]

    <CalloutContainer type="info">
      <CalloutDescription>
        Starting from v4.5.0, both Voice SDK and Signaling SDK (v2.2.0 and above) include the `libaosl.dll` library. If you manually integrate Voice SDK via CDN and also use Signaling SDK, delete the earlier version of the `libaosl.dll` library to avoid conflicts. You can check the version by viewing the `libaosl.dll` file properties.
      </CalloutDescription>
    </CalloutContainer>

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

    Released on January 19, 2026.

    #### Improvements [#improvements-76]

    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`.

    * **Additional improvements**

      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

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

    This release introduces the following compatibility changes:

    * **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-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-43]

    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/voice/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](/media-push/product-overview) 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`

    * **Deletion of redundant APIs**

      Removed the following redundant APIs and parameters:

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

    * **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.

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

    * **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.

    * **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.

    * **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.

    #### Improvements [#improvements-77]

    * 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-70]

    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">
      <CalloutDescription>
        The `aosl.dll` library version in Voice SDK v4.5.2 is 1.2.13.
      </CalloutDescription>
    </CalloutContainer>

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

    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 6, 2025.

    <CalloutContainer type="info">
      <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.1 is 1.2.13. You can check the version by viewing the `aosl.dll` file properties.
      </CalloutDescription>
    </CalloutContainer>

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

    **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/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-72]

    This release resolves the following issues:

    * 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-44]

    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.

    **Attention:**

    <CalloutContainer type="info">
      <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` |

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

    1. **Local audio mixing**

       This version introduces the local audio mixing feature. You can call the [`startLocalAudioMixer`](https://api-ref.agora.io/en/voice-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.

    2. **Others**

       * [`onLocalVideoStateChanged`](https://api-ref.agora.io/en/voice-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/voice-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-78]

    1. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/voice-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.

    2. **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:

    * 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-45]

    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">
      <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/voice-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`   |

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

    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 `VOICE_AI_TUNER_TYPE` enum to achieve effects like deep voice, cute voice, husky singing voice, and so on.

    #### Improvements [#improvements-79]

    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. **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 `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-80]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-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-73]

    This version fixed the following issue:

    * The app occasionally crashed when remote users left the channel.

    ### v4.3.1 [#v431-3]

    v4.3.1 was released on April 29, 2024.

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

    1. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    3. **Beta features**

       * Speech driven avatar is released in beta. See [beta documentation](https://docs-beta.agora.io/en/realtime-media/voice/reference/release-notes) for details.

    #### Improvements [#improvements-81]

    1. **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.

    2. **Other improvements**

       This version also includes the following improvements:

       * In [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/voice-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/voice-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-74]

    This version fixed the following issues:

    * When a user plugged and unplugged a Bluetooth or wired headset once, the audio state change callback [onAudioDeviceStateChanged](https://api-ref.agora.io/en/voice-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/voice-sdk/cpp/4.x/API/class_iaudiodevicecollection.html#api_iaudiodevicecollection_setdevice), there was no sound from the remote end.

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

    **Added**

    * [registerFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MEDIA\_SOURCE\_TYPE](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/enum_mediasourcetype.html) adds `SPEECH_DRIVEN_VIDEO_SOURCE`
    * [VIDEO\_SOURCE\_TYPE](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/enum_videosourcetype.html) adds `VIDEO_SOURCE_SPEECH_DRIVEN`
    * [EncryptionConfig](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [ENCRYPTION\_ERROR\_TYPE](https://api-ref.agora.io/en/voice-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/voice-sdk/cpp/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ERROR\_CODE\_TYPE](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/enum_errorcodetype.html) adds `ERR_DATASTREAM_DECRYPTION_FAILED`
    * [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/voice-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/voice-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [EAR\_MONITORING\_FILTER\_TYPE](https://api-ref.agora.io/en/voice-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-46]

    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. **Audio loopback capturing**

       * Before v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

    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.

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

    1. **Query Device Score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/cpp/4.x/API/class_mediasource.html).

    3. **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.

       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-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/voice-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-82]

    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/voice-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/voice-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/voice-sdk/cpp/4.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) class.

    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/voice-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/voice-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/voice-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/voice-sdk/cpp/4.x/API/class_playerplaybackstats.html).

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

    This release fixed the following issue:

    * The SDK failed to detect any changes in the audio routing after plugging in and out 3.5mm earphones.

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

    **Added**

    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [queryDeviceScore](https://api-ref.agora.io/en/voice-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/voice-sdk/cpp/4.x/API/enum_mediasourcetype.html)
    * The `ROUTE_BLUETOOTH_DEVICE_A2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/enum_audioroute.html)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/cpp/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/voice-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-76]

    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-76]

    1. **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.

    2. **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.

    #### Improvements [#improvements-83]

    **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-77]

    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.

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

    **Added**

    * `serverConfig` in `ContentInspectConfig`
    * `isFeatureAvailableOnDevice`
    * `FeatureType`

    ### v4.2.2 [#v422-3]

    v4.2.2 was released on july 27, 2023.

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

    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 [Deploy a token server](/en/realtime-media/voice/build/set-up-token-authentication/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 `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 [Deploy a token server](/en/realtime-media/voice/build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

    #### Improvements [#improvements-84]

    **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-78]

    This release fixed the following issues:

    * 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.

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

    **Added**

    * `preloadChannel[1/2]`
    * `preloadChannel[2/2]`
    * `updatePreloadChannelToken`

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

    This version was released on June 21, 2023.

    #### Improvements [#improvements-85]

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

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

    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.

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

    v4.2.0 was released on May 24, 2023.

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

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

    **1. Channel media options**

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

    **2. 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 following methods are updated accordingly:
      * `onFrame`
      * `registerAudioFrameObserver` \[1/2] and `registerAudioFrameObserver`\[2/2] in `IMediaPlayer`
    * `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-78]

    **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](pricing-legacy.md#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. 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-86]

    **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. 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.

    **3. 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 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-50]

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AUDIO_TRACK_TYPE`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`

    **Deprecated**

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

    **Deleted**

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

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

    v4.1.1 was released on February 8, 2023.

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

    **Instant frame rendering**

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

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

    This release fixed the issue that playing audio files with a sample rate of 48 kHz failed.

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

    **Added**

    `enableInstantMediaRendering`

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

    v4.1.0 was released on December 15, 2022.

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

    **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. 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).

    **3. 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`

    **4. Device management**

    This release adds a series of callbacks to help you better understand the status of your audio devices:

    * `onAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `onAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **5. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio streams.
    * The `muteAllRemoteAudioStreamsEx` is used to cancel or resume the subscription of all remote users to audio streams.
    * 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. 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.

    #### Improvements [#improvements-87]

    **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 `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.

    **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.

    **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.
    * Enhances the ability to identify different network protocol stacks and improves the SDK's access capabilities in multiple-operator network scenarios.

    <a name="bugfix" />

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

    This release fixed the following issues:

    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was sharing a screen.
    * The call `getExtensionProperty` failed and returned an empty string.

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

    **Added**

    * `setHeadphoneEQParameters`

    * `leaveChannelEx [2/2]`

    * `muteLocalAudioStreamEx`

    * `muteAllRemoteAudioStreamsEx`

    * `startRtmpStreamWithoutTranscodingEx`

    * `startRtmpStreamWithTranscodingEx`

    * `updateRtmpTranscodingEx`

    * `stopRtmpStreamEx`

    * `startChannelMediaRelayEx`

    * `updateChannelMediaRelayEx`

    * `pauseAllChannelMediaRelayEx`

    * `resumeAllChannelMediaRelayEx`

    * `stopChannelMediaRelayEx`

    * `newRoleOptions` in `onClientRoleChanged`

    * `adjustUserPlaybackSignalVolumeEx`

    * `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.

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

    **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](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.

    <CalloutContainer type="info">
      <CalloutDescription>
        To enable this function, contact [technical support](mailto\:support@agora.io).
      </CalloutDescription>
    </CalloutContainer>

    **4. Loopback device**

    The SDK uses the playback device as the loopback device by default. Since v4.0.1, 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.

    **5. 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 scenarios.

    * 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.

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

    **Added**

    * `enableInEarMonitoring`
    * `setEarMonitoringAudioFrameParameters`
    * `onEarMonitoringAudioFrame`
    * `setInEarMonitoringVolume`
    * `getEarMonitoringAudioParams`
    * `getNetworkType`
    * `setRecordingDeviceVolume`
    * `isAudioFilterable` in the `ChannelMediaOptions`
    * `setLoopbackDevice`
    * `getLoopbackDevice`
    * `followSystemLoopbackDevice`
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `muteRemoteAudioStream`
    * `SpatialAudioParams`
    * `setHeadphoneEQPreset`
    * `HEADPHONE_EQUALIZER_PRESET`

    **Deprecated**

    * `startEchoTest` \[2/3]

    ### v4.0.0 [#v400-4]

    v4.0.0 was released on September 15, 2022.

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

    **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
    * 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](./migration-guide).

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

    **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 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`).

    **2. 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.

    **3.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.
    <div class="alert info">To experience this feature, contact [support@agora.io](mailto\:support@agora.io).</div>

    **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**

    <div class="alert info">
      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.
    </div>

    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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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://console.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](../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](/extensions-marketplace/get-started/quickstart-implement).

    **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 sources.
    * Sets or switches channel profile and user role.
    * 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. 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.

    **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 `AUDIO_SCENARIO_DEFAULT` to `AUDIO_SCENARIO_GAME_STREAMING` when you are in a channel, you can call this method.

    #### Improvements [#improvements-88]

    **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. 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.

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

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

    ### Known issues [#known-issues-6]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * Electron SDK v4.4.0

      **MacOS 15 Sequoia beta system issue**

      When the app path (including the App name) contains non-English characters (such as Chinese characters), the compiled `Metal shader library` may not contain any methods, causing the app to crash. See [this article](/en/api-reference/faq/other/macos_15_beta) for the workaround.

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

    Released on March 14, 2026.

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

    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`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `enableWirelessAccelerate`

    * **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`

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

    Included in this release:

    * **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.

    * **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.

    * **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.

    #### Improvements [#improvements-89]

    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`.

    * **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.
      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

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

    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.
    * 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.
    * 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.

    ### v4.5.1 [#v451-4]

    v4.5.1 was released on March 13, 2025.

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

    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/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-83]

    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-50]

    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/voice-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/voice-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-85]

    1. **Live show scenario**

       This version adds the `ApplicationScenarioLiveshow`(3) (Live Show) enumeration to [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/voice-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/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-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/voice-sdk/electron/4.x/API/enum_mediadevicestatetype.html) adds the `MediaDeviceStatePluggedIn` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-90]

    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/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotWithConfigEx`](https://api-ref.agora.io/en/voice-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/voice-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-84]

    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-51]

    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-86]

    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.

    #### Improvements [#improvements-91]

    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. **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-85]

    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-92]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-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-86]

    This version fixed the following issue:

    * The app occasionally crashed when remote users left the channel.
    * Calling `leaveChannelEx` without passing in the `options` parameter occasionally led to app crashes.

    ### v4.3.1 [#v431-4]

    v4.3.1 was released on May 9, 2024.

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

    1. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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.

    2. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    #### Improvements [#improvements-93]

    1. **Audio device type detection (macOS)**

       This version adds the `deviceTypeName` in [AudioDeviceInfo](https://api-ref.agora.io/en/voice-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.

    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:

       * In [AudioEffectPreset](https://api-ref.agora.io/en/voice-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/voice-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-87]

    This version fixed the following issues:

    * 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/voice-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).

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

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (macOS)
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (macOS)
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [unregisterFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_imediaengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/enum_mediasourcetype.html) adds `SpeechDrivenVideoSource`
    * [VideoSourceType](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/enum_videosourcetype.html) adds `VideoSourceSpeechDriven`
    * [EncryptionConfig](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [EncryptionErrorType](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `EncryptionErrorDatastreamDecryptionFailure`
      * `EncryptionErrorDatastreamEncryptionFailure`
    * [AudioDeviceInfo](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_audiodeviceinfo.html) adds `deviceTypeName` (macOS)
    * [RemoteAudioStats](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ErrorCodeType](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/enum_errorcodetype.html) adds `ErrDatastreamDecryptionFailed`
    * [AudioEffectPreset](https://api-ref.agora.io/en/voice-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/voice-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [EarMonitoringFilterType](https://api-ref.agora.io/en/voice-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-52]

    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. **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.

    4. **Audio loopback capturing**

       * Before v4.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

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

    1. **Query Device Score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/electron/4.x/API/class_mediasource.html).

    3. **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.

       * [setPlaybackDeviceVolume](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/electron/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionInString](https://api-ref.agora.io/en/voice-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/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-94]

    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/voice-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/voice-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/voice-sdk/electron/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.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-sdk/electron/4.x/API/class_playerplaybackstats.html).

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

    This release fixed the following issue:

    * The SDK failed to detect any changes in the audio routing after plugging in and out 3.5 mm earphones.

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

    **Added**

    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CustomVideoSource` enumeration in [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/enum_mediasourcetype.html)
    * The `RouteBluetoothDeviceA2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/enum_audioroute.html)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/electron/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/voice-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-89]

    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-90]

    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.

    #### Improvements [#improvements-95]

    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-91]

    This release fixed the following issues:

    * 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.

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

    **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.1 [#v421-5]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-96]

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

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

    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.

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

    v4.2.0 was released on May 29, 2023.

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

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

    **1. Channel media options**

    * `publishCustomAudioTrackEnableAec` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishCustomAudioSourceId` is renamed to `publishCustomAudioTrackId`.

    **2. 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>

    **3. 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-89]

    **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](pricing-legacy.md#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    #### Improvements [#improvements-97]

    **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. 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.

    **3. 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-93]

    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 was receiving 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).
    * Playing audio files with a sample rate of 48 kHz failed.

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

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `getCurrentMonotonicTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioAinsMode`
    * `AudioTrackType`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`

    **Deprecated**

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

    **Deleted**

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

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

    v4.1.0 was released on December 20, 2022.

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

    **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.

    <div class="alert info">
      To enable this function, contact 

      [support@agora.io](mailto:support@agora.io/)

      .
    </div>

    **4. 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.

    **5. 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.

    **6. 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.

    **7. 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.

    <div class="alert info">
      To enable this feature, contact 

      [support@agora.io](mailto:support@agora.io)

      .
    </div>

    **8. 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`

    **9. Device management**

    This release adds a series of callbacks to help you better understand the status of your audio devices:

    * `onAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `onAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **10. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream.
    * The `muteAllRemoteAudioStreamsEx` is used to cancel or resume the subscription of all remote users to audio.
    * 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 is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    #### Improvements [#improvements-98]

    **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 `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.

    **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.

    **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.
    * 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-94]

    This release fixes the following issues:

    **All**

    The call `getExtensionProperty` failed and returned an empty string.

    **macOS**

    After starting and stopping the audio capture device test, there was no sound when the audio playback device was subsequently started.

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

    **Added**

    * `getNativeHandle`
    * `getPlaybackDefaultDevice`
    * `getRecordingDefaultDevice`
    * `getNetworkType`
    * `setLoopbackDevice` (Windows)
    * `getLoopbackDevice` (Windows)
    * `followSystemLoopbackDevice` (Windows)
    * `setZones`
    * `setRemoteAudioAttenuation`
    * `setHeadphoneEQPreset`
    * `setHeadphoneEQParameters`
    * `HeadphoneEqualizerPreset`
    * `adjustUserPlaybackSignalVolumeEx`
    * `RhythmPlayerStateType`
    * `RhythmPlayerErrorType`
    * `enableAudioVolumeIndicationEx`
    * `onAudioDeviceStateChanged`
    * `onAudioDeviceVolumeChanged`
    * `registerExtension` (Windows)
    * `muteLocalAudioStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`

    **Modified**

    * Adds `isAudioFilterable` in `ChannelMediaOptions`
    * Adds `enable_doppler` in `SpatialAudioParams`
    * Adds `options` in `leaveChannelEx`
    * Adds `newRoleOptions` in `onClientRoleChanged`
    * `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-5]

    v4.0.0 was released on September 29, 2022.

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

    **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 v3.7.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](./migration-guide).

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

    **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.

    > ***NOTE:*** 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 [technical support](mailto\:support@agora.io).

    **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.

    **3.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.0). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option.

    > ***NOTE:*** To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    **5. 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.

    **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 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.

    **9. 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.

    **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 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.

    > ***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-99]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v3.7.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" />

    ### Known issues [#known-issues-7]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * Flutter SDK v6.3.2

      **MacOS 15 Sequoia beta system issue**

      When the app path (including the App name) contains non-English characters (such as Chinese characters), the compiled `Metal shader library` may not contain any methods, causing the app to crash. See [this article](/en/api-reference/faq/other/macos_15_beta) for the workaround.

    * Flutter SDK v6.2.6

      **AirPods Pro Bluetooth connection issue (iOS)**

      AirPods Pro does not support the A2DP protocol in the communication audio mode, which may lead to connection failure in this mode.

    ### v6.6.2 [#v662]

    Released on March 18, 2026. Corresponds to Native SDK v4.6.2

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

    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`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `enableWirelessAccelerate`

    * **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`

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

    Included in this release:

    * **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.

    * **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.

    * **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.

    #### Improvements [#improvements-100]

    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`.

    * **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.
      * Adds error codes `errPcmSendFormat (200)` and `errPcmSendBufferOverflow (201)` to report PCM data transmission errors.

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

    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.

    ### v6.5.2 [#v652]

    Released on May 6, 2025.

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

    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 interactions.
    * 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.
    * Playing an MP4 file with EAC3 audio encoding using `startAudioMixing` sometimes resulted in no sound. (Android)
    * During audio calls, the app occasionally froze. (Android, iOS)
    * 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)

    ### v6.5.1 [#v651]

    v6.5.1 was released on March 13, 2025.

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

    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/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-101]

    * Reduces the SDK initialization time on specific device models. (iOS)

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

    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]

    v6.5.0 was released on December 10, 2024.

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

    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/voice-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/voice-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. **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.

    5. 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-94]

    1. **Live show scenario**

       This version adds the `applicationScenarioLiveshow`(3) (Live Show) enumeration to [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-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/voice-sdk/flutter/6.x/API/enum_mediadevicestatetype.html) adds the `mediaDeviceStatePluggedIn` enumeration, indicating that the device has been plugged in. (Windows)

    #### Improvements [#improvements-102]

    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/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotWithConfigEx`](https://api-ref.agora.io/en/voice-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/voice-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-98]

    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-57]

    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-95]

    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.

    #### Improvements [#improvements-103]

    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. **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-99]

    This release fixed the following issues:

    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time
      interaction (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-104]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-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-100]

    This version fixed the following issues:

    * 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/voice-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/voice-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).

    ### v6.3.1 [#v631]

    v4.3.1 was released on May 9, 2024.

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

    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">
         <CalloutDescription>
           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.
         </CalloutDescription>
       </CalloutContainer>

    2. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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.

    3. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    #### Improvements [#improvements-105]

    1. **Audio device type detection (macOS)**

       This version adds the `deviceTypeName` in [AudioDeviceInfo](https://api-ref.agora.io/en/voice-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.

    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:

       * Enhanced performance and stability of the local compositing feature, reducing its CPU usage (Android).
       * In [AudioEffectPreset](https://api-ref.agora.io/en/voice-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/voice-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-101]

    This version fixed the following issues:

    * 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).
    * 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-59]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (iOS, macOS)
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (iOS, macOS)
    * [setCameraStabilizationMode](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode) (iOS)
    * [CameraStabilizationMode](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_camerastabilizationmode.html) (iOS)
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [unregisterFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_imediaengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [FaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_mediasourcetype.html) adds `speechDrivenVideoSource`
    * [VideoSourceType](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_videosourcetype.html) adds `videoSourceSpeechDriven`
    * [EncryptionConfig](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [EncryptionErrorType](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `encryptionErrorDatastreamDecryptionFailure`
      * `encryptionErrorDatastreamEncryptionFailure`
    * [AudioDeviceInfo](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_audiodeviceinfo.html) adds `deviceTypeName` (macOS)
    * [RemoteAudioStats](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ErrorCodeType](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_errorcodetype.html) adds `errDatastreamDecryptionFailed`
    * [AudioEffectPreset](https://api-ref.agora.io/en/voice-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/voice-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) (Android, iOS)
    * [FocalLengthInfo](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_focallengthinfo.html) (Android, iOS)
    * [CameraFocalLengthType](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_camerafocallengthtype.html) (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType` (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId` (Android)
    * [EarMonitoringFilterType](https://api-ref.agora.io/en/voice-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-58]

    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/voice-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. **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 (Windows, macOS)**

       * Before v6.3.0, if you call the [disableAudio](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [enableLoopbackRecording](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_enableloopbackrecording).

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

    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/voice-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/voice-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.

    2. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/flutter/6.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.

       * [onRemoteSubscribeFallbackToAudioOnly](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-sdk/flutter/6.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionInString](https://api-ref.agora.io/en/voice-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/voice-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-106]

    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/voice-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/voice-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/voice-sdk/flutter/6.x/API/class_ilocalspatialaudioengine.html#class_ilocalspatialaudioengine) method.

    4. **Other Improvements**

       This release also includes the following improvements:

       * The [onPlayerCacheStats](https://api-ref.agora.io/en/voice-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/voice-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/voice-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.
       * This release adds the `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_localaudiostats.html) to report ear monitor delay and acoustic echo cancellation (AEC) delay, respectively.

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

    This release fixed the following issue:

    * The SDK failed to detect any changes in the audio routing after plugging in and out 3.5mm earphones (Windows).

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

    **Added**

    * [onTranscodedStreamLayoutInfo](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_ontranscodedstreamlayoutinfo) (Android, iOS)
    * [VideoLayout](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_videolayout.html) (Android, iOS)
    * The `subviewUid` member in [VideoCanvas](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_videocanvas.html)
    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengineex.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_playerplaybackstats.html)
    * The `earMonitorDelay` and `aecEstimatedDelay` members in [LocalAudioStats](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_localaudiostats.html)
    * [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/flutter/6.x/API/enum_mediasourcetype.html)
    * The `routeBluetoothSpeaker` enumeration in [AudioRoute](https://api-ref.agora.io/en/voice-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-103]

    This release fixed the following issue:

    * 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).

    ### v6.2.4 [#v624]

    v6.2.4 was released on October 25, 2023.

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

    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.

    #### Improvements [#improvements-107]

    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-105]

    This release fixed the following issues:

    * 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.
    * 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-61]

    **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-98]

    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/voice/build/set-up-token-authentication/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 `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 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/voice/build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

    #### Improvements [#improvements-108]

    1. **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.

    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)

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

    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-62]

    **Added**

    * `preloadChannel`
    * `preloadChannelWithUserAccount`
    * `updatePreloadChannelToken`
    * `setRouteInCommunicationMode` (Android)

    ### v6.2.1 [#v621]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-109]

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

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

    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)

    ### v6.2.0 [#v620]

    v6.2.0 was released on May 29, 2023.

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

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

    **1. Channel media options**

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

    **2. 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-99]

    **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](pricing-legacy.md#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. 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.

    **3. Instant frame rendering**

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

    #### Improvements [#improvements-110]

    **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. 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`

    **3. 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.

    **4. 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-108]

    This release fixed the following issues:

    * Occasional crashes occurred on Android devices when users joining or leaving 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 echo (Android).
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback (Android, iOS).
    * Playing audio files with a sample rate of 48 kHz failed.
    * 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).
    * 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-63]

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioAinsMode`
    * `AudioTrackType`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * `enableInstantMediaRendering`

    **Deprecated**

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

    **Deleted**

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

    ### v6.1.0 [#v610]

    v6.1.0 was released on December 20, 2022.

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

    **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 use-cases with a number of publishers, enabling this function helps reduce the bandwidth and device system pressure for the receivers.

    <div class="alert info">
      To enable this function, contact 

      [support@agora.io](mailto:support@agora.io/)

      .
    </div>

    **5. 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.

    **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 `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.

    **7. 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.

    **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.

    <div class="alert info">
      To enable this feature, contact 

      [support@agora.io](mailto:support@agora.io)

      .
    </div>

    **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 (Windows, macOS)**

    This release adds a series of callbacks to help you better understand the status of your audio devices:

    * `onAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `onAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **11. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream.
    * The `muteAllRemoteAudioStreamsEx` method is used to cancel or resume the subscription of all remote users to audio streams.
    * 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 is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    **12. 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.

    #### Improvements [#improvements-111]

    **1. 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.

    **2. 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.

    **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 scenarios.

    **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.
    * 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-109]

    This release fixes the following issues:

    **All**

    * 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.

    **Windows**

    * 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.
    * The uplink network quality reported by the `onNetworkQuality` callback was inaccurate for the user who was sharing a screen.

    **macOS**

    * In screen sharing use-cases, the system volume of the local user occasionally decreased.
    * 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.

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

    **Added**

    * `getNativeHandle`
    * `getPlaybackDefaultDevice`
    * `getRecordingDefaultDevice`
    * `SimulcastStreamMode`
    * `getNetworkType`
    * `setLoopbackDevice` (Windows)
    * `getLoopbackDevice` (Windows)
    * `followSystemLoopbackDevice` (Windows)
    * `setZones`
    * `setPlayerAttenuation`
    * `setRemoteAudioAttenuation`
    * `setHeadphoneEQPreset`
    * `setHeadphoneEQParameters`
    * `HeadphoneEqualizerPreset`
    * `AdvanceOptions`
    * `EncodingPreference`
    * `CompressionPreference`
    * `adjustUserPlaybackSignalVolumeEx`
    * `onRhythmPlayerStateChanged` (Android, iOS)
    * `RhythmPlayerStateType`
    * `RhythmPlayerErrorType`
    * `enableAudioVolumeIndicationEx`
    * `onAudioDeviceStateChanged` (Windows, macOS)
    * `onAudioDeviceVolumeChanged` (Windows, macOS)
    * `registerExtension` (Windows)
    * `muteLocalAudioStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`

    **Modified**

    * Adds `isAudioFilterable` in `ChannelMediaOptions`
    * Adds `enableDoppler` in `SpatialAudioParams`
    * Adds `options` in `leaveChannelEx`
    * Adds `newRoleOptions` in `onClientRoleChanged`
    * `enableInEarMonitoring`: Supports Windows and macOS
    * `setEarMonitoringAudioFrameParameters`: Supports Windows and macOS
    * `setInEarMonitoringVolume`: Supports Windows and macOS
    * `onEarMonitoringAudioFrame`: Supports Windows and macOS

    **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.

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

    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
    * 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](./migration-guide) for details.

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

    **1. Multiple media tracks**

    This release supports one `RtcEngine` instance to collect multiple audio 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 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. 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 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 streams being played with remote users.
    * Caches data when playing media files.

    3. **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).

    **4. Ultra-high audio quality**

    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 <a href="mailto:support@agora.io">[support@agora.io](mailto\:support@agora.io)</a>. 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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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 sources.
    * Sets or switches channel profile and user role.
    * 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 subscribe to the audio 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 sources.

    **8. Subscription allowlists and blocklists**

    This release introduces subscription allowlists and blocklists for remote audio 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.

    If a user is added in a blocklist and 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.

    #### Improvements [#improvements-112]

    **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. 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.

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

  <_PlatformPanel platform="react-native">
    <_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="react-native" />

    ### Known issues [#known-issues-8]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * React Native SDK v4.2.6

      **AirPods Pro Bluetooth connection issue (iOS)**

      AirPods Pro does not support the A2DP protocol in the communication audio mode, which may lead to connection failure in this mode.

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

    Released on March 14, 2026.

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

    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`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `setLocalPublishFallbackOption`
      * `onLocalPublishFallbackToAudioOnly`
      * `onDownlinkNetworkInfoUpdated`
      * `onWlAccStats`
      * `enableWirelessAccelerate`

    * **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`

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

    Included in this release:

    * **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.

    * **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.

    * **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.

    #### Improvements [#improvements-113]

    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`.

    * **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.
      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

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

    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.
    * 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.
    * 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.

    ### v4.5.1 [#v451-5]

    v4.5.1 was released on March 13, 2025.

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

    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/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-114]

    * Reduces the SDK initialization time on specific device models. (iOS)

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

    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-62]

    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/voice-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/voice-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).

    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.

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

    1. **Live show scenario**

       This version adds the `ApplicationScenarioLiveshow`(3) (Live Show) enumeration to [`VideoApplicationScenarioType`](https://api-ref.agora.io/en/voice-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/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-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-115]

    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/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotWithConfigEx`](https://api-ref.agora.io/en/voice-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/voice-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-112]

    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-63]

    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-105]

    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 so on.

    #### Improvements [#improvements-116]

    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. **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-113]

    This release fixed the following issues:

    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time interaction (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-117]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-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-114]

    This version fixed the following issues:

    * 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/voice-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/voice-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).

    ### v4.3.1 [#v431-5]

    v4.3.1 was released on May 9, 2024.

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

    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">
         <CalloutDescription>
           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.
         </CalloutDescription>
       </CalloutContainer>

    2. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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.

    3. **Other features**

       * A new method [enableEncryptionEx](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    #### Improvements [#improvements-118]

    1. **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.

    2. **Other improvements**

       This version also includes the following improvements:

       * Enhanced performance and stability of the local compositing feature, reducing its CPU usage (Android).
       * In [AudioEffectPreset](https://api-ref.agora.io/en/voice-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/voice-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-115]

    This version fixed the following issues:

    * 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).
    * 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-65]

    **Added**

    * [enableCameraCenterStage](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (iOS)
    * [isCameraCenterStageSupported](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (iOS)
    * [setCameraStabilizationMode](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode) (iOS)
    * [CameraStabilizationMode](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_camerastabilizationmode.html) (iOS)
    * [registerFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_imediaengine.html#api_imediaengine_registerfaceinfoobserver)
    * [unregisterFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_imediaengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [onFaceInfo](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_mediasourcetype.html) adds `SpeechDrivenVideoSource`
    * [VideoSourceType](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_videosourcetype.html) adds `VideoSourceSpeechDriven`
    * [EncryptionConfig](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [EncryptionErrorType](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_encryptionerrortype.html) adds the following enumerations:
      * `EncryptionErrorDatastreamDecryptionFailure`
      * `EncryptionErrorDatastreamEncryptionFailure`
    * [RemoteAudioStats](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ErrorCodeType](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_errorcodetype.html) adds `ErrDatastreamDecryptionFailed`
    * [AudioEffectPreset](https://api-ref.agora.io/en/voice-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/voice-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [enableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [setAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [queryCameraFocalLengthCapability](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability) (Android, iOS)
    * [FocalLengthInfo](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_focallengthinfo.html) (Android, iOS)
    * [CameraFocalLengthType](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_camerafocallengthtype.html) (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType` (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId` (Android)
    * [EarMonitoringFilterType](https://api-ref.agora.io/en/voice-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-116]

    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-64]

    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/voice-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. **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-107]

    1. **Query device score**

       This release adds the [queryDeviceScore](https://api-ref.agora.io/en/voice-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).

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

       This release introduces the [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/react-native/4.x/API/class_mediasource.html).

    3. **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/voice-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/voice-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/voice-sdk/react-native/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [setPlayerOptionInString](https://api-ref.agora.io/en/voice-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/voice-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-119]

    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/voice-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/voice-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/voice-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/voice-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/voice-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/voice-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/voice-sdk/react-native/4.x/API/class_playerplaybackstats.html).

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

    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/voice-sdk/react-native/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.

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

    **Added**

    * [enableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [queryDeviceScore](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_irtcengine_querydevicescore)
    * The `CustomVideoSource` enumeration in [MediaSourceType](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_mediasourcetype.html)
    * The `RouteBluetoothDeviceA2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/enum_audioroute.html)
    * [LocalAudioStats](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_localaudiostats.html): Adds the `earMonitorDelay` and `aecEstimatedDelay`
    * [selectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [onPlayerCacheStats](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [onPlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/react-native/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/voice-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-118]

    This release fixed the following issue:

    * 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).

    ### v4.2.5 [#v425]

    v4.2.5 was released on October 31, 2023.

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

    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-120]

    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-108]

    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 prevent repeated application of tokens every time users join a new channel, which reduces the pressure on your token server.

       <CalloutContainer type="info">
         <CalloutDescription>
           All 4.x SDKs support using wildcard tokens.
         </CalloutDescription>
       </CalloutContainer>

    2. **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.

    #### Improvements [#improvements-120]

    This release includes the following 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)).

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

    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.
    * 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.

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

    **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-6]

    This version was released on June 21, 2023.

    #### Improvements [#improvements-121]

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

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

    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)

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

    v4.2.0 was released on May 29, 2023.

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

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

    **1. Channel media options**

    * `publishCustomAudioTrackEnableAec` is deleted. Use `publishCustomAudioTrack` instead.
    * `publishCustomAudioSourceId` is renamed to `publishCustomAudioTrackId`.

    **2. 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-109]

    **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](pricing-legacy.md#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    #### Improvements [#improvements-122]

    **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. 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`

    **3. 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.

    **4. 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-123]

    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 echo (Android).
    * Abnormal client status caused by an exception in the `onRemoteAudioStateChanged` callback.
    * Playing audio files with a sample rate of 48 kHz failed.
    * 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).

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

    **Added**

    * `startOrUpdateChannelMediaRelay`
    * `startOrUpdateChannelMediaRelayEx`
    * `getNtpWallTimeInMs`
    * `getCurrentMonotonicTimeInMs`
    * `setAINSMode`
    * `createAudioCustomTrack`
    * `destroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AudioAinsMode`
    * `AudioTrackType`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`

    **Deprecated**

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

    **Deleted**

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

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

    v4.1.0 was released on December 20, 2022.

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

    **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.

    <div class="alert info">
      To enable this function, contact 

      [support@agora.io](mailto:support@agora.io/)

      .
    </div>

    **5. 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.

    **6. 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.

    <div class="alert info">
      To enable this feature, contact 

      [support@agora.io](mailto:support@agora.io)

      .
    </div>

    **7. Multi-channel management**

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

    * The `muteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream.
    * The `muteAllRemoteAudioStreamsEx` is used to cancel or resume the subscription of all remote users to audio.
    * 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 is used to choose whether to stop recording with the microphone when leaving a channel in a multi-channel use-case.

    #### Improvements [#improvements-123]

    **1. 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.

    **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 `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.

    **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 scenarios.

    **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.
    * 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-124]

    This release fixes the following issues:

    **All**

    The call `getExtensionProperty` failed and returned an empty string.

    **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.

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

    **Added**

    * `getNativeHandle`
    * `getMusicContentCenter`
    * `getPlaybackDefaultDevice`
    * `getRecordingDefaultDevice`
    * `getNetworkType`
    * `setZones`
    * `setRemoteAudioAttenuation`
    * `setHeadphoneEQPreset`
    * `setHeadphoneEQParameters`
    * `HeadphoneEqualizerPreset`
    * `adjustUserPlaybackSignalVolumeEx`
    * `onRhythmPlayerStateChanged`
    * `RhythmPlayerStateType`
    * `RhythmPlayerErrorType`
    * `enableAudioVolumeIndicationEx`
    * `muteLocalAudioStreamEx`
    * `muteAllRemoteAudioStreamsEx`
    * `startRtmpStreamWithoutTranscodingEx`
    * `startRtmpStreamWithTranscodingEx`
    * `updateRtmpTranscodingEx`
    * `stopRtmpStreamEx`
    * `startChannelMediaRelayEx`
    * `updateChannelMediaRelayEx`
    * `pauseAllChannelMediaRelayEx`
    * `resumeAllChannelMediaRelayEx`
    * `stopChannelMediaRelayEx`

    **Modified**

    * Adds `isAudioFilterable` in `ChannelMediaOptions`
    * Adds `enable_doppler` in `SpatialAudioParams`
    * Adds `options` in `leaveChannelEx`
    * Adds `newRoleOptions` in `onClientRoleChanged`

    **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-66]

    **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 v3.7.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](./migration-guide).

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

    **1. Multiple media tracks**

    This release supports one `IRtcEngine` instance to collect multiple audio 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 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. 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 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 streams being played with remote users.
    * Caches data when playing media files.

    **3.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.0). The new AI noise reduction has better vocal fidelity, cleaner noise suppression, and adds a dereverberation option.

    > ***NOTE:*** To experience this feature, contact [support@agora.io](mailto\:support@agora.io).

    **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. Spatial audio**

    > ***NOTE:*** 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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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 sources.
    * Sets or switches channel profile and user role.
    * 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 subscribe to the audio 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 sources.

    **8. 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 `IRtcEngineEx` interface:

    * `SetSubscribeAudioBlocklist`：Set the audio subscription blocklist.
    * `SetSubscribeAudioAllowlist`：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.

    **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.

    #### Improvements [#improvements-124]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v3.7.0 through the `LeaveChannel` and `JoinChannel `methods so that you don't need to take the time to call the `SwitchChannel `method.

    **2. 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.

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

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

    ### v2.4.0 [#v240]

    v2.4.0 was released on March 19, 2025. This release includes the following changes:

    * Internal optimizations to support [Agora Conversational AI Engine](/en/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](release-notes.mdx).
    * Fixes an issue where network state changes could unexpectedly create new tracks.

    ### v2.3.0 [#v230]

    v2.3.0 was 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](release-notes.mdx).

    ### v2.2.0 [#v220]

    v2.2.0 was 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](release-notes.mdx).

    ### v2.1.0 [#v210-1]

    v2.1.0 was 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](release-notes.mdx).

    ### v2.0.0 [#v200-2]

    v2.0.0 was released on December 22, 2023.

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

    **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-125]

    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.

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

    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-70]

    **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" />

    ### Known issues [#known-issues-9]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the latest version of the SDK, which includes new features, bug fixes and improvements.

    * Unity SDK v4.4.0

      **MacOS 15 Sequoia beta system issue**

      When the app path (including the App name) contains non-English characters (such as Chinese characters), the compiled `Metal shader library` may not contain any methods, causing the app to crash. See [this article](/en/api-reference/faq/other/macos_15_beta) for the workaround.

    * Unity SDK v4.2.6

      **AirPods Pro Bluetooth connection issue (iOS)**

      AirPods Pro does not support A2DP protocol in communication audio mode, which may lead to connection failure in that mode.

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

    Released on March 14, 2026.

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

    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`
      * `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`

    * **Removal of redundant APIs**

      The following APIs and parameters are removed in this release:

      * `SetLocalPublishFallbackOption`
      * `OnLocalPublishFallbackToAudioOnly`
      * `OnDownlinkNetworkInfoUpdated`
      * `OnWlAccStats`
      * `EnableWirelessAccelerate`

    * **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`

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

    Included in this release:

    * **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.

    * **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.

    * **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.

    * **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.

    #### Improvements [#improvements-126]

    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.

    * **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`.

    * **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.
      * Adds error codes `ERR_PCMSEND_FORMAT (200)` and `ERR_PCMSEND_BUFFEROVERFLOW (201)` to report PCM data transmission errors.

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

    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.
    * 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.
    * 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.

    ### v4.5.1 [#v451-6]

    v4.5.1 was released on March 13, 2025.

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

    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/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-127]

    * Reduces the SDK initialization time on specific device models. (iOS)

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

    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-69]

    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/voice-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/voice-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).

    5. **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-114]

    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/voice-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/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`SetRemoteRenderTargetFps`](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-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/voice-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/voice-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-128]

    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/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`TakeSnapshotEx [2/2]`](https://api-ref.agora.io/en/voice-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/voice-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-127]

    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-70]

    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-115]

    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.

    #### Improvements [#improvements-129]

    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. **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 `CLIENT_ROLE_CHANGE_FAILED_REQUEST_TIME_OUT` and `CLIENT_ROLE_CHANGE_FAILED_CONNECTION_FAILED` in `CLIENT_ROLE_CHANGE_FAILED_REASON`.

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

    This release fixed the following issues:

    * Occasional app crashes occurred when multiple remote users joined the channel simultaneously during real-time
      interaction (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-130]

    This release enhances the usability of the [setRemoteSubscribeFallbackOption](https://api-ref.agora.io/en/voice-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-129]

    This version fixed the following issues:

    * 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.
    * When playing an audio file using [StartAudioMixing \[1/2\]](https://api-ref.agora.io/en/voice-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/voice-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/voice-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).

    ### v4.3.1 [#v431-6]

    v4.3.1 was released on May 9, 2024.

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

    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">
         <CalloutDescription>
           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.
         </CalloutDescription>
       </CalloutContainer>

    2. **Data stream encryption**

       This version adds `datastreamEncryptionEnabled` to [EncryptionConfig](https://api-ref.agora.io/en/voice-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/voice-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.

    3. **Other features**

       * A new method [EnableEncryptionEx](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex) is introduced for retrieving call IDs in multi-channel use-cases.

    #### Improvements [#improvements-131]

    1. **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/voice-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getplaybackdefaultdevice2)
       * [GetRecordingDefaultDevice \[2/2\]](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getrecordingdefaultdevice2)
       * [GetPlaybackDeviceInfo \[2/2\]](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getplaybackdeviceinfo2)
       * [GetRecordingDeviceInfo \[2/2\]](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdeviceinfo2)

    2. **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.

    3. **Other improvements**

       This version also includes the following improvements:

       * In [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/voice-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/voice-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-130]

    This version fixed the following issues:

    * 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).

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

    **Added**

    * [EnableCameraCenterStage](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enablecameracenterstage) (iOS, macOS)
    * [IsCameraCenterStageSupported](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_iscameracenterstagesupported) (iOS, macOS)
    * [SetCameraStabilizationMode](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setcamerastabilizationmode) (iOS)
    * [CAMERA\_STABILIZATION\_MODE](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/enum_camerastabilizationmode.html) (iOS)
    * [RegisterFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_imediaengine_registerfaceinfoobserver)
    * [UnregisterFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_imediaengine_unregisterfaceinfoobserver)
    * [IFaceInfoObserver](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_ifaceinfoobserver.html#class_ifaceinfoobserver)
    * [OnFaceInfo](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_ifaceinfoobserver.html#callback_ifaceinfoobserver_onfaceinfo)
    * [MEDIA\_SOURCE\_TYPE](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/enum_mediasourcetype.html) adds `SPEECH_DRIVEN_VIDEO_SOURCE`
    * [VIDEO\_SOURCE\_TYPE](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/enum_videosourcetype.html) adds `VIDEO_SOURCE_SPEECH_DRIVEN`
    * [EncryptionConfig](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_encryptionconfig.html) adds `datastreamEncryptionEnabled`
    * [ENCRYPTION\_ERROR\_TYPE](https://api-ref.agora.io/en/voice-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/voice-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getplaybackdefaultdevice2) (macOS),
    * [GetRecordingDefaultDevice \[2/2\]](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_iaudiodevicemanager_getrecordingdefaultdevice2) (macOS),
    * [GetPlaybackDeviceInfo \[2/2\]](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getplaybackdeviceinfo2) (macOS)
    * [GetRecordingDeviceInfo \[2/2\]](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_iaudiodevicemanager.html#api_iaudiodevicemanager_getrecordingdeviceinfo2) (macOS)
    * [RemoteAudioStats](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_remoteaudiostats.html) adds `e2eDelay`
    * [ERROR\_CODE\_TYPE](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/enum_errorcodetype.html) adds `ERR_DATASTREAM_DECRYPTION_FAILED`
    * [AUDIO\_EFFECT\_PRESET](https://api-ref.agora.io/en/voice-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/voice-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_getcallidex)
    * [EnableEncryptionEx](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengineex_enableencryptionex)
    * [SetAudioMixingPlaybackSpeed](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_setaudiomixingplaybackspeed)
    * [QueryCameraFocalLengthCapability](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_querycamerafocallengthcapability)(Android, iOS)
    * [FocalLengthInfo](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_focallengthinfo.html) (Android, iOS)
    * [CAMERA\_FOCAL\_LENGTH\_TYPE](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/enum_camerafocallengthtype.html) (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraFocalLengthType` (Android, iOS)
    * [CameraCapturerConfiguration](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_cameracapturerconfiguration.html) adds a new member `cameraId` (Android)
    * [EAR\_MONITORING\_FILTER\_TYPE](https://api-ref.agora.io/en/voice-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-71]

    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. **Audio route**

       Starting with this release, `routeBluetooth` in [AudioRoute](https://api-ref.agora.io/en/voice-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.

    4. **Audio loopback capturing (Windows, macOS)**

       * Before v4.3.0, if you called the [DisableAudio](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/unity/4.x/API/class_irtcengine.html#api_irtcengine_enableaudio) method and then call [EnableLoopbackRecording](https://api-ref.agora.io/en/voice-sdk/unity/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-117]

    1. **Query device score**

       This release adds the [QueryDeviceScore](https://api-ref.agora.io/en/voice-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).

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

       This release introduces the [SelectMultiAudioTrack](https://api-ref.agora.io/en/voice-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/voice-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/voice-sdk/unity/4.x/API/class_mediasource.html).

    3. **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/voice-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/voice-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/voice-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/voice-sdk/unity/4.x/API/class_imediaplayer.html#api_imediaplayer_setplayeroption) and [SetPlayerOption](https://api-ref.agora.io/en/voice-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/voice-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengine_enablecustomaudiolocalplayback): Sets whether to enable the local playback of external audio source.

    #### Improvements [#improvements-132]

    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/voice-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/voice-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/voice-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/voice-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/voice-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/voice-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/voice-sdk/unity/4.x/API/class_playerplaybackstats.html).

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

    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/voice-sdk/unity/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onlocalvideostats) callback is 0, which is not as expected.

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

    **Added**

    * [EnableCustomAudioLocalPlayback](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengineex.html#api_irtcengine_enablecustomaudiolocalplayback)
    * [QueryDeviceScore](https://api-ref.agora.io/en/voice-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/voice-sdk/unity/4.x/API/enum_mediasourcetype.html)
    * The `ROUTE_BLUETOOTH_DEVICE_A2DP` enumeration in [AudioRoute](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/enum_audioroute.html)
    * [SelectMultiAudioTrack](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_irtcengine.html#api_Imediaplayer_selectmultiaudiotrack)
    * [OnPlayerCacheStats](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayercachestats)
    * [OnPlayerPlaybackStats](https://api-ref.agora.io/en/voice-sdk/unity/4.x/API/class_imediaplayersourceobserver.html#callback_imediaplayersourceobserver_onplayerplaybackstats)
    * [PlayerPlaybackStats](https://api-ref.agora.io/en/voice-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-132]

    This release fixed the following issue:

    * 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).

    ### v4.2.4 [#v424-2]

    v4.2.4 was released on October 25, 2023.

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

    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.

    #### Improvements [#improvements-133]

    This release includes the following 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-134]

    This release fixed the following issues:

    * 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.
    * 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-73]

    **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-4]

    This version was released on August 1, 2023.

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

    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. **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-118]

    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 [Deploy a token server](/en/realtime-media/voice/build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

       <div class="alert info">
         All 4.x SDKs support using wildcard tokens.
       </div>

    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 [Deploy a token server](/en/realtime-media/voice/build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

    #### Improvements [#improvements-134]

    **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.

    This release also includes the following additional improvements:

    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)

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

    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-74]

    **Added**

    * `PreloadChannel[1/2]`
    * `PreloadChannel[2/2]`
    * `UpdatePreloadChannelToken`
    * `SetRouteInCommunicationMode` (Android)
    * `SetMaxMetadataSize`
    * `SendMetadata`
    * `position` parameter in `RegisterAudioFrameObserver`

    **Deleted**

    * `GetObservedAudioFramePosition`
    * `GetPlaybackAudioParams`
    * `GetRecordAudioParams`
    * `GetMixedAudioParams`
    * `GetEarMonitoringAudioParams`
    * `GetMaxMetadataSize`
    * `OnReadyToSendMetadata`

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

    This version was released on June 21, 2023.

    #### Improvements [#improvements-135]

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

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

    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)

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

    v4.2.0 was released on May 29, 2023.

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

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

    **1. Channel media options**

    * `PublishCustomAudioTrackEnableAec` in `ChannelMediaOptions` is deleted. Use `PublishCustomAudioTrack` instead.
    * `PublishCustomAudioSourceId` in `ChannelMediaOptions` is renamed to `PublishCustomAudioTrackId`.

    **2. 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.

    <div class="alert info">
      If you set AgoraALD or Soundflower as the default input or output device when joining a channel, you will not hear audio.
    </div>

    **3. 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`

    * `StartChannelMediaRelay`, `UpdateChannelMediaRelay`, `StartChannelMediaRelayEx`, and `UpdateChannelMediaRelayEx` are deprecated. Use `StartOrUpdateChannelMediaRelay` and `StartOrUpdateChannelMediaRelayEx` instead.

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

    **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](pricing-legacy.md#ai-noise-suppression-pricing).
      </CalloutDescription>
    </CalloutContainer>

    **2. 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.

    **3. Instant frame rendering**

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

    #### Improvements [#improvements-136]

    **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. 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`
    * `OpenWithMediaSource`

    **3. 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.

    **4. 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-136]

    This release fixed the following issues:

    **Android**

    * Occasional crashes occur on Android devices when users joining or leaving a channel.
    * Occasional failure when enabling in-ear monitoring.
    * Occasional echo.
    * 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.
    * Abnormal client status caused by an exception in the `OnRemoteAudioStateChanged` callback.

    **iOS**

    * Abnormal client status caused by an exception in the `OnRemoteAudioStateChanged` callback.

    **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.

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

    **Added**

    * `StartOrUpdateChannelMediaRelay`
    * `StartOrUpdateChannelMediaRelayEx`
    * `GetNtpWallTimeInMs`
    * `CreateAudioCustomTrack`
    * `DestroyAudioCustomTrack`
    * `AudioTrackConfig`
    * `AUDIO_TRACK_TYPE`
    * The `domainLimit` and `autoRegisterAgoraExtensions` members in `RtcEngineContext`
    * The `channelId` and `uid` parameters in `OnRecorderStateChanged` and `OnRecorderInfoUpdated` callbacks
    * `EnableInstantMediaRendering`

    **Deprecated**

    * `StartChannelMediaRelay`
    * `StartChannelMediaRelayEx`
    * `UpdateChannelMediaRelay`
    * `UpdateChannelMediaRelayEx`
    * `OnChannelMediaRelayEvent`
    * `CHANNEL_MEDIA_RELAY_EVENT`

    **Deleted**

    * `OnApiCallExecuted`
    * `PublishCustomAudioTrackEnableAec ` in ` ChannelMediaOptions`

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

    v4.1.0 was released on December 20, 2022.

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

    **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](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.

    <div class="alert info">
      To enable this function, contact 

      [support@agora.io](support@agora.io)

      .
    </div>

    **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.

    **7. 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.

    **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.

    <div class="alert info">
      To enable this feature, contact 

      [support@agora.io](support@agora.io)

      .
    </div>

    **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 (Windows, macOS)**

    This release adds a series of callbacks to help you better understand the status of your audio devices:

    * `OnAudioDeviceStateChanged`: Occurs when the status of the audio device changes.
    * `OnAudioDeviceVolumeChanged`: Occurs when the volume of an audio device or app changes.

    **11. Multi-channel management**

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

    * The `MuteLocalAudioStreamEx` method is used to cancel or resume publishing a local audio stream.
    * The `MuteAllRemoteAudioStreamsEx`  is used to cancel or resume the subscription of all remote users to audio streams.
    * 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 `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.

    **12. 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.

    #### Improvements [#improvements-137]

    **1. 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.

    **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.

    **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.
    * 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-137]

    This release fixed the following issues:

    **All**

    * 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.
    * Crashes occurred if you call the `RegisterAudioEncodedFrameObserver` method after failing to initialize  `RtcEngine`.

    **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.

    **macOS**

    * After starting and stopping the audio capture device test, there was no sound when the audio playback device was subsequently started.

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

    **Added**

    * `EnableInEarMonitoring`
    * `SetEarMonitoringAudioFrameParameters`
    * `OnEarMonitoringAudioFrame`
    * `SetInEarMonitoringVolume`
    * `GetEarMonitoringAudioParams`
    * `StartRecordingDeviceTest` (Android)
    * `StopRecordingDeviceTest` (Android)
    * `GetNetworkType`
    * `SetRecordingDeviceVolume`  (Windows)
    * `isAudioFilterable` in `ChannelMediaOptions`
    * `SetLoopbackDevice`
    * `GetLoopbackDevice`
    * `FollowSystemLoopbackDevice`
    * `SetZones`
    * `SetPlayerAttenuation`
    * `SetRemoteAudioAttenuation`
    * `MuteRemoteAudioStream`
    * `SpatialAudioParams`
    * `SetHeadphoneEQPreset`
    * `HEADPHONE_EQUALIZER_PRESET`
    * `SetHeadphoneEQParameters`
    * `LeaveChannelEx` \[2/2]
    * `MuteLocalAudioStreamEx`
    * `MuteAllRemoteAudioStreamsEx`
    * `StartRtmpStreamWithoutTranscodingEx`
    * `StartRtmpStreamWithTranscodingEx`
    * `UpdateRtmpTranscodingEx`
    * `StopRtmpStreamEx`
    * `StartChannelMediaRelayEx`
    * `UpdateChannelMediaRelayEx`
    * `PauseAllChannelMediaRelayEx`
    * `ResumeAllChannelMediaRelayEx`
    * `StopChannelMediaRelayEx`
    * `newRoleOptions` in `OnClientRoleChanged`
    * `AdjustUserPlaybackSignalVolumeEx`
    * `EnableAudioVolumeIndicationEx`
    * `OnAudioDeviceStateChanged ` (Windows,macOS)
    * `OnAudioDeviceVolumeChanged ` (Windows,macOS)
    * `SetParameters` in `IRtcEngine` (Windows)

    **Deprecated**

    * `StartEchoTest` \[2/3]
    * `OnApiCallExecuted`. Use the callbacks triggered by specific methods instead.

    **Deleted**

    * Removes `RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED`(8) in `OnChannelMediaRelayEvent` callback.

    ### v4.0.0 [#v400-7]

    v4.0.0 was released on September 28, 2022.

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

    This release has optimized the implementation of some features, resulting in incompatibility with v3.7.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](./migration-guide).

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

    **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)**

    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.

    > ***NOTE:*** 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).

    **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. 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.

    **3. 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.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).

    **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 [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 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](https://assets-docs.agora.io/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](https://assets-docs.agora.io/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-138]

    **1. Fast channel switching**

    This release can achieve the same switching speed as `SwitchChannel` in v3.7.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" />

    ### Known issues [#known-issues-10]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the
    latest version of the SDK, which includes new features, bug fixes, and improvements.

    * Unreal SDK v4.4.0

      **MacOS 15 Sequoia beta system issue**

      When the app path (including the App name) contains non-English characters (such as Chinese characters), the compiled `Metal shader library` may not contain any methods, causing the app to crash. See [this article](/en/api-reference/faq/other/macos_15_beta) for the workaround.

    * Unreal SDK v4.2.1

      **Audio module incompatibility (iOS)**

      The audio module of the Agora Unreal SDK is incompatible with the AudioMixer module in Unreal Engine 5.3 and 5.4. If you use Unreal Engine 5.3 or 5.4, you need to add the following code to the `/Config/IOS/IOSEngine.ini` file in your project to disable Unreal Engine’s AudioMixer module and avoid conflicts.

      ```text
      [Audio]
      AudioMixerModuleName=
      ```

    ### v4.5.1 [#v451-7]

    v4.5.1 was released on March 13, 2025.

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

    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/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-139]

    * Reduces the SDK initialization time on specific device models. (iOS)

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

    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-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. **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/voice-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` 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/voice-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`, and `MAINTAIN_RESOLUTION` based on your video scene settings to achieve the optimal overall quality of experience (QoE).

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

    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/voice-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/voice-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`setRemoteRenderTargetFps`](https://api-ref.agora.io/en/voice-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/voice-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 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/voice-sdk/blueprint/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/voice-sdk/blueprint/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/voice-sdk/blueprint/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/voice-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 (e.g., unplugged). (Windows)
       * The [`MEDIA_DEVICE_STATE_TYPE`](https://api-ref.agora.io/en/voice-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-140]

    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/voice-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`takeSnapshotEx [2/2]`](https://api-ref.agora.io/en/voice-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. **Custom audio capture improvements**

       This version adds the `enableAudioProcessing` member parameter to [`AudioTrackConfig`](https://api-ref.agora.io/en/voice-sdk/blueprint/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-139]

    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-76]

    1. **Changes to API usage**

       Starting from this release, the \[Get]\([https://api-ref.agora.io/en/voice-sdk/blueprint/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/voice-sdk/blueprint/4.x/API/class_irtcengine)
       .html#api\_createagorartcengine) and \[Release]\([https://api-ref.agora.io/en/voice-sdk/blueprint/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/voice-sdk/blueprint/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/voice-sdk/blueprint/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/voice-sdk/blueprint/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/voice-sdk/blueprint/4.x/API/class\_irtcengine](https://api-ref.agora.io/en/voice-sdk/blueprint/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/voice-sdk/blueprint/4.x/API/class_irtcengine.html#api_createagorartcengine) to create an `IRtcEngine` instance, call [Release](https://api-ref.agora.io/en/voice-sdk/blueprint/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-124]

    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">
         <CalloutDescription>
           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.
         </CalloutDescription>
       </CalloutContainer>

    3. **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.

       1. 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`.

    4. **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`.

    5. **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.

    6. **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.

    7. **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](../build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

       <CalloutContainer type="info">
         <CalloutDescription>
           All 4.x SDKs support using wildcard tokens.
         </CalloutDescription>
       </CalloutContainer>

    8. **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](../build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

    9. **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">
         <CalloutDescription>
           For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
         </CalloutDescription>
       </CalloutContainer>

    #### Improvements [#improvements-141]

    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-140]

    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-8]

    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.

    **C++**

    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.

    **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/voice/quickstart)
    * [API Reference](/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](./migration-guide) for upgrade instructions.

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

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

    ### Known issues [#known-issues-11]

    The list of known issues page is continuously updated as the systems evolve. Agora suggests you regularly upgrade to the
    latest version of the SDK, which includes new features, bug fixes, and improvements.

    * Blueprint SDK v4.4.0

      **MacOS 15 Sequoia beta system issue**

      When the app path (including the App name) contains non-English characters (such as Chinese characters), the compiled `Metal shader library` may not contain any methods, causing the app to crash. See [this article](/en/api-reference/faq/other/macos_15_beta) for the workaround.

    * Blueprint SDK v4.2.1

      **Audio module incompatibility (iOS)**

      The audio module of the Agora Blueprint SDK is incompatible with the AudioMixer module in Unreal Engine 5.3 and 5.4. If you use Unreal Engine 5.3 or 5.4, you need to add the following code to the `/Config/IOS/IOSEngine.ini` file in your project to disable Unreal Engine’s AudioMixer module and avoid conflicts.

      ```text
      [Audio]
      AudioMixerModuleName=
      ```

    ### v4.5.1 [#v451-8]

    v4.5.1 was released on March 13, 2025.

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

    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/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-142]

    * Reduces the SDK initialization time on specific device models. (iOS)

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

    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-77]

    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/voice-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/voice-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-126]

    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/voice-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/voice-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_setlocalrendertargetfps) and [`SetRemoteRenderTargetFps`](https://api-ref.agora.io/en/voice-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/voice-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/voice-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/voice-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-143]

    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/voice-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_takesnapshot2) and [`TakeSnapshotWithConfigEx`](https://api-ref.agora.io/en/voice-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-142]

    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-78]

    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.

       ![](https://assets-docs.agora.io/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/voice-sdk/blueprint/4.x/API/class_irtcengine.html#class_irtcengine) instance through the `GetAgoraRtcEngine` node and connect it to the [Initialize](https://api-ref.agora.io/en/voice-sdk/blueprint/4.x/API/class_irtcengine.html#api_irtcengine_initialize) node to perform initialization:

       ![](https://assets-docs.agora.io/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.

       ![](https://assets-docs.agora.io/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/voice-sdk/blueprint/4.x/API/class_irtcengineeventhandler.html#class_irtcengineeventhandler) interface class:

       ![](https://assets-docs.agora.io/images/video-sdk/blueprint-assets/ue-bp-release440-04.png)

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

    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">
         <CalloutDescription>
           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.
         </CalloutDescription>
       </CalloutContainer>

    3. **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.

       1. 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`.

    4. **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`.

    5. **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.

    6. **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](../build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

       <CalloutContainer type="info">
         <CalloutDescription>
           All 4.x SDKs support using wildcard tokens.
         </CalloutDescription>
       </CalloutContainer>

    7. **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](../build/set-up-token-authentication/deploy-token-server#generate-wildcard-tokens).

    8. **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">
         <CalloutDescription>
           For one `RtcConnection`, Agora supports publishing multiple audio streams and one video stream at the same time.
         </CalloutDescription>
       </CalloutContainer>

    #### Improvements [#improvements-144]

    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.

       ![](https://assets-docs.agora.io/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-143]

    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]

    This version was released on November 16, 2023.

    This the first release of Video SDK for Unreal Blueprint.

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

    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/voice/quickstart)
    * [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>
