Skip to content

Commit cb32de3

Browse files
committed
Merge branch 'dev/3.8.202' of github.com:AgoraIO/API-Examples into dev/3.8.202
2 parents 836b45a + 9fb3d50 commit cb32de3

12 files changed

Lines changed: 417 additions & 57 deletions

File tree

Android/APIExample/app/src/main/java/io/agora/api/example/examples/advanced/CDNStreaming/HostFragment.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.agora.api.example.examples.advanced.CDNStreaming;
22

3+
import static io.agora.rtc2.Constants.CLIENT_ROLE_BROADCASTER;
4+
import static io.agora.rtc2.Constants.RENDER_MODE_HIDDEN;
5+
import static io.agora.rtc2.video.VideoEncoderConfiguration.STANDARD_BITRATE;
6+
37
import android.content.Context;
48
import android.os.Bundle;
59
import android.util.Log;
@@ -12,16 +16,12 @@
1216
import android.widget.CompoundButton;
1317
import android.widget.FrameLayout;
1418
import android.widget.LinearLayout;
15-
import android.widget.RadioGroup;
1619
import android.widget.SeekBar;
17-
import android.widget.Spinner;
1820
import android.widget.Switch;
1921

2022
import androidx.annotation.NonNull;
2123
import androidx.annotation.Nullable;
2224

23-
import java.util.ArrayList;
24-
import java.util.List;
2525
import java.util.Map;
2626
import java.util.concurrent.ConcurrentHashMap;
2727

@@ -43,10 +43,6 @@
4343
import io.agora.rtc2.video.VideoCanvas;
4444
import io.agora.rtc2.video.VideoEncoderConfiguration;
4545

