本文介绍如何 实现一个音视频直播, 视频直播的 API 调用时序见下图:
实现一个音视频直播
实现一个音视频直播, 我们推荐你添加如下 UI 元素:
你也可以参考 DEMO 示例项目的 layout 文件中的代码。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" android:gravity="bottom" android:orientation="vertical" tools:context=".VideoActivity"> <LinearLayout android:id="@+id/video_big_ll" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"/> <LinearLayout android:id="@+id/video_small_ll" android:layout_width="120dp" android:layout_height="180dp" android:layout_gravity="right" android:orientation="vertical"/> <Button android:id="@+id/exit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="exit"/> </FrameLayout>
Activity
import org.brtc.sdk.BRTC; import org.brtc.sdk.BRTCCanvas; import org.brtc.sdk.BRTCEventHandler; import org.brtc.sdk.Constant; import org.brtc.sdk.model.input.BRTCSendAudioConfig; import org.brtc.sdk.model.input.BRTCSendVideoConfig; import org.brtc.sdk.model.BRTCUser; import org.brtc.sdk.model.input.BRTCCanvasConfig; import org.brtc.sdk.model.input.BRTCConfig;
private static final int REQUEST_PERMISSION_CODE = 0x293; /** * 检查是否拥有权限 */ public static boolean hasPermission(Context context, String perm) { if (Build.VERSION.SDK_INT >= 23) { if (context.getApplicationContext().checkSelfPermission(perm) != PackageManager.PERMISSION_DENIED) { return true; } return false; } return true; } @NonNull private static synchronized String[] getManifestPermissions(@NonNull final Activity activity) { PackageInfo packageInfo = null; List<String> list = new ArrayList<>(1); try { Log.d("PermissionUtils", activity.getPackageName()); packageInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager .GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { Log.e("PermissionUtils", "A problem occurred when retrieving permissions", e); } if (packageInfo != null) { String[] permissions = packageInfo.requestedPermissions; if (permissions != null) { for (String perm : permissions) { list.add(perm); } } } return list.toArray(new String[list.size()]); } /** * 批量申请权限(如果当前没有权限的话)。授权结果在onRequestPermissionsResult中异步处理 */ public static void requestPermissionsIfNeed(Activity activity) { String[] perms = getManifestPermissions(activity); if ((perms.length == 0)) { return; } List<String> needPerms = new ArrayList<>(); for (String perm : perms) { if (!hasPermission(activity, perm)) { needPerms.add(perm); } } if (needPerms.size() == 0) { return; } if (Build.VERSION.SDK_INT >= 23) { activity.requestPermissions(needPerms.toArray(new String[0]), REQUEST_PERMISSION_CODE); } }
private final BRTCEventHandler brtcEventHandler = new BRTCEventHandler() { @Override public void onJoinedRoom(String roomId, int uid, BRTCRoomInfo info) { d("Debug", "VideoActivity.onJoinedRoom(): 已经加入房间"); } @Override public void onUserJoined(String roomId, int uid) { d("Debug", "onUserJoined(): 用户" + uid + "加入房间"); } @Override public void onUserLeave(String roomId, int uid, Constant.BRTCUserOfflineReason reason) { d("Debug", "onUserLeave(): 用户" + uid + "离开房间"); } @Override public void onUserAudioAvailable(int uid, boolean available) { d("Debug", "onUserAudioAvailable(): [uid, available] " + uid + " " + available); } @Override public void onUserVideoAvailable(int uid, boolean available) { d("Debug", "onUserVideoAvailable(): [uid, available] " + uid + " " + available); } @Override public void onError(int errorCode) { d("Debug", "onError(): errorCode:" + errorCode); } @Override public void onConnectionChangedToState(int state) { d("Debug", "onConnectionChangedToState(): [state] " + state); } };
调用BRTC的静态方法 sharedInstance,即可初始化 BRTC 对象, 初始化成功后,注册回调
private BRTC brtcClient; brtcClient = BRTC.sharedInstance(); //初始化 brtcClient.setEventHandler(brtcEventHandler); //注册回调
string.xml
BRTC_app_id
BRTC_sig
BRTCConfig brtcConfig = new BRTCConfig(getString(R.string.BRTC_app_id),roomId,new BRTCUser(localUid),getString(R.string.BRTC_sig),getApplicationContext()); brtcClient.joinRoom(brtcConfig); //加入房间
private BRTCCanvas smallCanvas; @Override public void onJoinedRoom(String roomId, int uid, BRTCRoomInfo info) { d("Debug", "onJoinedRoom(): 已经加入房间"); brtcClient.setVideoEncoderConfiguration(new BRTCSendVideoConfig()); brtcClient.setAudioEncoderConfiguration(new BRTCSendAudioConfig()); brtcClient.enableLocalAudio(true); //创建本地的渲染画布 smallCanvas = brtcClient.createCanvas(getApplicationContext()); brtcClient.startLocalPreview(smallCanvas); brtcClient.muteLocalVideoStream(false); brtcClient.muteLocalAudioStream(false); }
//创建远端的渲染画布 private BRTCCanvas bigCanvas; @Override public void onUserJoined(String roomId, int uid) { d("Debug", "onUserJoined(): 用户" + uid + "加入房间"); //创建远端的渲染画布 bigCanvas = brtcClient.createCanvas(getApplicationContext()); brtcClient.startRemoteView(uid, bigCanvas); } @Override public void onUserAudioAvailable(int uid, boolean available) { d("Debug", "VideoActivity.onUserAudioAvailable(): [uid, available] " + uid + " " + available); brtcClient.muteRemoteAudioStream(uid, !available); } @Override public void onUserVideoAvailable(int uid, boolean available) { d("Debug", "VideoActivity.onUserVideoAvailable(): [uid, available] " + uid + " " + available); brtcClient.muteRemoteVideoStream(uid, !available); }
[#停止发送本地音视频流#]
//停止发送本地音频流 brtcClient.muteLocalAudioStream(true); //停止发送本地视频流 brtcClient.muteLocalVideoStream(true);
[#切换前后摄像头#]
public void onSwitchCameraClicked(View view) { brtcClient.switchCamera(); }
[#停止接收远端音视频流#]
//停止接收远端音频流 brtcClient.muteRemoteAudioStream(remoteUid, true); //停止接收远端视频流 brtcClient.muteRemoteVideoStream(remoteUid, true);
private void leaveroom() { // 离开当前频道。 brtcClient.leaveRoom(); // 销毁BRTC对象 brtcClient.destroy(); // 离开该界面 super.onBackPressed(); }
实现一个音视频直播
本文介绍如何
实现一个音视频直播
, 视频直播的 API 调用时序见下图:开发环境要求
创建用户界面
实现一个音视频直播
, 我们推荐你添加如下 UI 元素:你也可以参考 DEMO 示例项目的 layout 文件中的代码。
创建 UI 示例
导入类
Activity
文件中添加如下行:获取设备权限
Activity
时检查并获取 Android 移动设备的摄像头和麦克风使用权限初始化 BRTC 对象
调用BRTC的静态方法 sharedInstance,即可初始化 BRTC 对象, 初始化成功后,注册回调
加入房间
string.xml
文件中的BRTC_app_id
一栏string.xml
文件中的BRTC_sig
一栏, 创建一个 BRTCConfig 对象,可以调用 joinRoom 加入房间推送本地音视频
接收远端音视频
更多步骤
[#停止发送本地音视频流#]
[#切换前后摄像头#]
[#停止接收远端音视频流#]
离开房间
运行项目