Skip to content

Commit 320844a

Browse files
xgfd3zhaoyongqiangplutoless
authored
Dev/4.2.0 (#340)
* [Android]fix bytedance beauty mirror bug * update Scene Beuaty * update Byte Beauty * update fu Beauty * Update README.zh.md * Update README.md * [Android]fix faceunity beauty bug(CSSA-1070) * [Android]remove inaccurate comment. * [Android]perfect sense time beauty implement. * [Android]adapte to 4.2.0. * Adaptive PCM acquisition * Add Record Moudle * add voice formant adjust * add video background effect * [Android]add MediaRecorder case * Adaptive multi-channel camera * modify module name * [Android]perfect MediaRecorder case * choose screen share frameRate * add videoProcess remote alpha mask * [Android]add LocalVideoTranscoding case. * [Android]add more voice configs for VoiceEffects * [Android]add virtual background video source type for VideoProcessExtension. * [Android]add ScreenScenarioType selector for ScreenSharing. * [Android]update rtc version to 4.2.0 in config files * [Android][Audio]adapt to 4.2.0 sdk. * replace video source * Fit the 4.2.0 Mac SDK * add local and remote record module * fix record stop bug * add virtual video background * Mac Add local composite graph moudle * add screen share fps choose * open remote video alpha mask * Fit the 4.2.0 audio-only SDK * set voice formant * modify mediaplayer url * update mac media player url * [Windows]adapt to 420 sdk and add media recoder case. * [Windows]fix bugs of media recorder case. * update scene resouces * [Windows]perfect local video transcoding case. * [Windows]add voice conversion config to beauty audio case. * [Windows]add virtual background type choices to beauty case. * [Windows]add screen capture scenario config. * add video resource * update video resource * [Android]update test video url and file reader. * [Android]perfect local video transcoding case * add smaplebufferredner init method * add multi video track moudle * fix scene beauty change frameRate bug * update role bug * fix rawVideoData snapshot bug * update save video path * update rtmp error bug * [Android]fix sceneTimeBeauty crash and default video resolution size problem. * fix voice changer bug * [Android]perfect third part beauty cases * fix pcm play bug * [Android]fix NMS-11565 * update script * update script * update exportplist file * update script * update scene bug * update exportPlist file * update exportplist file * update script * update script * [Android]perfect third part beauty cases * [Android]fix setting crash * update script * add logpath * update script * update script * update script * update script * update script * pip remote video muted replace image * update audio example bundle id * update script * update mac exportplist file * fix mac raw video data snapshot bug * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * update mac script * [Windows]add PushExternalVideoYUV case. * [Windows]fix PushExternalVideoYUV bugs. * [Windows]add MultiVideoSourceTracks case. * update script * [Windows]perfect MultiVideoSourceTrack case and fix some bugs. * [Windows]fix bug - NMS-11562 * [Windows]fix yuv raw data bug. * [Android]add push video buffer type selector for PushExternalVideoYUV case. * [Android]update gradle config. * [Android]fix beauty bug in arm64. * [Android]fix render bug in arm64 * [Android]remove ndk filter limit. * [Windows]fix crash of switching between LiveBroadcast and AgoraScreenCapture; fix local render bug of resuming PushExternalVideoYUV. * [Windows]perfect screen sharing case(NMS-11314) and fix some bugs. * [Windows]fix sample res bug. * update mac readme * update screen share exclude window params * update README * update README. * [Android]update README. * fix pip Android publish stream rotation 90° * fix ci remove sources bug * update sign mode * update auto sign * update script * update script * [Android]update byte dance camera facing config. * fix pip display bug * update beauty params * Add pip version tips * [Android]perfect MultiVideoSourceTracks case and fix some bugs. * [Windows]fix statistic display bug and etc. * update recorder api * update recorder api * pip support BGRA encode * [Android]adjust MediaRecorder case and etc. * [Android]fix mirror bug of scene time and face unity. * update english content * [Android]fix ci bug. * [Windows]adjust media recorder api. * support pip i420 * update new sdk * update exportPlist file * [Android]fix token/app id input bug. * [Android]fix push timestamp bug(NMS-12801) * [Android]fix sensetime sticker oritation bug. * enable filters * fix custom capturer audio crash bug * fix mutil capturer video bug * fix custom video capturer publish streaming bug * [Android]fix video filter invalid bug. * [Android]remove publishCameraTrack=false * [Windows]fix beauty external bug. * Adapt to new versions * [Windows]use timestamp of getCurrentMonotonicTimeInMs api to pushVideoFrame. * update sdk version to 4.2.0 * [Windows]update sdk link. * update azure ci --------- Co-authored-by: zhaoyongqiang <[email protected]> Co-authored-by: Qianze Zhang <[email protected]>
1 parent a95f99b commit 320844a

File tree

231 files changed

+12296
-1839
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

231 files changed

+12296
-1839
lines changed

.github/ci/build/build_ios_ipa.sh

+21-19
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@ TARGET_NAME=${PROJECT_PATH##*/}
1717

1818
KEYCENTER_PATH=${PROJECT_PATH}"/"${TARGET_NAME}"/Common/KeyCenter.swift"
1919

20-
METHOD_PATH=${PROJECT_PATH}"/ExportOptions.plist"
21-
2220
# 打包环境
23-
CONFIGURATION=$method
21+
CONFIGURATION="Debug"
2422

2523
#工程文件路径
2624
APP_PATH="${PROJECT_PATH}/${TARGET_NAME}.xcworkspace"
@@ -65,8 +63,6 @@ echo PBXPROJ_PATH: $PBXPROJ_PATH
6563
# Release
6664
/usr/libexec/PlistBuddy -c "Set :objects:03D13BF82448758C00B599B3:buildSettings:CURRENT_PROJECT_VERSION ${BUILD_NUMBER}" $PBXPROJ_PATH
6765

68-
#修改打包方式
69-
/usr/libexec/PlistBuddy -c "Set :method $CONFIGURATION" $METHOD_PATH
7066

7167
# 读取APPID环境变量
7268
echo AGORA_APP_ID:$APP_ID
@@ -87,33 +83,39 @@ xcodebuild clean -workspace "${APP_PATH}" -configuration "${CONFIGURATION}" -sch
8783
CURRENT_TIME=$(date "+%Y-%m-%d %H-%M-%S")
8884

8985
# 归档路径
90-
ARCHIVE_PATH="${PROJECT_PATH}/${TARGET_NAME} ${CURRENT_TIME}/${TARGET_NAME}.xcarchive"
86+
ARCHIVE_PATH="${WORKSPACE}/${TARGET_NAME}_${BUILD_NUMBER}.xcarchive"
9187
# 编译环境
9288

93-
# 导出路径
94-
EXPORT_PATH="${PROJECT_PATH}/${TARGET_NAME} ${CURRENT_TIME}"
95-
9689
# plist路径
9790
PLIST_PATH="${PROJECT_PATH}/ExportOptions.plist"
9891

9992
echo PLIST_PATH: $PLIST_PATH
10093

10194
# archive 这边使用的工作区间 也可以使用project
102-
xcodebuild archive -workspace "${APP_PATH}" -scheme "${TARGET_NAME}" -configuration "${CONFIGURATION}" -archivePath "${ARCHIVE_PATH}" -destination 'generic/platform=iOS'
95+
xcodebuild CODE_SIGN_STYLE="Manual" archive -workspace "${APP_PATH}" -scheme "${TARGET_NAME}" clean CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -configuration "${CONFIGURATION}" -archivePath "${ARCHIVE_PATH}" -destination 'generic/platform=iOS' -quiet || exit
96+
97+
cd ${WORKSPACE}
10398

104-
# 导出ipa
105-
xcodebuild -exportArchive -archivePath "${ARCHIVE_PATH}" -exportPath "${EXPORT_PATH}" -exportOptionsPlist "${PLIST_PATH}"
99+
# 压缩archive
100+
7za a -tzip "${TARGET_NAME}_${BUILD_NUMBER}.xcarchive.zip" "${ARCHIVE_PATH}"
101+
102+
# 签名
103+
# sh sign "${TARGET_NAME}_${BUILD_NUMBER}.xcarchive.zip" --type xcarchive --plist "${PLIST_PATH}"
104+
sh export "${TARGET_NAME}_${BUILD_NUMBER}.xcarchive.zip" --plist "${PLIST_PATH}"
106105

107106
# 上传IPA
108-
7za a "$WORKSPACE/${TARGET_NAME}_${BUILD_NUMBER}_IPA.zip" -r "${EXPORT_PATH}/${TARGET_NAME}.ipa"
107+
PAYLOAD_PATH="${TARGET_NAME}_${BUILD_NUMBER}_Payload"
108+
mkdir "${PAYLOAD_PATH}"
109+
# mv "${TARGET_NAME}_${BUILD_NUMBER}_iOS.ipa" "${PAYLOAD_PATH}"
110+
mv "${TARGET_NAME}_${BUILD_NUMBER}.ipa" "${PAYLOAD_PATH}"
109111

110-
# 删除IPA文件夹
111-
rm -rf "${EXPORT_PATH}"
112+
7za a "${TARGET_NAME}_${BUILD_NUMBER}_IPA.zip" -r "${PAYLOAD_PATH}"
113+
python3 artifactory_utils.py --action=upload_file --file="${TARGET_NAME}_${BUILD_NUMBER}_IPA.zip" --project
112114

113-
# rm -rf "${EXPORT_PATH}/${TARGET_NAME}.xcarchive"
114-
# rm -rf "${EXPORT_PATH}/Packaging.log"
115-
# rm -rf "${EXPORT_PATH}/ExportOptions.plist"
116-
# rm -rf "${EXPORT_PATH}/DistributionSummary.plist"
115+
# 删除IPA文件夹
116+
rm -rf ${TARGET_NAME}_${BUILD_NUMBER}.xcarchive
117+
rm -rf *.zip
118+
rm -rf ${PAYLOAD_PATH}
117119

118120
#复原Keycenter文件
119121
python3 /tmp/jenkins/api-examples/.github/ci/build/modify_ios_keycenter.py $KEYCENTER_PATH 1

.github/ci/build/build_mac.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ else
7171
echo "failed"
7272
exit 1
7373
fi
74-
cp -rf ./macOS/** ./$unzip_name/samples/APIExample
74+
cp -a ./macOS/** ./$unzip_name/samples/APIExample
7575
mv ./$unzip_name/samples/APIExample/sdk.podspec ./$unzip_name/
7676
python3 ./.github/ci/build/modify_podfile.py ./$unzip_name/samples/APIExample/Podfile
7777

.github/ci/build/build_mac_ipa.sh

+12-15
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ TARGET_NAME=${PROJECT_PATH##*/}
1717
KEYCENTER_PATH=${PROJECT_PATH}"/"${TARGET_NAME}"/Common/KeyCenter.swift"
1818

1919
# 打包环境
20-
CONFIGURATION=developer-id
20+
CONFIGURATION=Release
2121

2222
#工程文件路径
2323
APP_PATH="${PROJECT_PATH}/${TARGET_NAME}.xcworkspace"
@@ -69,12 +69,9 @@ xcodebuild clean -workspace "${APP_PATH}" -configuration "${CONFIGURATION}" -sch
6969
CURRENT_TIME=$(date "+%Y-%m-%d %H-%M-%S")
7070

7171
# 归档路径
72-
ARCHIVE_PATH="${PROJECT_PATH}/${TARGET_NAME} ${CURRENT_TIME}/${TARGET_NAME}.xcarchive"
72+
ARCHIVE_PATH="${WORKSPACE}/${TARGET_NAME}_${BUILD_NUMBER}.xcarchive"
7373
# 编译环境
7474

75-
# 导出路径
76-
EXPORT_PATH="${PROJECT_PATH}/${TARGET_NAME} ${CURRENT_TIME}"
77-
7875
# plist路径
7976
PLIST_PATH="${PROJECT_PATH}/ExportOptions.plist"
8077

@@ -83,20 +80,20 @@ echo PLIST_PATH: $PLIST_PATH
8380
# archive 这边使用的工作区间 也可以使用project
8481
xcodebuild archive -workspace "${APP_PATH}" -scheme "${TARGET_NAME}" -configuration "${CONFIGURATION}" -archivePath "${ARCHIVE_PATH}"
8582

86-
# 导出ipa
87-
xcodebuild -exportArchive -archivePath "${ARCHIVE_PATH}" -exportPath "${EXPORT_PATH}" -exportOptionsPlist "${PLIST_PATH}"
83+
cd ${WORKSPACE}
8884

89-
# 删除archive文件
90-
rm -rf "${EXPORT_PATH}/${TARGET_NAME}.xcarchive"
91-
rm -rf "${EXPORT_PATH}/Packaging.log"
92-
rm -rf "${EXPORT_PATH}/ExportOptions.plist"
93-
rm -rf "${EXPORT_PATH}/DistributionSummary.plist"
85+
# 压缩archive
86+
7za a -slp "${TARGET_NAME}_${BUILD_NUMBER}.xcarchive.zip" "${ARCHIVE_PATH}"
87+
88+
# 签名
89+
sh sign "${WORKSPACE}/${TARGET_NAME}_${BUILD_NUMBER}.xcarchive.zip" --type xcarchive --plist "${PLIST_PATH}" --application macApp
9490

9591
# 上传IPA
96-
7za a "$WORKSPACE/${TARGET_NAME}_Mac_${BUILD_NUMBER}_APP.zip" -r "${EXPORT_PATH}"
92+
python3 artifactory_utils.py --action=upload_file --file="${TARGET_NAME}_${BUILD_NUMBER}.app.zip" --project
9793

98-
# 删除IPA文件夹
99-
rm -rf "${EXPORT_PATH}"
94+
# 删除archive文件
95+
rm -rf ${TARGET_NAME}_${BUILD_NUMBER}.xcarchive
96+
rm -rf *.zip
10097

10198
#复原Keycenter文件
10299
python3 /tmp/jenkins/api-examples/.github/ci/build/modify_ios_keycenter.py $KEYCENTER_PATH 1

Android/APIExample-Audio/app/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ dependencies {
4848
implementation fileTree(dir: "${localSdkPath}", include: ['*.jar', '*.aar'])
4949
}
5050
else{
51-
def agora_sdk_version = "4.1.1"
51+
def agora_sdk_version = "4.2.0"
5252
// case 1: full single lib with voice only
5353
implementation "io.agora.rtc:voice-sdk:${agora_sdk_version}"
5454
// case 2: partial libs with voice only

Android/APIExample-Audio/app/src/main/java/io/agora/api/example/examples/advanced/VoiceEffects.java

+47-3
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,27 @@
2727
import static io.agora.rtc2.Constants.ULTRA_HIGH_QUALITY_VOICE;
2828
import static io.agora.rtc2.Constants.VOICE_BEAUTIFIER_OFF;
2929
import static io.agora.rtc2.Constants.VOICE_CHANGER_BASS;
30+
import static io.agora.rtc2.Constants.VOICE_CHANGER_CARTOON;
31+
import static io.agora.rtc2.Constants.VOICE_CHANGER_CHILDLIKE;
32+
import static io.agora.rtc2.Constants.VOICE_CHANGER_CHIPMUNK;
33+
import static io.agora.rtc2.Constants.VOICE_CHANGER_DARTH_VADER;
3034
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_BOY;
3135
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_GIRL;
3236
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_HULK;
3337
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_OLDMAN;
3438
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_PIGKING;
3539
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_SISTER;
3640
import static io.agora.rtc2.Constants.VOICE_CHANGER_EFFECT_UNCLE;
41+
import static io.agora.rtc2.Constants.VOICE_CHANGER_GIRLISH_MAN;
42+
import static io.agora.rtc2.Constants.VOICE_CHANGER_GROOT;
43+
import static io.agora.rtc2.Constants.VOICE_CHANGER_IRON_LADY;
44+
import static io.agora.rtc2.Constants.VOICE_CHANGER_MONSTER;
3745
import static io.agora.rtc2.Constants.VOICE_CHANGER_NEUTRAL;
46+
import static io.agora.rtc2.Constants.VOICE_CHANGER_PHONE_OPERATOR;
47+
import static io.agora.rtc2.Constants.VOICE_CHANGER_SHIN_CHAN;
3848
import static io.agora.rtc2.Constants.VOICE_CHANGER_SOLID;
3949
import static io.agora.rtc2.Constants.VOICE_CHANGER_SWEET;
50+
import static io.agora.rtc2.Constants.VOICE_CHANGER_TRANSFORMERS;
4051
import static io.agora.rtc2.Constants.VOICE_CONVERSION_OFF;
4152

4253
import android.content.Context;
@@ -97,7 +108,7 @@ public class VoiceEffects extends BaseFragment implements View.OnClickListener,
97108
chatBeautifier, timbreTransformation, voiceChanger, styleTransformation, roomAcoustics, pitchCorrection, _pitchModeOption, _pitchValueOption, voiceConversion,
98109
customBandFreq, customReverbKey;
99110
private ViewGroup _voice3DLayout, _pitchModeLayout, _pitchValueLayout;
100-
private SeekBar _voice3DCircle, customPitch, customBandGain, customReverbValue;
111+
private SeekBar _voice3DCircle, customPitch, customBandGain, customReverbValue, customVoiceFormant;
101112

102113
private AudioSeatManager audioSeatManager;
103114

@@ -159,10 +170,12 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
159170
customBandGain = view.findViewById(R.id.audio_custom_band_gain); // engine.setLocalVoiceEqualization()
160171
customReverbKey = view.findViewById(R.id.audio_custom_reverb_key);
161172
customReverbValue = view.findViewById(R.id.audio_custom_reverb_value); //engine.setLocalVoiceReverb()
173+
customVoiceFormant = view.findViewById(R.id.audio_voice_formant_value); //engine.setLocalVoiceFormant()
162174

163175
customPitch.setOnSeekBarChangeListener(this);
164176
customBandGain.setOnSeekBarChangeListener(this);
165177
customReverbValue.setOnSeekBarChangeListener(this);
178+
customVoiceFormant.setOnSeekBarChangeListener(this);
166179
customBandFreq.setOnItemSelectedListener(this);
167180
customReverbKey.setOnItemSelectedListener(this);
168181

@@ -194,6 +207,7 @@ private void resetControlLayoutByJoined() {
194207
customBandGain.setEnabled(joined);
195208
customReverbKey.setEnabled(joined);
196209
customReverbValue.setEnabled(joined);
210+
customVoiceFormant.setEnabled(joined);
197211

198212

199213
chatBeautifier.setSelection(0);
@@ -206,6 +220,7 @@ private void resetControlLayoutByJoined() {
206220
customPitch.setProgress(0);
207221
customBandGain.setProgress(0);
208222
customReverbValue.setProgress(0);
223+
customVoiceFormant.setProgress(50);
209224
}
210225

211226
@Override
@@ -407,8 +422,8 @@ private void joinChannel(String channelId) {
407422
private final IRtcEngineEventHandler iRtcEngineEventHandler = new IRtcEngineEventHandler() {
408423
/**
409424
* Error code description can be found at:
410-
* en: https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
411-
* cn: https://docs.agora.io/cn/voice-call-4.x/API%20Reference/java_ng/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
425+
* en: https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
426+
* cn: https://docs.agora.io/cn/video-call-4.x/API%20Reference/java_ng/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
412427
*/
413428
@Override
414429
public void onError(int err) {
@@ -617,6 +632,28 @@ private int getVoiceConversionValue(String label) {
617632
return VOICE_CHANGER_SOLID;
618633
case "VOICE_CHANGER_BASS":
619634
return VOICE_CHANGER_BASS;
635+
case "VOICE_CHANGER_CARTOON":
636+
return VOICE_CHANGER_CARTOON;
637+
case "VOICE_CHANGER_CHILDLIKE":
638+
return VOICE_CHANGER_CHILDLIKE;
639+
case "VOICE_CHANGER_PHONE_OPERATOR":
640+
return VOICE_CHANGER_PHONE_OPERATOR;
641+
case "VOICE_CHANGER_MONSTER":
642+
return VOICE_CHANGER_MONSTER;
643+
case "VOICE_CHANGER_TRANSFORMERS":
644+
return VOICE_CHANGER_TRANSFORMERS;
645+
case "VOICE_CHANGER_GROOT":
646+
return VOICE_CHANGER_GROOT;
647+
case "VOICE_CHANGER_DARTH_VADER":
648+
return VOICE_CHANGER_DARTH_VADER;
649+
case "VOICE_CHANGER_IRON_LADY":
650+
return VOICE_CHANGER_IRON_LADY;
651+
case "VOICE_CHANGER_SHIN_CHAN":
652+
return VOICE_CHANGER_SHIN_CHAN;
653+
case "VOICE_CHANGER_GIRLISH_MAN":
654+
return VOICE_CHANGER_GIRLISH_MAN;
655+
case "VOICE_CHANGER_CHIPMUNK":
656+
return VOICE_CHANGER_CHIPMUNK;
620657
case "VOICE_CONVERSION_OFF":
621658
default:
622659
return VOICE_CONVERSION_OFF;
@@ -743,6 +780,9 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
743780

744781
@Override
745782
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
783+
if (!fromUser) {
784+
return;
785+
}
746786
if(seekBar == _voice3DCircle){
747787
int cicle = (int) (1 + 59 * progress * 1.0f / seekBar.getMax());
748788
// [1,60], 10 default
@@ -771,6 +811,10 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
771811
value = (int) (100 * progress * 1.0f / seekBar.getMax());
772812
}
773813
engine.setLocalVoiceReverb(reverbKey, value);
814+
} else if (seekBar == customVoiceFormant) {
815+
// [-1, 1]
816+
double value = (progress - 50) * 1.0f / 100;
817+
engine.setLocalVoiceFormant(value);
774818
}
775819
}
776820

Android/APIExample-Audio/app/src/main/java/io/agora/api/example/examples/advanced/customaudio/CustomAudioRender.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ public void onClick(View v) {
236236
engine.leaveChannel();
237237
pulling = false;
238238
join.setText(getString(R.string.join));
239+
audioSeatManager.downAllSeats();
239240
if(pullingTask != null){
240241
try {
241242
pullingTask.join();
@@ -268,7 +269,7 @@ private void joinChannel(String channelId) {
268269
* 0: Success.
269270
* < 0: Failure.
270271
* PS: Ensure that you call this method before the joinChannel method.*/
271-
engine.setExternalAudioSource(true, SAMPLE_RATE, SAMPLE_NUM_OF_CHANNEL, 2, false, true);
272+
// engine.setExternalAudioSource(true, SAMPLE_RATE, SAMPLE_NUM_OF_CHANNEL, 2, false, true);
272273

273274

274275

@@ -303,9 +304,8 @@ private void joinChannel(String channelId) {
303304
private final IRtcEngineEventHandler iRtcEngineEventHandler = new IRtcEngineEventHandler() {
304305

305306
/**
306-
* Error code description can be found at:
307-
* en: https://api-ref.agora.io/en/voice-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
308-
* cn: https://docs.agora.io/cn/voice-call-4.x/API%20Reference/java_ng/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
307+
* en: https://api-ref.agora.io/en/video-sdk/android/4.x/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
308+
* cn: https://docs.agora.io/cn/video-call-4.x/API%20Reference/java_ng/API/class_irtcengineeventhandler.html#callback_irtcengineeventhandler_onerror
309309
*/
310310
@Override
311311
public void onError(int err) {

0 commit comments

Comments
 (0)