46-
import static io.agora.rtc2.Constants.CLIENT_ROLE_BROADCASTER;
47-
import static io.agora.rtc2.Constants.RENDER_MODE_HIDDEN;
48-
import static io.agora.rtc2.video.VideoEncoderConfiguration.STANDARD_BITRATE;
49-
5046
public class HostFragment extends BaseFragment {
5147
private static final String TAG = HostFragment.class.getSimpleName();
5248
private static final String AGORA_CHANNEL_PREFIX = "rtmp://mdetest.push.agoramde.agoraio.cn/live/";
@@ -200,7 +196,7 @@ private void stopStreaming(){
200196
@Override
201197
public void onClick(View view) {
202198
if (rtcStreaming){
203-
engine.removePublishStreamUrl(getUrl());
199+
engine.stopRtmpStream(getUrl());
204200
engine.leaveChannel();
205201
stopStreaming();
206202
}
@@ -460,8 +456,7 @@ public void run() {
460456
if (ret != 0) {
461457
showLongToast(String.format("Join Channel call failed! reason:%d", ret));
462458
}
463-
engine.setLiveTranscoding(liveTranscoding);
464-
engine.addPublishStreamUrl(getUrl(), true);
459+
engine.startRtmpStreamWithTranscoding(getUrl(), liveTranscoding);
465460
}
466461
else{
467462
streamingButton.setText(getString(R.string.start_live_streaming));
@@ -509,7 +504,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
509504
if (rtcStreaming) {
510505
engine.stopDirectCdnStreaming();
511506
} else if(cdnStreaming){
512-
engine.removePublishStreamUrl(getUrl());
507+
engine.stopRtmpStream(getUrl());
513508
}
514509
handler.post(new Runnable() {
515510
@Override

Android/APIExample/app/src/main/java/io/agora/api/example/examples/advanced/SwitchCameraScreenShare.java

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package io.agora.api.example.examples.advanced;
22

3+
import static android.app.Activity.RESULT_OK;
4+
import static io.agora.api.example.common.model.Examples.ADVANCED;
5+
import static io.agora.rtc2.video.VideoCanvas.RENDER_MODE_HIDDEN;
6+
import static io.agora.rtc2.video.VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15;
7+
import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_ADAPTIVE;
8+
import static io.agora.rtc2.video.VideoEncoderConfiguration.STANDARD_BITRATE;
9+
import static io.agora.rtc2.video.VideoEncoderConfiguration.VD_640x360;
10+
311
import android.app.Notification;
412
import android.app.NotificationChannel;
513
import android.app.NotificationManager;
@@ -17,14 +25,12 @@
1725
import android.util.Log;
1826
import android.view.LayoutInflater;
1927
import android.view.SurfaceView;
20-
import android.view.TextureView;
2128
import android.view.View;
2229
import android.view.ViewGroup;
2330
import android.widget.Button;
2431
import android.widget.CompoundButton;
2532
import android.widget.EditText;
2633
import android.widget.FrameLayout;
27-
import android.widget.RelativeLayout;
2834
import android.widget.Switch;
2935

3036
import androidx.annotation.NonNull;
@@ -35,6 +41,8 @@
3541
import com.yanzhenjie.permission.AndPermission;
3642
import com.yanzhenjie.permission.runtime.Permission;
3743

44+
import java.util.Random;
45+
3846
import io.agora.api.example.R;
3947
import io.agora.api.example.annotation.Example;
4048
import io.agora.api.example.common.BaseFragment;
@@ -50,19 +58,6 @@
5058
import io.agora.rtc2.video.VideoCanvas;
5159
import io.agora.rtc2.video.VideoEncoderConfiguration;
5260

53-
import java.util.Random;
54-
55-
import static android.app.Activity.RESULT_OK;
56-
import static io.agora.api.example.common.Constant.TEXTUREVIEW;
57-
import static io.agora.api.example.common.model.Examples.ADVANCED;
58-
import static io.agora.rtc2.Constants.REMOTE_VIDEO_STATE_STARTING;
59-
import static io.agora.rtc2.video.VideoCanvas.RENDER_MODE_FIT;
60-
import static io.agora.rtc2.video.VideoCanvas.RENDER_MODE_HIDDEN;
61-
import static io.agora.rtc2.video.VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15;
62-
import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_ADAPTIVE;
63-
import static io.agora.rtc2.video.VideoEncoderConfiguration.STANDARD_BITRATE;
64-
import static io.agora.rtc2.video.VideoEncoderConfiguration.VD_640x360;
65-
6661
/**
6762
* This example demonstrates how video can be flexibly switched between the camera stream and the
6863
* screen share stream during an audio-video call.
@@ -80,7 +75,7 @@ public class SwitchCameraScreenShare extends BaseFragment implements View.OnClic
8075
private static final int DEFAULT_SHARE_FRAME_RATE = 15;
8176
private FrameLayout fl_camera, fl_screen;
8277
private Button join;
83-
private Switch camera, screenShare;
78+
private Switch camera, screenShare, screenSharePreview;
8479
private EditText et_channel;
8580
private int myUid, remoteUid = -1;
8681
private boolean joined = false;
@@ -104,12 +99,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
10499
join = view.findViewById(R.id.btn_join);
105100
camera = view.findViewById(R.id.camera);
106101
screenShare = view.findViewById(R.id.screenShare);
102+
screenSharePreview = view.findViewById(R.id.screenSharePreview);
107103
et_channel = view.findViewById(R.id.et_channel);
108104
fl_camera = view.findViewById(R.id.fl_camera);
109105
fl_screen = view.findViewById(R.id.fl_screenshare);
110106
join.setOnClickListener(this);
111107
camera.setOnCheckedChangeListener(this);
112108
screenShare.setOnCheckedChangeListener(this);
109+
screenSharePreview.setOnCheckedChangeListener(this);
113110
}
114111

115112
@Override
@@ -175,9 +172,11 @@ public void onDestroy() {
175172
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
176173
getActivity().stopService(fgServiceIntent);
177174
}
178-
TEXTUREVIEW = null;
179175
/**leaveChannel and Destroy the RtcEngine instance*/
180176
if (engine != null) {
177+
if(camera.isChecked()){
178+
engine.leaveChannelEx(rtcConnection2);
179+
}
181180
engine.leaveChannel();
182181
engine.stopPreview();
183182
}
@@ -206,11 +205,11 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
206205
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
207206
getActivity().stopService(fgServiceIntent);
208207
}
209-
}
210-
handler.postDelayed(() -> {
211-
options.publishScreenTrack = b;
208+
options.publishScreenTrack = false;
212209
engine.updateChannelMediaOptions(options);
213-
}, 1000);
210+
}
211+
screenSharePreview.setEnabled(b);
212+
screenSharePreview.setChecked(b);
214213
} else {
215214
showAlert(getString(R.string.lowversiontip));
216215
}
@@ -233,7 +232,15 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
233232
}
234233
else{
235234
engine.leaveChannelEx(rtcConnection2);
235+
engine.startPreview(Constants.VideoSourceType.VIDEO_SOURCE_CAMERA_PRIMARY);
236236
}
237+
}else if (compoundButton.getId() == R.id.screenSharePreview) {
238+
if(b){
239+
addScreenSharePreview();
240+
}else{
241+
fl_screen.removeAllViews();
242+
engine.stopPreview(Constants.VideoSourceType.VIDEO_SOURCE_SCREEN_PRIMARY);
243+
}
237244
}
238245
}
239246

