agora-electron-sdk 4.2.2 → 4.2.3-dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +2 -2
- package/js/Private/AgoraBase.js +33 -1
- package/js/Private/AgoraMediaBase.js +8 -0
- package/js/Private/IAgoraMusicContentCenter.js +4 -0
- package/js/Private/IAgoraRtcEngine.js +16 -2
- package/js/Private/impl/IAgoraRtcEngineExImpl.js +20 -0
- package/js/Private/impl/IAgoraRtcEngineImpl.js +17 -3
- package/js/Private/internal/IrisApiEngine.js +74 -44
- package/js/Renderer/RendererManager.js +1 -1
- package/package.json +3 -3
- package/ts/Private/AgoraBase.ts +33 -1
- package/ts/Private/AgoraMediaBase.ts +16 -0
- package/ts/Private/IAgoraMusicContentCenter.ts +8 -0
- package/ts/Private/IAgoraRtcEngine.ts +47 -25
- package/ts/Private/IAgoraRtcEngineEx.ts +14 -6
- package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +35 -1
- package/ts/Private/impl/IAgoraRtcEngineImpl.ts +22 -3
- package/ts/Private/internal/IrisApiEngine.ts +75 -46
- package/ts/Renderer/RendererManager.ts +1 -1
- package/types/Private/AgoraBase.d.ts +37 -5
- package/types/Private/AgoraBase.d.ts.map +1 -1
- package/types/Private/AgoraMediaBase.d.ts +18 -2
- package/types/Private/AgoraMediaBase.d.ts.map +1 -1
- package/types/Private/IAgoraMusicContentCenter.d.ts +9 -1
- package/types/Private/IAgoraMusicContentCenter.d.ts.map +1 -1
- package/types/Private/IAgoraRtcEngine.d.ts +45 -25
- package/types/Private/IAgoraRtcEngine.d.ts.map +1 -1
- package/types/Private/IAgoraRtcEngineEx.d.ts +9 -6
- package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -1
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts +3 -1
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -1
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts +3 -1
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -1
- package/types/Private/internal/IrisApiEngine.d.ts +2 -2
- package/types/Private/internal/IrisApiEngine.d.ts.map +1 -1
|
@@ -1022,7 +1022,7 @@ export class AdvancedAudioOptions {
|
|
|
1022
1022
|
*/
|
|
1023
1023
|
export class ImageTrackOptions {
|
|
1024
1024
|
/**
|
|
1025
|
-
* The
|
|
1025
|
+
* The image URL. Supported formats of images include JPEG, JPG, PNG and GIF. This method supports adding an image from the local absolute or relative file path.
|
|
1026
1026
|
*/
|
|
1027
1027
|
imageUrl?: string;
|
|
1028
1028
|
/**
|
|
@@ -1038,7 +1038,7 @@ export class ImageTrackOptions {
|
|
|
1038
1038
|
/**
|
|
1039
1039
|
* The channel media options.
|
|
1040
1040
|
*
|
|
1041
|
-
* Agora supports publishing multiple audio streams and one video stream at the same time and in the same RtcConnection. For example, publishMicrophoneTrack,
|
|
1041
|
+
* Agora supports publishing multiple audio streams and one video stream at the same time and in the same RtcConnection. For example, publishMicrophoneTrack, publishCustomAudioTrack, and publishMediaPlayerAudioTrack can be set as true at the same time, but only one of publishCameraTrack, publishScreenTrack, publishCustomVideoTrack, or publishEncodedVideoTrack can be set as true. Agora recommends that you set member parameter values yourself according to your business scenario, otherwise the SDK will automatically assign values to member parameters.
|
|
1042
1042
|
*/
|
|
1043
1043
|
export class ChannelMediaOptions {
|
|
1044
1044
|
/**
|
|
@@ -1217,6 +1217,20 @@ export enum ProxyType {
|
|
|
1217
1217
|
HttpsProxyType = 6,
|
|
1218
1218
|
}
|
|
1219
1219
|
|
|
1220
|
+
/**
|
|
1221
|
+
* @ignore
|
|
1222
|
+
*/
|
|
1223
|
+
export enum FeatureType {
|
|
1224
|
+
/**
|
|
1225
|
+
* @ignore
|
|
1226
|
+
*/
|
|
1227
|
+
VideoVirtualBackground = 1,
|
|
1228
|
+
/**
|
|
1229
|
+
* @ignore
|
|
1230
|
+
*/
|
|
1231
|
+
VideoBeautyEffect = 2,
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1220
1234
|
/**
|
|
1221
1235
|
* The options for leaving a channel.
|
|
1222
1236
|
*/
|
|
@@ -1267,7 +1281,7 @@ export interface IRtcEngineEventHandler {
|
|
|
1267
1281
|
*
|
|
1268
1282
|
* @param channel The channel name.
|
|
1269
1283
|
* @param uid The user ID.
|
|
1270
|
-
* @param proxyType The proxy type connected. See
|
|
1284
|
+
* @param proxyType The proxy type connected. See ProxyType.
|
|
1271
1285
|
* @param localProxyIp Reserved for future use.
|
|
1272
1286
|
* @param elapsed The time elapsed (ms) from the user calling joinChannel until this callback is triggered.
|
|
1273
1287
|
*/
|
|
@@ -1878,7 +1892,7 @@ export interface IRtcEngineEventHandler {
|
|
|
1878
1892
|
*
|
|
1879
1893
|
* When the token expires during a call, the SDK triggers this callback to remind the app to renew the token. When receiving this callback, you need to generate a new token on your token server and you can renew your token through one of the following ways:
|
|
1880
1894
|
* Call renewToken to pass in the new token.
|
|
1881
|
-
* Call to leave the current channel and then pass in the new token when you call joinChannel to join a channel.
|
|
1895
|
+
* Call leaveChannel to leave the current channel and then pass in the new token when you call joinChannel to join a channel.
|
|
1882
1896
|
*
|
|
1883
1897
|
* @param connection The connection information. See RtcConnection.
|
|
1884
1898
|
*/
|
|
@@ -2051,7 +2065,7 @@ export interface IRtcEngineEventHandler {
|
|
|
2051
2065
|
/**
|
|
2052
2066
|
* Occurs when the user role switching fails in the interactive live streaming.
|
|
2053
2067
|
*
|
|
2054
|
-
* In the live broadcasting channel profile, when the local user calls to switch the user role after joining the channel but the switch fails, the SDK triggers this callback to report the reason for the failure and the current user role.
|
|
2068
|
+
* In the live broadcasting channel profile, when the local user calls setClientRole to switch the user role after joining the channel but the switch fails, the SDK triggers this callback to report the reason for the failure and the current user role.
|
|
2055
2069
|
*
|
|
2056
2070
|
* @param connection The connection information. See RtcConnection.
|
|
2057
2071
|
* @param reason The reason for a user role switch failure. See ClientRoleChangeFailedReason.
|
|
@@ -2899,7 +2913,7 @@ export abstract class IRtcEngine {
|
|
|
2899
2913
|
* @param token The token generated on your server for authentication. When the token for preloading channels expires, you can update the token based on the number of channels you preload.
|
|
2900
2914
|
* When preloading one channel, calling this method to pass in the new token.
|
|
2901
2915
|
* When preloading more than one channels:
|
|
2902
|
-
* If you use a wildcard token for all preloaded channels, call updatePreloadChannelToken to update the token.
|
|
2916
|
+
* If you use a wildcard token for all preloaded channels, call updatePreloadChannelToken to update the token. When generating a wildcard token, ensure the user ID is not set as 0.
|
|
2903
2917
|
* If you use different tokens to preload different channels, call this method to pass in your user ID, channel name and the new token.
|
|
2904
2918
|
* @param channelId The channel name that you want to preload. This parameter signifies the channel in which users engage in real-time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total):
|
|
2905
2919
|
* All lowercase English letters: a to z.
|
|
@@ -2933,7 +2947,7 @@ export abstract class IRtcEngine {
|
|
|
2933
2947
|
* @param token The token generated on your server for authentication. When the token for preloading channels expires, you can update the token based on the number of channels you preload.
|
|
2934
2948
|
* When preloading one channel, calling this method to pass in the new token.
|
|
2935
2949
|
* When preloading more than one channels:
|
|
2936
|
-
* If you use a wildcard token for all preloaded channels, call updatePreloadChannelToken to update the token.
|
|
2950
|
+
* If you use a wildcard token for all preloaded channels, call updatePreloadChannelToken to update the token. When generating a wildcard token, ensure the user ID is not set as 0.
|
|
2937
2951
|
* If you use different tokens to preload different channels, call this method to pass in your user ID, channel name and the new token.
|
|
2938
2952
|
* @param channelId The channel name that you want to preload. This parameter signifies the channel in which users engage in real-time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total):
|
|
2939
2953
|
* All lowercase English letters: a to z.
|
|
@@ -2985,7 +2999,7 @@ export abstract class IRtcEngine {
|
|
|
2985
2999
|
* This method allows users to join only one channel at a time.
|
|
2986
3000
|
* Ensure that the app ID you use to generate the token is the same app ID that you pass in the initialize method; otherwise, you may fail to join the channel by token.
|
|
2987
3001
|
*
|
|
2988
|
-
* @param token The token generated on your server for authentication.
|
|
3002
|
+
* @param token The token generated on your server for authentication. If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don't need to apply for a new token every time joining a channel.
|
|
2989
3003
|
* @param channelId The channel name. This parameter signifies the channel in which users engage in real-time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters:
|
|
2990
3004
|
* All lowercase English letters: a to z.
|
|
2991
3005
|
* All uppercase English letters: A to Z.
|
|
@@ -3060,7 +3074,7 @@ export abstract class IRtcEngine {
|
|
|
3060
3074
|
/**
|
|
3061
3075
|
* Sets the channel profile.
|
|
3062
3076
|
*
|
|
3063
|
-
* After initializing the SDK, the default channel profile is the live streaming profile. You can call this method to set the
|
|
3077
|
+
* After initializing the SDK, the default channel profile is the live streaming profile. You can call this method to set the channel profile. The Agora SDK differentiates channel profiles and applies optimization algorithms accordingly. For example, it prioritizes smoothness and low latency for a video call and prioritizes video quality for interactive live video streaming.
|
|
3064
3078
|
* To ensure the quality of real-time communication, Agora recommends that all users in a channel use the same channel profile.
|
|
3065
3079
|
* This method must be called and set before joinChannel, and cannot be set again after joining the channel.
|
|
3066
3080
|
* The default video encoding bitrate are different in different channel profiles. See setVideoEncoderConfiguration.
|
|
@@ -3081,7 +3095,7 @@ export abstract class IRtcEngine {
|
|
|
3081
3095
|
* In the interactive live streaming profile, the SDK sets the user role as audience by default. You can call this method to set the user role as host. You can call this method either before or after joining a channel. If you call this method to set the user's role as the host before joining the channel and set the local video property through the setupLocalVideo method, the local video preview is automatically enabled when the user joins the channel. If you call this method to switch the user role after joining a channel, the SDK automatically does the following:
|
|
3082
3096
|
* Calls muteLocalAudioStream and muteLocalVideoStream to change the publishing state.
|
|
3083
3097
|
* Triggers onClientRoleChanged on the local client.
|
|
3084
|
-
* Triggers onUserJoined or onUserOffline on the remote client. This method applies to the interactive live streaming profile (the profile parameter of setChannelProfile is ChannelProfileLiveBroadcasting) only.
|
|
3098
|
+
* Triggers onUserJoined or onUserOffline on the remote client. This method applies to the interactive live streaming profile (the profile parameter of setChannelProfile is set as ChannelProfileLiveBroadcasting) only.
|
|
3085
3099
|
*
|
|
3086
3100
|
* @param role The user role in the interactive live streaming. See ClientRoleType.
|
|
3087
3101
|
* @param options The detailed options of a user, including the user level. See ClientRoleOptions.
|
|
@@ -3130,13 +3144,13 @@ export abstract class IRtcEngine {
|
|
|
3130
3144
|
*
|
|
3131
3145
|
* In scenarios where there are existing cameras to capture video, Agora recommends that you use the following steps to capture and publish video with multiple cameras:
|
|
3132
3146
|
* Call this method to enable multi-channel camera capture.
|
|
3133
|
-
* Call to start the local video preview.
|
|
3147
|
+
* Call startPreview to start the local video preview.
|
|
3134
3148
|
* Call startCameraCapture, and set sourceType to start video capture with the second camera.
|
|
3135
3149
|
* Call joinChannelEx, and set publishSecondaryCameraTrack to true to publish the video stream captured by the second camera in the channel. If you want to disable multi-channel camera capture, use the following steps:
|
|
3136
3150
|
* Call stopCameraCapture.
|
|
3137
|
-
* Call this method with enabled set to false. You can call this method before and after to enable multi-camera capture:
|
|
3138
|
-
* If it is enabled before, the local video preview shows the image captured by the two cameras at the same time.
|
|
3139
|
-
* If it is enabled after, the SDK stops the current camera capture first, and then enables the primary camera and the second camera. The local video preview appears black for a short time, and then automatically returns to normal. When using this function, ensure that the system version is 13.0 or later. The minimum iOS device types that support multi-camera capture are as follows:
|
|
3151
|
+
* Call this method with enabled set to false. You can call this method before and after startPreview to enable multi-camera capture:
|
|
3152
|
+
* If it is enabled before startPreview, the local video preview shows the image captured by the two cameras at the same time.
|
|
3153
|
+
* If it is enabled after startPreview, the SDK stops the current camera capture first, and then enables the primary camera and the second camera. The local video preview appears black for a short time, and then automatically returns to normal. When using this function, ensure that the system version is 13.0 or later. The minimum iOS device types that support multi-camera capture are as follows:
|
|
3140
3154
|
* iPhone XR
|
|
3141
3155
|
* iPhone XS
|
|
3142
3156
|
* iPhone XS Max
|
|
@@ -3257,12 +3271,14 @@ export abstract class IRtcEngine {
|
|
|
3257
3271
|
* Sets the image enhancement options.
|
|
3258
3272
|
*
|
|
3259
3273
|
* Enables or disables image enhancement, and sets the options.
|
|
3260
|
-
* Call this method before calling enableVideo or.
|
|
3274
|
+
* Call this method before calling enableVideo or startPreview.
|
|
3261
3275
|
* This method relies on the video enhancement dynamic library libagora_clear_vision_extension.dll. If the dynamic library is deleted, the function cannot be enabled normally.
|
|
3262
3276
|
*
|
|
3263
3277
|
* @param enabled Whether to enable the image enhancement function: true : Enable the image enhancement function. false : (Default) Disable the image enhancement function.
|
|
3264
3278
|
* @param options The image enhancement options. See BeautyOptions.
|
|
3265
|
-
* @param type
|
|
3279
|
+
* @param type Type of media source. See MediaSourceType. In this method, this parameter supports only the following two settings:
|
|
3280
|
+
* The default value is UnknownMediaSource.
|
|
3281
|
+
* If you want to use the second camera to capture video, set this parameter to SecondaryCameraSource.
|
|
3266
3282
|
*
|
|
3267
3283
|
* @returns
|
|
3268
3284
|
* 0: Success.
|
|
@@ -3352,7 +3368,7 @@ export abstract class IRtcEngine {
|
|
|
3352
3368
|
/**
|
|
3353
3369
|
* Enables/Disables the virtual background.
|
|
3354
3370
|
*
|
|
3355
|
-
* The virtual background feature enables the local user to replace their original background with a static image, dynamic video, blurred background, or portrait-background segmentation to achieve picture-in-picture effect. Once the virtual background feature is enabled, all users in the channel can see the custom background. Call this method before calling enableVideo or.
|
|
3371
|
+
* The virtual background feature enables the local user to replace their original background with a static image, dynamic video, blurred background, or portrait-background segmentation to achieve picture-in-picture effect. Once the virtual background feature is enabled, all users in the channel can see the custom background. Call this method before calling enableVideo or startPreview.
|
|
3356
3372
|
* This feature requires high performance devices. Agora recommends that you implement it on devices equipped with the following chips:
|
|
3357
3373
|
* Devices with an i5 CPU and better
|
|
3358
3374
|
* Agora recommends that you use this feature in scenarios that meet the following conditions:
|
|
@@ -4742,7 +4758,7 @@ export abstract class IRtcEngine {
|
|
|
4742
4758
|
*
|
|
4743
4759
|
* The SDK enables the low-quality video stream auto mode on the sender side by default (it does not actively sending low-quality video streams). The host identity receiver can initiate a low-quality video stream application at the receiving end by calling setRemoteVideoStreamType. After receiving the application, the sending end automatically switches to the low-quality video stream mode.
|
|
4744
4760
|
* If you want to modify this behavior, you can call this method and modify the mode to DisableSimulcastStream (never send low-quality video streams) or EnableSimulcastStream (always send low-quality video streams).
|
|
4745
|
-
* If you want to restore the default behavior after making changes, you can call this method again with mode set to AutoSimulcastStream. The difference and connection between this method and is as follows:
|
|
4761
|
+
* If you want to restore the default behavior after making changes, you can call this method again with mode set to AutoSimulcastStream. The difference and connection between this method and enableDualStreamMode is as follows:
|
|
4746
4762
|
* When calling this method and setting mode to DisableSimulcastStream, it has the same effect as calling and setting enabled to false.
|
|
4747
4763
|
* When calling this method and setting mode to EnableSimulcastStream, it has the same effect as calling and setting enabled to true.
|
|
4748
4764
|
* Both methods can be called before and after joining a channel. If both methods are used, the settings in the method called later takes precedence.
|
|
@@ -5170,7 +5186,9 @@ export abstract class IRtcEngine {
|
|
|
5170
5186
|
* @param extension The name of the extension.
|
|
5171
5187
|
* @param key The key of the extension.
|
|
5172
5188
|
* @param value The value of the extension key.
|
|
5173
|
-
* @param type
|
|
5189
|
+
* @param type Type of media source. See MediaSourceType. In this method, this parameter supports only the following two settings:
|
|
5190
|
+
* The default value is UnknownMediaSource.
|
|
5191
|
+
* If you want to use the second camera to capture video, set this parameter to SecondaryCameraSource.
|
|
5174
5192
|
*
|
|
5175
5193
|
* @returns
|
|
5176
5194
|
* 0: Success.
|
|
@@ -5638,8 +5656,7 @@ export abstract class IRtcEngine {
|
|
|
5638
5656
|
/**
|
|
5639
5657
|
* Starts pushing media streams to a CDN without transcoding.
|
|
5640
5658
|
*
|
|
5641
|
-
*
|
|
5642
|
-
* Call this method after joining a channel.
|
|
5659
|
+
* Call this method after joining a channel.
|
|
5643
5660
|
* Only hosts in the LIVE_BROADCASTING profile can call this method.
|
|
5644
5661
|
* If you want to retry pushing streams after a failed push, make sure to call stopRtmpStream first, then call this method to retry pushing streams; otherwise, the SDK returns the same error code as the last failed push. Agora recommends that you use the server-side Media Push function. You can call this method to push an audio or video stream to the specified CDN address. This method can push media streams to only one CDN address at a time, so if you need to push streams to multiple addresses, call this method multiple times. After you call this method, the SDK triggers the onRtmpStreamingStateChanged callback on the local client to report the state of the streaming.
|
|
5645
5662
|
*
|
|
@@ -5657,8 +5674,7 @@ export abstract class IRtcEngine {
|
|
|
5657
5674
|
/**
|
|
5658
5675
|
* Starts Media Push and sets the transcoding configuration.
|
|
5659
5676
|
*
|
|
5660
|
-
* Agora recommends that you use the server-side Media Push function. You can call this method to push a live audio-and-video stream to the specified CDN address and set the transcoding configuration. This method can push media streams to only one CDN address at a time, so if you need to push streams to multiple addresses, call this method multiple times. After you call this method, the SDK triggers the onRtmpStreamingStateChanged callback on the local client to report the state of the streaming.
|
|
5661
|
-
* Ensure that you enable the Media Push service before using this function. See Enable Media Push.
|
|
5677
|
+
* Agora recommends that you use the server-side Media Push function. You can call this method to push a live audio-and-video stream to the specified CDN address and set the transcoding configuration. This method can push media streams to only one CDN address at a time, so if you need to push streams to multiple addresses, call this method multiple times. Under one Agora project, the maximum number of concurrent tasks to push media streams is 200 by default. If you need a higher quota, contact. After you call this method, the SDK triggers the onRtmpStreamingStateChanged callback on the local client to report the state of the streaming.
|
|
5662
5678
|
* Call this method after joining a channel.
|
|
5663
5679
|
* Only hosts in the LIVE_BROADCASTING profile can call this method.
|
|
5664
5680
|
* If you want to retry pushing streams after a failed push, make sure to call stopRtmpStream first, then call this method to retry pushing streams; otherwise, the SDK returns the same error code as the last failed push.
|
|
@@ -5780,6 +5796,7 @@ export abstract class IRtcEngine {
|
|
|
5780
5796
|
* Sets the rotation angle of the captured video.
|
|
5781
5797
|
*
|
|
5782
5798
|
* This method applies to Windows only.
|
|
5799
|
+
* You must call this method after enableVideo. The setting result will take effect after the camera is successfully turned on, that is, after the SDK triggers the onLocalVideoStateChanged callback and returns the local video state as LocalVideoStreamStateCapturing (1).
|
|
5783
5800
|
* When the video capture device does not have the gravity sensing function, you can call this method to manually adjust the rotation angle of the captured video.
|
|
5784
5801
|
*
|
|
5785
5802
|
* @param type The video source type. See VideoSourceType.
|
|
@@ -6114,7 +6131,7 @@ export abstract class IRtcEngine {
|
|
|
6114
6131
|
* The local client: onLocalUserRegistered, onJoinChannelSuccess and onConnectionStateChanged callbacks.
|
|
6115
6132
|
* The remote client: The onUserJoined callback, if the user is in the COMMUNICATION profile, and the onUserInfoUpdated callback if the user is a host in the LIVE_BROADCASTING profile. Once a user joins the channel, the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. To stop subscribing to a specified stream or all remote streams, call the corresponding mute methods. To ensure smooth communication, use the same parameter type to identify the user. For example, if a user joins the channel with a user ID, then ensure all the other users use the user ID too. The same applies to the user account. If a user joins the channel with the Agora Web SDK, ensure that the ID of the user is set to the same parameter type.
|
|
6116
6133
|
*
|
|
6117
|
-
* @param token The token generated on your server for authentication.
|
|
6134
|
+
* @param token The token generated on your server for authentication. If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don't need to apply for a new token every time joining a channel.
|
|
6118
6135
|
* @param channelId The channel name. This parameter signifies the channel in which users engage in real-time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters:
|
|
6119
6136
|
* All lowercase English letters: a to z.
|
|
6120
6137
|
* All uppercase English letters: A to Z.
|
|
@@ -6154,7 +6171,7 @@ export abstract class IRtcEngine {
|
|
|
6154
6171
|
* The local client: onLocalUserRegistered, onJoinChannelSuccess and onConnectionStateChanged callbacks.
|
|
6155
6172
|
* The remote client: The onUserJoined callback, if the user is in the COMMUNICATION profile, and the onUserInfoUpdated callback if the user is a host in the LIVE_BROADCASTING profile. Once a user joins the channel, the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. To stop subscribing to a specified stream or all remote streams, call the corresponding mute methods. To ensure smooth communication, use the same parameter type to identify the user. For example, if a user joins the channel with a user ID, then ensure all the other users use the user ID too. The same applies to the user account. If a user joins the channel with the Agora Web SDK, ensure that the ID of the user is set to the same parameter type.
|
|
6156
6173
|
*
|
|
6157
|
-
* @param token The token generated on your server for authentication.
|
|
6174
|
+
* @param token The token generated on your server for authentication. If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don't need to apply for a new token every time joining a channel.
|
|
6158
6175
|
* @param channelId The channel name. This parameter signifies the channel in which users engage in real-time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters:
|
|
6159
6176
|
* All lowercase English letters: a to z.
|
|
6160
6177
|
* All uppercase English letters: A to Z.
|
|
@@ -6593,6 +6610,11 @@ export abstract class IRtcEngine {
|
|
|
6593
6610
|
*/
|
|
6594
6611
|
abstract getNtpWallTimeInMs(): number;
|
|
6595
6612
|
|
|
6613
|
+
/**
|
|
6614
|
+
* @ignore
|
|
6615
|
+
*/
|
|
6616
|
+
abstract isFeatureAvailableOnDevice(type: FeatureType): boolean;
|
|
6617
|
+
|
|
6596
6618
|
/**
|
|
6597
6619
|
* Gets the IAudioDeviceManager object to manage audio devices.
|
|
6598
6620
|
*
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
VideoSubscriptionOptions,
|
|
17
17
|
WatermarkOptions,
|
|
18
18
|
} from './AgoraBase';
|
|
19
|
-
import { RenderModeType } from './AgoraMediaBase';
|
|
19
|
+
import { ContentInspectConfig, RenderModeType } from './AgoraMediaBase';
|
|
20
20
|
import {
|
|
21
21
|
ChannelMediaOptions,
|
|
22
22
|
IRtcEngine,
|
|
@@ -52,7 +52,7 @@ export abstract class IRtcEngineEx extends IRtcEngine {
|
|
|
52
52
|
* If you want to join the same channel from different devices, ensure that the user IDs are different for all devices.
|
|
53
53
|
* Ensure that the app ID you use to generate the token is the same as the app ID used when creating the IRtcEngine instance.
|
|
54
54
|
*
|
|
55
|
-
* @param token The token generated on your server for authentication.
|
|
55
|
+
* @param token The token generated on your server for authentication. If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don't need to apply for a new token every time joining a channel.
|
|
56
56
|
* @param connection The connection information. See RtcConnection.
|
|
57
57
|
* @param options The channel media options. See ChannelMediaOptions.
|
|
58
58
|
*
|
|
@@ -78,7 +78,7 @@ export abstract class IRtcEngineEx extends IRtcEngine {
|
|
|
78
78
|
*
|
|
79
79
|
* This method lets the user leave the channel, for example, by hanging up or exiting the call. After calling joinChannelEx to join the channel, this method must be called to end the call before starting the next call. This method can be called whether or not a call is currently in progress. This method releases all resources related to the session. This method call is asynchronous. When this method returns, it does not necessarily mean that the user has left the channel. After you leave the channel, the SDK triggers the onLeaveChannel callback. After actually leaving the channel, the local user triggers the onLeaveChannel callback; after the user in the communication scenario and the host in the live streaming scenario leave the channel, the remote user triggers the onUserOffline callback.
|
|
80
80
|
* If you call release immediately after calling this method, the SDK does not trigger the onLeaveChannel callback.
|
|
81
|
-
*
|
|
81
|
+
* If you want to leave the channels that you joined by calling joinChannel and joinChannelEx, call the leaveChannel method.
|
|
82
82
|
*
|
|
83
83
|
* @param connection The connection information. See RtcConnection.
|
|
84
84
|
* @param options The options for leaving the channel. See LeaveChannelOptions. This parameter only supports the stopMicrophoneRecording member in the LeaveChannelOptions settings; setting other members does not take effect.
|
|
@@ -522,7 +522,7 @@ export abstract class IRtcEngineEx extends IRtcEngine {
|
|
|
522
522
|
/**
|
|
523
523
|
* Creates a data stream.
|
|
524
524
|
*
|
|
525
|
-
* Creates a data stream. Each user can create up to five data streams in a single channel.
|
|
525
|
+
* Creates a data stream. Each user can create up to five data streams in a single channel.
|
|
526
526
|
*
|
|
527
527
|
* @param config The configurations for the data stream. See DataStreamConfig.
|
|
528
528
|
* @param connection The connection information. See RtcConnection.
|
|
@@ -641,8 +641,7 @@ export abstract class IRtcEngineEx extends IRtcEngine {
|
|
|
641
641
|
/**
|
|
642
642
|
* Starts pushing media streams to a CDN without transcoding.
|
|
643
643
|
*
|
|
644
|
-
*
|
|
645
|
-
* Call this method after joining a channel.
|
|
644
|
+
* Call this method after joining a channel.
|
|
646
645
|
* Only hosts in the LIVE_BROADCASTING profile can call this method.
|
|
647
646
|
* If you want to retry pushing streams after a failed push, make sure to call stopRtmpStream first, then call this method to retry pushing streams; otherwise, the SDK returns the same error code as the last failed push. Agora recommends that you use the server-side Media Push function. You can call this method to push an audio or video stream to the specified CDN address. This method can push media streams to only one CDN address at a time, so if you need to push streams to multiple addresses, call this method multiple times. After you call this method, the SDK triggers the onRtmpStreamingStateChanged callback on the local client to report the state of the streaming.
|
|
648
647
|
*
|
|
@@ -918,6 +917,15 @@ export abstract class IRtcEngineEx extends IRtcEngine {
|
|
|
918
917
|
filePath: string
|
|
919
918
|
): number;
|
|
920
919
|
|
|
920
|
+
/**
|
|
921
|
+
* @ignore
|
|
922
|
+
*/
|
|
923
|
+
abstract enableContentInspectEx(
|
|
924
|
+
enabled: boolean,
|
|
925
|
+
config: ContentInspectConfig,
|
|
926
|
+
connection: RtcConnection
|
|
927
|
+
): number;
|
|
928
|
+
|
|
921
929
|
/**
|
|
922
930
|
* Enables tracing the video frame rendering process.
|
|
923
931
|
*
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
VideoSubscriptionOptions,
|
|
16
16
|
WatermarkOptions,
|
|
17
17
|
} from '../AgoraBase';
|
|
18
|
-
import { RenderModeType } from '../AgoraMediaBase';
|
|
18
|
+
import { ContentInspectConfig, RenderModeType } from '../AgoraMediaBase';
|
|
19
19
|
import {
|
|
20
20
|
ChannelMediaOptions,
|
|
21
21
|
LeaveChannelOptions,
|
|
@@ -1494,6 +1494,40 @@ export class IRtcEngineExImpl extends IRtcEngineImpl implements IRtcEngineEx {
|
|
|
1494
1494
|
return 'RtcEngineEx_takeSnapshotEx';
|
|
1495
1495
|
}
|
|
1496
1496
|
|
|
1497
|
+
enableContentInspectEx(
|
|
1498
|
+
enabled: boolean,
|
|
1499
|
+
config: ContentInspectConfig,
|
|
1500
|
+
connection: RtcConnection
|
|
1501
|
+
): number {
|
|
1502
|
+
const apiType = this.getApiTypeFromEnableContentInspectEx(
|
|
1503
|
+
enabled,
|
|
1504
|
+
config,
|
|
1505
|
+
connection
|
|
1506
|
+
);
|
|
1507
|
+
const jsonParams = {
|
|
1508
|
+
enabled: enabled,
|
|
1509
|
+
config: config,
|
|
1510
|
+
connection: connection,
|
|
1511
|
+
toJSON: () => {
|
|
1512
|
+
return {
|
|
1513
|
+
enabled: enabled,
|
|
1514
|
+
config: config,
|
|
1515
|
+
connection: connection,
|
|
1516
|
+
};
|
|
1517
|
+
},
|
|
1518
|
+
};
|
|
1519
|
+
const jsonResults = callIrisApi.call(this, apiType, jsonParams);
|
|
1520
|
+
return jsonResults.result;
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
protected getApiTypeFromEnableContentInspectEx(
|
|
1524
|
+
enabled: boolean,
|
|
1525
|
+
config: ContentInspectConfig,
|
|
1526
|
+
connection: RtcConnection
|
|
1527
|
+
): string {
|
|
1528
|
+
return 'RtcEngineEx_enableContentInspectEx';
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1497
1531
|
startMediaRenderingTracingEx(connection: RtcConnection): number {
|
|
1498
1532
|
const apiType = this.getApiTypeFromStartMediaRenderingTracingEx(connection);
|
|
1499
1533
|
const jsonParams = {
|
|
@@ -74,6 +74,7 @@ import {
|
|
|
74
74
|
ChannelMediaOptions,
|
|
75
75
|
CloudProxyType,
|
|
76
76
|
DirectCdnStreamingMediaOptions,
|
|
77
|
+
FeatureType,
|
|
77
78
|
IDirectCdnStreamingEventHandler,
|
|
78
79
|
IMetadataObserver,
|
|
79
80
|
IRtcEngine,
|
|
@@ -411,9 +412,7 @@ export function processIRtcEngineEventHandler(
|
|
|
411
412
|
|
|
412
413
|
case 'onLocalVideoStats':
|
|
413
414
|
if (handler.onLocalVideoStats !== undefined) {
|
|
414
|
-
|
|
415
|
-
handler.onLocalVideoStats(jsonParams.source, jsonParams.stats);
|
|
416
|
-
}
|
|
415
|
+
handler.onLocalVideoStats(jsonParams.source, jsonParams.stats);
|
|
417
416
|
}
|
|
418
417
|
break;
|
|
419
418
|
|
|
@@ -6709,6 +6708,26 @@ export class IRtcEngineImpl implements IRtcEngine {
|
|
|
6709
6708
|
return 'RtcEngine_getNtpWallTimeInMs';
|
|
6710
6709
|
}
|
|
6711
6710
|
|
|
6711
|
+
isFeatureAvailableOnDevice(type: FeatureType): boolean {
|
|
6712
|
+
const apiType = this.getApiTypeFromIsFeatureAvailableOnDevice(type);
|
|
6713
|
+
const jsonParams = {
|
|
6714
|
+
type: type,
|
|
6715
|
+
toJSON: () => {
|
|
6716
|
+
return {
|
|
6717
|
+
type: type,
|
|
6718
|
+
};
|
|
6719
|
+
},
|
|
6720
|
+
};
|
|
6721
|
+
const jsonResults = callIrisApi.call(this, apiType, jsonParams);
|
|
6722
|
+
return jsonResults.result;
|
|
6723
|
+
}
|
|
6724
|
+
|
|
6725
|
+
protected getApiTypeFromIsFeatureAvailableOnDevice(
|
|
6726
|
+
type: FeatureType
|
|
6727
|
+
): string {
|
|
6728
|
+
return 'RtcEngine_isFeatureAvailableOnDevice';
|
|
6729
|
+
}
|
|
6730
|
+
|
|
6712
6731
|
getAudioDeviceManager(): IAudioDeviceManager {
|
|
6713
6732
|
const apiType = this.getApiTypeFromGetAudioDeviceManager();
|
|
6714
6733
|
const jsonParams = {};
|
|
@@ -92,7 +92,11 @@ export type EventProcessor<T extends ProcessorType> = {
|
|
|
92
92
|
type: (data: any) => EVENT_TYPE;
|
|
93
93
|
func: Function[];
|
|
94
94
|
preprocess?: (event: string, data: any, buffers: Uint8Array[]) => void;
|
|
95
|
-
handlers: (
|
|
95
|
+
handlers: (
|
|
96
|
+
event: string,
|
|
97
|
+
data: any,
|
|
98
|
+
buffers: Uint8Array[]
|
|
99
|
+
) => (T | undefined)[] | undefined;
|
|
96
100
|
};
|
|
97
101
|
|
|
98
102
|
export enum EVENT_TYPE {
|
|
@@ -151,7 +155,8 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
151
155
|
data.audioFrame.buffer = buffers[0];
|
|
152
156
|
}
|
|
153
157
|
},
|
|
154
|
-
handlers: () =>
|
|
158
|
+
handlers: (event: string, data: any) =>
|
|
159
|
+
MediaEngineInternal._audio_frame_observers,
|
|
155
160
|
},
|
|
156
161
|
IVideoFrameObserver: {
|
|
157
162
|
suffix: 'VideoFrameObserver_',
|
|
@@ -170,14 +175,15 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
170
175
|
data.videoFrame.alphaBuffer = buffers[4];
|
|
171
176
|
}
|
|
172
177
|
},
|
|
173
|
-
handlers: () =>
|
|
178
|
+
handlers: (event: string, data: any) =>
|
|
179
|
+
MediaEngineInternal._video_frame_observers,
|
|
174
180
|
},
|
|
175
181
|
IAudioSpectrumObserver: {
|
|
176
182
|
suffix: 'AudioSpectrumObserver_',
|
|
177
183
|
type: (data: any) =>
|
|
178
184
|
data.playerId === 0 ? EVENT_TYPE.IRtcEngine : EVENT_TYPE.IMediaPlayer,
|
|
179
185
|
func: [processIAudioSpectrumObserver],
|
|
180
|
-
handlers: (data: any) =>
|
|
186
|
+
handlers: (event: string, data: any) =>
|
|
181
187
|
data.playerId === 0
|
|
182
188
|
? RtcEngineExInternal._audio_spectrum_observers
|
|
183
189
|
: MediaPlayerInternal._audio_spectrum_observers.get(data.playerId),
|
|
@@ -201,7 +207,8 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
201
207
|
break;
|
|
202
208
|
}
|
|
203
209
|
},
|
|
204
|
-
handlers: () =>
|
|
210
|
+
handlers: (event: string, data: any) =>
|
|
211
|
+
RtcEngineExInternal._audio_encoded_frame_observers,
|
|
205
212
|
},
|
|
206
213
|
IVideoEncodedFrameObserver: {
|
|
207
214
|
suffix: 'VideoEncodedFrameObserver_',
|
|
@@ -220,13 +227,14 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
220
227
|
break;
|
|
221
228
|
}
|
|
222
229
|
},
|
|
223
|
-
handlers: () =>
|
|
230
|
+
handlers: (event: string, data: any) =>
|
|
231
|
+
MediaEngineInternal._video_encoded_frame_observers,
|
|
224
232
|
},
|
|
225
233
|
IMediaPlayerSourceObserver: {
|
|
226
234
|
suffix: 'MediaPlayerSourceObserver_',
|
|
227
235
|
type: () => EVENT_TYPE.IMediaPlayer,
|
|
228
236
|
func: [processIMediaPlayerSourceObserver],
|
|
229
|
-
handlers: (data: any) =>
|
|
237
|
+
handlers: (event: string, data: any) =>
|
|
230
238
|
MediaPlayerInternal._source_observers.get(data.playerId),
|
|
231
239
|
},
|
|
232
240
|
IAudioPcmFrameSink: {
|
|
@@ -242,7 +250,7 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
242
250
|
data.frame.data_ = Array.from(buffers[0] ?? []);
|
|
243
251
|
}
|
|
244
252
|
},
|
|
245
|
-
handlers: (data: any) =>
|
|
253
|
+
handlers: (event: string, data: any) =>
|
|
246
254
|
MediaPlayerInternal._audio_frame_observers.get(data.playerId),
|
|
247
255
|
},
|
|
248
256
|
IMediaPlayerVideoFrameObserver: {
|
|
@@ -262,14 +270,14 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
262
270
|
data.frame.alphaBuffer = buffers[4];
|
|
263
271
|
}
|
|
264
272
|
},
|
|
265
|
-
handlers: (data: any) =>
|
|
273
|
+
handlers: (event: string, data: any) =>
|
|
266
274
|
MediaPlayerInternal._video_frame_observers.get(data.playerId),
|
|
267
275
|
},
|
|
268
276
|
IMediaRecorderObserver: {
|
|
269
277
|
suffix: 'MediaRecorderObserver_',
|
|
270
278
|
type: () => EVENT_TYPE.IMediaRecorder,
|
|
271
279
|
func: [processIMediaRecorderObserver],
|
|
272
|
-
handlers: (data: any) => [
|
|
280
|
+
handlers: (event: string, data: any) => [
|
|
273
281
|
MediaRecorderInternal._observers.get(data.nativeHandle),
|
|
274
282
|
],
|
|
275
283
|
},
|
|
@@ -290,13 +298,15 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
290
298
|
break;
|
|
291
299
|
}
|
|
292
300
|
},
|
|
293
|
-
handlers: () =>
|
|
301
|
+
handlers: (event: string, data: any) =>
|
|
302
|
+
RtcEngineExInternal._metadata_observer,
|
|
294
303
|
},
|
|
295
304
|
IDirectCdnStreamingEventHandler: {
|
|
296
305
|
suffix: 'DirectCdnStreamingEventHandler_',
|
|
297
306
|
type: () => EVENT_TYPE.IRtcEngine,
|
|
298
307
|
func: [processIDirectCdnStreamingEventHandler],
|
|
299
|
-
handlers: () =>
|
|
308
|
+
handlers: (event: string, data: any) =>
|
|
309
|
+
RtcEngineExInternal._direct_cdn_streaming_event_handler,
|
|
300
310
|
},
|
|
301
311
|
IRtcEngineEventHandler: {
|
|
302
312
|
suffix: 'RtcEngineEventHandler_',
|
|
@@ -314,7 +324,12 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
314
324
|
break;
|
|
315
325
|
}
|
|
316
326
|
},
|
|
317
|
-
handlers: () =>
|
|
327
|
+
handlers: (event: string, data: any) => {
|
|
328
|
+
if (event === 'onLocalVideoStats' && 'connection' in data) {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
return RtcEngineExInternal._event_handlers;
|
|
332
|
+
},
|
|
318
333
|
},
|
|
319
334
|
IMusicContentCenterEventHandler: {
|
|
320
335
|
suffix: 'MusicContentCenterEventHandler_',
|
|
@@ -333,7 +348,8 @@ export const EVENT_PROCESSORS: EventProcessors = {
|
|
|
333
348
|
}
|
|
334
349
|
}
|
|
335
350
|
},
|
|
336
|
-
handlers: () =>
|
|
351
|
+
handlers: (event: string, data: any) =>
|
|
352
|
+
MusicContentCenterInternal._event_handlers,
|
|
337
353
|
},
|
|
338
354
|
};
|
|
339
355
|
|
|
@@ -342,50 +358,54 @@ function handleEvent(...[event, data, buffers]: any) {
|
|
|
342
358
|
console.info('onEvent', event, data, buffers);
|
|
343
359
|
}
|
|
344
360
|
|
|
345
|
-
let _data: any;
|
|
346
|
-
try {
|
|
347
|
-
_data = JSON.parse(data) ?? {};
|
|
348
|
-
} catch (e) {
|
|
349
|
-
_data = {};
|
|
350
|
-
}
|
|
351
|
-
|
|
352
361
|
let _event: string = event;
|
|
353
|
-
let processor: EventProcessor<any> =
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
if (
|
|
358
|
-
_event.startsWith(p.suffix) &&
|
|
359
|
-
processor.handlers(_data) !== undefined
|
|
360
|
-
) {
|
|
361
|
-
processor = p;
|
|
362
|
-
const reg = new RegExp(`^${processor.suffix}`, 'g');
|
|
363
|
-
_event = _event.replace(reg, '');
|
|
364
|
-
return true;
|
|
365
|
-
}
|
|
366
|
-
return false;
|
|
362
|
+
let processor: EventProcessor<any> | undefined = Object.values(
|
|
363
|
+
EVENT_PROCESSORS
|
|
364
|
+
).find((it) => {
|
|
365
|
+
return _event.startsWith(it.suffix);
|
|
367
366
|
});
|
|
368
367
|
|
|
368
|
+
if (processor === undefined) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// allow replace preprocess to undefined for avoid call more than once
|
|
373
|
+
processor = { ...processor };
|
|
374
|
+
|
|
375
|
+
const reg = new RegExp(`^${processor.suffix}`, 'g');
|
|
376
|
+
_event = _event.replace(reg, '');
|
|
369
377
|
if (_event.endsWith('Ex')) {
|
|
370
378
|
_event = _event.replace(/Ex$/g, '');
|
|
371
379
|
}
|
|
372
380
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
381
|
+
let _data: any;
|
|
382
|
+
try {
|
|
383
|
+
_data = JSON.parse(data) ?? {};
|
|
384
|
+
} catch (e) {
|
|
385
|
+
_data = {};
|
|
376
386
|
}
|
|
377
387
|
|
|
388
|
+
const _buffers: Uint8Array[] = buffers;
|
|
389
|
+
|
|
378
390
|
if (processor.handlers) {
|
|
379
|
-
processor.handlers(_data)
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
391
|
+
const handlers = processor.handlers(_event, _data, _buffers);
|
|
392
|
+
if (handlers !== undefined) {
|
|
393
|
+
if (processor.preprocess) {
|
|
394
|
+
processor.preprocess(_event, _data, _buffers);
|
|
395
|
+
// call preprocess only once
|
|
396
|
+
processor.preprocess = undefined;
|
|
384
397
|
}
|
|
385
|
-
|
|
398
|
+
handlers.map((value) => {
|
|
399
|
+
if (value) {
|
|
400
|
+
processor!.func.map((it) => {
|
|
401
|
+
it(value, _event, _data);
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
}
|
|
386
406
|
}
|
|
387
407
|
|
|
388
|
-
emitEvent(_event, processor, _data);
|
|
408
|
+
emitEvent(_event, processor, _data, _buffers);
|
|
389
409
|
}
|
|
390
410
|
|
|
391
411
|
/**
|
|
@@ -526,7 +546,16 @@ export function callIrisApi(funcName: string, params: any): any {
|
|
|
526
546
|
export function emitEvent<EventType extends keyof T, T extends ProcessorType>(
|
|
527
547
|
eventType: EventType,
|
|
528
548
|
eventProcessor: EventProcessor<T>,
|
|
529
|
-
data: any
|
|
549
|
+
data: any,
|
|
550
|
+
buffers?: Uint8Array[]
|
|
530
551
|
): void {
|
|
552
|
+
if (DeviceEventEmitter.listenerCount(eventType as string) === 0) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
if (eventProcessor.preprocess) {
|
|
556
|
+
eventProcessor.preprocess(eventType as string, data, buffers ?? []);
|
|
557
|
+
// call preprocess only once
|
|
558
|
+
eventProcessor.preprocess = undefined;
|
|
559
|
+
}
|
|
531
560
|
DeviceEventEmitter.emit(eventType as string, eventProcessor, data);
|
|
532
561
|
}
|
|
@@ -376,7 +376,7 @@ export class RendererManager extends IRendererManager {
|
|
|
376
376
|
break;
|
|
377
377
|
}
|
|
378
378
|
if (finalResult.ret !== 0) {
|
|
379
|
-
|
|
379
|
+
logDebug('GetVideoFrame ret is', finalResult.ret, rendererItem);
|
|
380
380
|
return;
|
|
381
381
|
}
|
|
382
382
|
if (!finalResult.isNewFrame) {
|