title: 视频通话

本篇文档介绍开发视频通话的主要环节,包括 创建视频通话管理其他参与者加入视频通话相关数据安全性

创建视频通话

创建视频通话包括配置和预览本地媒体流、发起视频通话。

配置和预览本地媒体流

本地媒体流( Local Stream )包括音频和视频,发起或加入会议前需要进行配置,成功加入一个会议后,该媒体流会发送给其他参与者。

例如,创建一个同时有音频和视频的本地媒体流并展示出来:

  1. //获取视频播放控件
  2. WilddogVideoView localView = (WilddogVideoView) findViewById(R.id.local_video_view);
  3. // 如果没有获得摄像头权限或无摄像头,则无法展示。
  4. LocalStreamOptions.Builder builder = new LocalStreamOptions.Builder();
  5. LocalStreamOptions options = builder.height(240).width(320).build();
  6. localStream = video.createLocalStream(options, new CompleteListener() {
  7. @Override
  8. public void onCompleted(VideoException e) {
  9. }
  10. });
  11. //为视频流绑定播放控件
  12. localStream.attach(localView);

展示视频流需要使用 WilddogVideoViewWilddogVideoViewLayout 两个控件,详细使用方法参见 API 文档。

发起视频通话

只有另一个 Client 接受了一方的邀请,通话才能建立成功。

注意:

视频通话使用实时数据库中的 /wilddogVideo 节点进行信令交互,为避免影响视频通话功能的使用,请勿操作该节点。

例如,发起一对一视频通话:

  1. //创建连接参数对象
  2. //localStream 为video.createLocalStream()获取的本地视频流
  3. //第二个参数为用户自定义的数据,类型为字符串,可以在邀请时传递自定义信息,例如传递邀请者姓名、会议主题等
  4. //对方在 IncomingInvite 回调中可以获取该数据
  5. ConnectOptions options = new ConnectOptions(localStream, <Your-Data>);
  6. //inviteToConversation 方法会返回一个OutgoingInvite对象,
  7. //通过OutgoingInvite对象可以进行取消邀请操作
  8. outgoingInvite = client.inviteToConversation(participant,options, new ConversationCallback() {
  9. @Override
  10. public void onConversation(Conversation conversation, VideoException exception) {
  11. if (conversation != null) {
  12. //对方接受邀请并成功建立视频通话,conversation不为空,exception为空
  13. mConversation = conversation;
  14. } else {
  15. //对方拒绝时,exception不为空
  16. }
  17. }
  18. });

管理其他参与者

管理其他参与者包括处理其他参与者的连接事件和播放其他参与者的媒体流。

处理其他参与者的连接事件

通过监听其他参与者加入或离开的事件,来获得其状态通知。

例如,打印加入、离开的日志:

  1. mConversation.setConversationListener(new Conversation.Listener() {
  2. @Override
  3. public void onParticipantConnected(Conversation conversation, Participant participant) {
  4. //监听参与者接受邀请并加入视频通话的事件
  5. Log.d(TAG, "onParticipantConnected :" + participant.getParticipantId());
  6. }
  7. @Override
  8. public void onParticipantDisconnected(Conversation conversation, Participant participant) {
  9. //监听参与者离开事件
  10. Log.d(TAG, "onParticipantDisconnected :" + participant.getParticipantId());
  11. mConversation.disconnect();
  12. }
  13. });

播放其他参与者的媒体流

通过展示其他参与者的视频流来观看其视频画面。

例如,当监听到参与者加入视频通话时展示参与者的媒体流:

  1. //在参与者加入时获得到加入的参与者,并设置监听
  2. participant.setListener(new Participant.Listener() {
  3. @Override
  4. public void onStreamAdded(RemoteStream remoteStream) {
  5. //其他客户端的媒体流可用,播放其他客户端的媒体流
  6. remoteStream.attach(remoteView);
  7. }
  8. @Override
  9. public void onStreamRemoved(RemoteStream remoteStream) {
  10. }
  11. @Override
  12. public void onError(VideoException e) {
  13. }
  14. });

加入视频通话相关

视频通话相关操作包括接受或拒绝邀请、离开视频通话。

接受或拒绝邀请

初始化 Client 之后,监听邀请事件接收另一个 Client 发起的邀请,收到邀请后可以选择接受或拒绝邀请。

例如,收到邀请后,接受邀请:

  1. this.client.setInviteListener(new WilddogVideoClient.Listener() {
  2. @Override
  3. public void onIncomingInvite(WilddogVideoClient wilddogVideoClient, IncomingInvite incomingInvite) {
  4. //获取邀请者发送的自定义信息
  5. String userData = incomingInvite.getUserData();
  6. //收到邀请,接受视频通话发起者的邀请
  7. ConnectOptions connectOptions = new ConnectOptions(localStream, "");
  8. incomingInvite.accept(connectOptions, new ConversationCallback() {
  9. @Override
  10. public void onConversation(@Nullable Conversation conversation, @Nullable VideoException e) {
  11. }
  12. });
  13. }
  14. @Override
  15. public void onIncomingInviteCanceled(WilddogVideoClient wilddogVideoClient, IncomingInvite incomingInvite) {
  16. //视频通话发起者取消了邀请
  17. }
  18. });

离开视频通话

离开一个正在进行的视频通话并释放媒体资源。可以直接释放媒体资源或通过监听离开通话事件在成功离开通话后释放媒体资源。

例如,断开视频通话并释放不使用的资源:

  1. @Override
  2. protected void onDestroy() {
  3. super.onDestroy();
  4. //需要离开视频通话时调用此方法,并做资源释放和其他自定义操作
  5. localStream.detach();
  6. localStream.close();
  7. if (localView != null) {
  8. localView.release();
  9. localView = null;
  10. }
  11. if (remoteView != null) {
  12. remoteView.release();
  13. remoteView = null;
  14. }
  15. if (mConversation != null) {
  16. mConversation.disconnect();
  17. }
  18. client.dispose();
  19. video.dispose();
  20. }

使用获取原始视频流接口

LocalStream 中可以通过调用 setOnFrameListener() 方法来获取原始的视频流帧数据。 在回调方法 onByteFrame 中获取的帧数据为 NY21 格式的 byte 数组。 注意,此数组为原始帧数据的引用,修改此数组会对视频流的数据产生影响(展示和传输的数据会被同时修改)。

  1. localStream.setOnFrameListener(new WilddogVideo.CameraFrameListener() {
  2. @Override
  3. public void onByteFrame(byte[] bytes, int width, int height) {
  4. //Log.e(TAG, "onByteFrame ");
  5. }
  6. });

使用统计接口

Conversation 对象提供了视频通话统计功能,可以在通话过程中获取到通话的统计信息。 主要统计信息请查看 LocalStatsRemoteStats 说明。 通过在的 Converstion 实例中调用 setRTCStatsListener() 方法,在 onLocalStats 方法中返回本地的统计信息,在 onRemoteStats 方法中返回对端参与者的统计信息。 统计信息的获取需要等待连接正式建立完毕,会有一定时间的延迟(秒级),开始统计后,会以 2 秒为周期不间断回调上述方法。

  1. mConversation.setRTCStatsListener(new RTCStatsListener() {
  2. @Override
  3. public void onLocalStats(LocalStats localStats) {
  4. //返回本地统计信息
  5. }
  6. @Override
  7. public void onRemoteStats(RemoteStats remoteStats) {
  8. //返回对端参与者统计信息
  9. }
  10. });