@@ -242,8 +249,6 @@ public void onClick(View v) {
242249
if (v.getId() == R.id.btn_join) {
243250
if (!joined) {
244251
CommonUtil.hideInputBoard(getActivity(), et_channel);
245-
/**Instantiate the view ready to display the local preview screen*/
246-
TEXTUREVIEW = new TextureView(getContext());
247252
// call when join button hit
248253
String channelId = et_channel.getText().toString();
249254
// Check permission
@@ -266,9 +271,23 @@ public void onClick(View v) {
266271
join.setText(getString(R.string.join));
267272
camera.setEnabled(false);
268273
screenShare.setEnabled(false);
274+
screenSharePreview.setEnabled(false);
269275
fl_camera.removeAllViews();
270276
fl_screen.removeAllViews();
271-
engine.stopPreview();
277+
278+
if (camera.isChecked()) {
279+
engine.leaveChannelEx(rtcConnection2);
280+
camera.setChecked(false);
281+
}
282+
if(screenSharePreview.isChecked()){
283+
engine.stopPreview(Constants.VideoSourceType.VIDEO_SOURCE_SCREEN_PRIMARY);
284+
screenSharePreview.setChecked(false);
285+
}
286+
if(screenShare.isChecked()){
287+
engine.stopScreenCapture();
288+
screenShare.setChecked(false);
289+
}
290+
engine.stopPreview(Constants.VideoSourceType.VIDEO_SOURCE_CAMERA_PRIMARY);
272291
/**After joining a channel, the user must call the leaveChannel method to end the
273292
* call before joining another channel. This method returns 0 if the user leaves the
274293
* channel and releases all resources related to the call. This method call is
@@ -287,7 +306,8 @@ public void onClick(View v) {
287306
* 2:If you call the leaveChannel method during CDN live streaming, the SDK
288307
* triggers the removeInjectStreamUrl method.*/
289308
engine.leaveChannel();
290-
TEXTUREVIEW = null;
309+
310+
//requireActivity().finish();
291311
}
292312
}
293313
}
@@ -307,8 +327,11 @@ private void addScreenSharePreview() {
307327
// Add to the local container
308328
fl_screen.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
309329
// Setup local video to render your local camera preview
310-
engine.setupLocalVideo(new VideoCanvas(surfaceView, Constants.RENDER_MODE_FIT, Constants.VIDEO_MIRROR_MODE_DISABLED, Constants.VIDEO_SOURCE_SCREEN_PRIMARY, 0));
311-
engine.startPreview();
330+
engine.setupLocalVideo(new VideoCanvas(surfaceView, Constants.RENDER_MODE_FIT,
331+
Constants.VIDEO_MIRROR_MODE_DISABLED,
332+
Constants.VIDEO_SOURCE_SCREEN_PRIMARY,
333+
0));
334+
engine.startPreview(Constants.VideoSourceType.VIDEO_SOURCE_SCREEN_PRIMARY);
312335
}
313336

314337
private void addCameraPreview() {
@@ -326,27 +349,31 @@ private void addCameraPreview() {
326349
// Add to the local container
327350
fl_camera.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
328351
// Setup local video to render your local camera preview
329-
engine.setupLocalVideo(new VideoCanvas(surfaceView, RENDER_MODE_HIDDEN, 0));
330-
// engine.startPreview();
352+
engine.setupLocalVideo(new VideoCanvas(
353+
surfaceView,
354+
RENDER_MODE_HIDDEN,
355+
Constants.VIDEO_MIRROR_MODE_AUTO,
356+
Constants.VIDEO_SOURCE_CAMERA_PRIMARY,
357+
0));
358+
engine.startPreview(Constants.VideoSourceType.VIDEO_SOURCE_CAMERA_PRIMARY);
331359
}
332360

333361
private void joinChannel(String channelId) {
334362
engine.setParameters("{\"che.video.mobile_1080p\":true}");
335363
engine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER);
336364
// set options
365+
options = new ChannelMediaOptions();
337366
options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER;
338367
options.autoSubscribeVideo = true;
339368
options.autoSubscribeAudio = true;
340369
options.publishCameraTrack = false;
341-
options.publishScreenTrack = true;
370+
options.publishScreenTrack = false;
342371
options.publishAudioTrack = false;
343372
options.enableAudioRecordingOrPlayout = false;
344373
options.publishEncodedVideoTrack = false;
345374

346375
/**Enable video module*/
347376
engine.enableVideo();
348-
// start preview
349-
engine.startPreview();
350377
// Setup video encoding configs
351378
engine.setVideoEncoderConfiguration(new VideoEncoderConfiguration(
352379
VD_640x360,
@@ -380,7 +407,6 @@ private void joinChannel(String channelId) {
380407
// Prevent repeated entry
381408
join.setEnabled(false);
382409
addCameraPreview();
383-
engine.startPreview();
384410
}
385411

386412
/**

Android/APIExample/app/src/main/res/layout/fragment_switch_camera_screenshare.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,23 @@
5151
</LinearLayout>
5252

5353
<Switch
54-
android:id="@+id/screenShare"
54+
android:id="@+id/screenSharePreview"
5555
android:layout_width="wrap_content"
5656
android:layout_height="wrap_content"
5757
android:layout_above="@id/ll_join"
5858
android:layout_alignParentEnd="true"
5959
android:layout_marginBottom="24dp"
6060
android:enabled="false"
61+
android:text="@string/screen_share_preview" />
62+
63+
<Switch
64+
android:id="@+id/screenShare"
65+
android:layout_width="wrap_content"
66+
android:layout_height="wrap_content"
67+
android:layout_above="@id/ll_join"
68+
android:layout_marginBottom="24dp"
69+
android:layout_toLeftOf="@id/screenSharePreview"
70+
android:enabled="false"
6171
android:text="@string/screen_share" />
6272

6373
<Switch

Android/APIExample/app/src/main/res/values-zh/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
<string name="writeback">音频回写</string>
151151
<string name="snapshot">截图</string>
152152
<string name="screen_share">屏幕共享</string>
153+
<string name="screen_share_preview">屏幕共享本地预览</string>
153154
<string name="spatial_sound">此示例演示了如何使用空间音效。</string>
154155
<string name="mix_control">混音控制</string>
155156
<string name="start">开始</string>

Android/APIExample/app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
<string name="spatial_sound">This example shows how to use spaital sound</string>
156156
<string name="snapshot">Snapshot</string>
157157
<string name="screen_share">Screen Share</string>
158+
<string name="screen_share_preview">Screen Share Preview</string>
158159
<string name="mix_control">Audio Mixing Control</string>
159160
<string name="start">Start</string>
160161
<string name="click_start">Start</string>

iOS/APIExample/Examples/Advanced/ContentInspect/ContentInspect.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ class ContentInspectViewController: BaseViewController {
2727
// MARK: - LifeCycle
2828
override func viewDidLoad() {
2929
super.viewDidLoad()
30-
self.setupUI()
30+
setupUI()
3131

3232
guard let channelId = configs["channelName"] as? String else {return}
3333

3434
agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: KeyCenter.AppId, delegate: self)
3535
agoraKit.enableVideo()
3636

3737
let videoCanvas = AgoraRtcVideoCanvas()
38-
videoCanvas.view = self.localVideoView
38+
videoCanvas.view = localVideoView
3939
videoCanvas.renderMode = .hidden
4040
agoraKit.setupLocalVideo(videoCanvas)
4141

@@ -55,7 +55,7 @@ class ContentInspectViewController: BaseViewController {
5555
let result = agoraKit.joinChannel(byToken: KeyCenter.Token, channelId: channelId, uid: 0, mediaOptions: options)
5656
if result != 0 {
5757
/// Error code description: https://docs.agora.io/en/Interactive%20Broadcast/error_rtc
58-
self.showAlert(title: "Error", message: "Join channel failed with errorCode: \(result)")
58+
showAlert(title: "Error", message: "Join channel failed with errorCode: \(result)")
5959
}
6060
}
6161

@@ -102,7 +102,7 @@ extension ContentInspectViewController: AgoraRtcEngineDelegate {
102102
func rtcEngine(_ engine: AgoraRtcEngineKit, didOccurError errorCode: AgoraErrorCode) {
103103
/// Error code description: https://docs.agora.io/en/Interactive%20Broadcast/error_rtc
104104
LogUtils.log(message: "Error occur: \(errorCode)", level: .error)
105-
self.showAlert(title: "Error", message: "Error: \(errorCode.description)")
105+
showAlert(title: "Error", message: "Error: \(errorCode.description)")
106106
}
107107

108108
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinChannel channel: String, withUid uid: UInt, elapsed: Int) {

0 commit comments

Comments
 (0)