一、前提条件

在实现Java直播前,请确保:

  • 已在项目中集成 ZEGO Express SDK,详情请参考 快速开始 - 集成。
  • 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 - 项目管理。

二、实现流程

本文所介绍的Java直播实现流程,是基于ZEGO Express SDK 来实现的,以下是API调用时序图:

1、创建引擎

1)创建界面(可选)

在开始之前,推荐开发者添加以下界面元素,方便实现基本的实时音视频功能。

  • 本地预览窗口
  • 远端视频窗口
  • 结束按钮

2)创建引擎

定义 SDK 引擎对象,调用 createEngine 接口,将申请到的 AppID 和 AppSign 传入参数 “appID” 和 “appSign”,创建引擎单例对象。

如果需要注册回调代理,可将实现了 IZegoEventHandler 的对象传入参数 “eventHandler”。如果不需要注册回调代理,可将 “null” 传入参数 “eventHandler”,创建引擎后仍需要注册回调时可通过调用 setEventHandler 接口设置回调代理。

/** 定义 SDK 引擎对象 */
ZegoExpressEngine engine;
/** 填写 appID 和 appSign */
long appID = ;  /** 请通过官网注册获取,格式为 123456789L */
String appSign = ;  /** 64个字符,请通过官网注册获取,格式为"0123456789012345678901234567890123456789012345678901234567890123" */
/** 创建引擎,使用测试环境,通用场景接入 */
engine = ZegoExpressEngine.createEngine(appID, appSign, true, ZegoScenario.GENERAL, getApplication(), null);  

2、登录房间

1)登录

传入用户 ID 参数 “userID” 创建 ZegoUser 用户对象后,调用 loginRoom 接口,传入房间 ID 参数 “roomID” 和用户参数 “user”,登录房间。

需要注意的是:

  • 同一个 AppID 内,需保证 “roomID” 全局唯一。
  • 同一个 AppID 内,需保证 “userID” 全局唯一,建议开发者将其设置成一个有意义的值,可将 “userID” 与自己业务账号系统进行关联。
  • ZegoUser 的构造方法 public ZegoUser(String userID) 会将 “userName” 设为与传的参数 “userID” 一样。“userID” 与 “userName” 不能为 “null” 否则会导致登录房间失败。
 /** 创建用户 */
ZegoUser user = new ZegoUser("user1");
/** 开始登录房间 */
engine.loginRoom("room1", user);   

2)监听事件回调(可选)

根据实际应用需要,在登录房间后监听想要关注的事件通知,比如房间状态更新、用户状态更新、流状态更新等。

  • onRoomStateUpdate:房间状态更新回调,登录房间后,当房间连接状态发生变更(如出现房间断开,登录认证失败等情况),SDK 会通过该回调通知。
  • onRoomUserUpdate:用户状态更新回调,登录房间后,当房间内有用户新增或删除时,SDK 会通过该回调通知。
  • onRoomStreamUpdate:流状态更新回调,登录房间后,当房间内有用户新推送或删除音视频流时,SDK 会通过该回调通知。
engine.setEventHandler(new IZegoEventHandler() {/** 以下为常用的房间相关回调 *//** 房间状态更新回调 */@Overridepublic void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {/** 根据需要实现事件回调 */}/** 用户状态更新回调 */@Overridepublic void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoUser> userList) {/** 根据需要实现事件回调 */}/** 流状态更新回调 */@Overridepublic void onRoomStreamUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoStream> streamList, JSONObject extendedData){/** 根据需要实现事件回调 */}
});

3、推流

1)开始推流

调用 startPublishingStream 接口,传入流 ID 参数 “streamID”,向远端用户发送本端的音视频流。

需要注意的是:同一个 AppID 内,需保证 “streamID” 全局唯一。如果同一个 AppID 内,不同用户各推了一条 “streamID” 相同的流,会导致后推流的用户推流失败。

/** 开始推流 */
engine.startPublishingStream("stream1");

2)启用本地预览(可选)

如果希望看到本端的画面,可调用 startPreview 接口设置预览视图,并启动本地预览。

/***  启动预览,设置本地预览视图,视图模式采用 SDK 默认的模式,等比缩放填充整个 View*  如下 preview_view 为 UI 界面上的 SurfaceView/TextureView/SurfaceTexture 对象*/
engine.startPreview(new ZegoCanvas(preview_view));

3)监听事件回调(可选)

根据实际应用需要,在推流后监听想要关注的事件通知,比如推流状态更新等。

onPublisherStateUpdate:推流状态更新回调,调用推流接口成功后,当推流状态发生变更,如出现网络中断导致推流异常等情况,SDK 在重试推流的同时,会通过该回调通知。

engine.setEventHandler(new IZegoEventHandler() {/** 常用的推流相关回调 *//** 推流状态更新回调 */@Overridepublic void onPublisherStateUpdate(String streamID, ZegoPublisherState state, int errorCode, JSONObject extendedData){/** 根据需要实现事件回调 */}
});

4、拉流

1)开始拉流

调用 startPlayingStream 接口,根据传入的流 ID 参数 “streamID”,拉取远端推送的音视频流。

远端用户推送的 “streamID” 可以从 IZegoEventHandler 代理中的 onRoomStreamUpdate 回调中获得。

支持以下类型的控件进行拉流播放:SurfaceView、TextureView 和 SurfaceTexture。

/***  开始拉流,设置远端拉流渲染视图,视图模式采用 SDK 默认的模式,等比缩放填充整个 View*  如下 play_view 为 UI 界面上的 SurfaceView/TextureView/SurfaceTexture 对象*/
engine.startPlayingStream("stream1", new ZegoCanvas(play_view));

2)监听事件回调(可选)

根据实际应用需要,在拉流后监听想要关注的事件通知,比如拉流状态更新等。

onPlayerStateUpdate:拉流状态更新回调,调用拉流接口成功后,当拉流状态发生变更,如出现网络中断导致推流异常等情况,SDK 在重试拉流的同时,会通过该回调通知。

engine.setEventHandler(new IZegoEventHandler() {/** 常用的拉流相关回调 *//** 拉流状态相关回调 */@Overridepublic void onPlayerStateUpdate(String streamID, ZegoPlayerState state, int errorCode, JSONObject extendedData){/** 根据需要实现事件回调 */}
});

5、停止推拉流

1)停止推流预览

调用 stopPublishingStream 接口停止向远端用户发送本端的音视频流。

/** 停止推流 */
engine.stopPublishingStream();

如果启用了本地预览,调用 stopPreview 接口停止预览。

/** 停止本地预览 */
engine.stopPreview();

2)停止拉流

调用 stopPlayingStream 接口停止拉取远端推送的音视频流。

/** 停止拉流 */
engine.stopPlayingStream(streamID);

6、退出房间

调用 logoutRoom 接口退出房间。

/** 退出房间 */
engine.logoutRoom("room1");

7、销毁引擎

调用 destroyEngine 接口销毁引擎,用于释放 SDK 使用的资源。

根据实际需要,可在销毁引擎时传入参数 “callback”,监听回调以确保设备硬件资源被释放完成。该回调只用于发送通知,开发者不可以在回调内释放与引擎相关的资源。如果开发者不需要监听回调,可将 “null” 传入 “callback”。

/** 销毁 SDK */
ZegoExpressEngine.destroyEngine(null);

以上就是Java直播实现的全流程,看完后大家不妨自己创建一个新项目实际操作下,有任何问题也可以私信或者是评论与我讨论哦~~~~

零基础实现Java直播(二):实现流程相关推荐

  1. 【零基础学Java】—Java 日期时间(三十二)

    [零基础学Java]-Java 日期时间(三十二) DateFormat 是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间. 日期/时间格式化子类(如SimpleDateFor ...

  2. 【零基础学Java】—final关键字与四种用法(二十九)

    [零基础学Java]-final关键字与四种用法(二十九) 一.final关键字 final关键字代表最终.不可改变的 常见的四种用法: 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部 ...

  3. 【零基础学Java】—笔记本USB接口案例(二十八)

    [零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...

  4. 【零基础学Java】—对象的向上和向下转型(二十七)

    [零基础学Java]-对象的向上转型(二十七) 对象的向上转型,其实就是多态的写法 格式:父类名称 对象名=new 子类名称(): 含义:右侧创建一个子类对象,把它当做父类来看待使用 注意事项:向上转 ...

  5. 【零基础学Java】—继承父类并实现多个接口(二十五)

    [零基础学Java]-继承父类并实现多个接口(二十五) 一.使用接口的注意事项 1️⃣接口是没有静态代码块或者构造方法的 2️⃣一个类的直接父类是唯一的,但是一个类可以同时实现多个接口 3️⃣如果实现 ...

  6. 【零基础学Java】—this关键字的三种用法+Java继承的三个特点(二十一)

    [零基础学Java]-this关键字的三种用法+Java继承的三个特点(二十一) 一.this关键字的三种用法 在本类的成员方法中,访问本类的成员变量 在本类的成员方法中,访问本类的另一个成员方法 在 ...

  7. 【零基础学Java】—重写(二十)

    [零基础学Java]-重写(二十) 一.重写和重载 重写(Override):在继承关系当中,方法的名称一样,参数列表一样.重写又称为方法的覆盖.覆写. 重载(Overload):方法的名称一样,参数 ...

  8. 【零基础学Java】—Random的基本概述和使用(十二)

    [零基础学Java]-Random的基本概述和使用(十二) Random类用来生成随机的数字,使用起来也是三个步骤 导包:import java.util.Random; 创建:Random r=ne ...

  9. 机械转行java自学经历,零基础学java,血泪总结的干货

    机械转行java自学经历,零基础学java,血泪总结的干货 1.我为什么转行 2.转行之路 3.面试之路 自学路上的网站 Java教程 实践项目一站式学习 bilibili 自学书籍 <Java ...

  10. 视频教程-零基础学Java编程—Java从小白到大咖-Java

    零基础学Java编程-Java从小白到大咖 专注编程领域,拥有多年开发经验 王小科 ¥168.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠, ...

最新文章

  1. 神经网络基础:(1)得分函数 or 得分函数
  2. Zabbix-03-3 告警变量值
  3. 我看过的C#方面的好文章
  4. Python 类的多态
  5. 计算机视觉编程——图像内容分类
  6. AOJ 0118: Property Distribution (简单DFS)
  7. memcached client for java api,Memcached Client Forjava API
  8. realme Q5系列核心规格曝光:80W快充加持 同价位绝无仅有
  9. .NET常见错误大全
  10. 6.业务架构·应用架构·数据架构实战 --- 双轮驱动的技术架构设计
  11. 普通循环和numpy速率对比
  12. Android 10 使用PreferenceScreen的方法
  13. HyperX旋火游戏鼠标推荐——轻量化鼠标设计界的艺术品
  14. IT行业市场人才需求
  15. Nature:16年前的论文生成软件SCIgen至今仍有人用,骗过同行评审,论文被接收...
  16. uniapp 多国语言实现
  17. 修改placeholder文字 文字换行省略号 背景图固定 鼠标经过图片闪光效果
  18. javascript之动态时钟
  19. layui搭建后台管理系统
  20. 选型笔记之二极管选型

热门文章

  1. algorithms-2.1 Elementary Sorts
  2. AD9361+zedboard(ZYNQ7020)的SDK工程(上)
  3. Java数据结构——图-邻接表
  4. Siemens NX 1988 Build 2201 (NX 1980 Series)
  5. 在C语言程序中,用读方式打开当前计算机D盘根目录下名为a.txt的文本文件,并将该文件与名称为fp的文件指针变量建立联系,实现该功能的语句为...
  6. 粒子滤波器/卡尔曼滤波局限/状态空间模型/蒙特卡罗方法/重要性采样/重要密度函数/重采样/粒子退化 的核心思想+ Matlab代码
  7. mac ox 终端命令大全
  8. 简单方式实现不同的人或角色查看不同的PowerBI报表
  9. 实验1.2(Kruskal算法构建最小生成树)
  10. BZOJ3233 [Ahoi2013]找硬币(线性筛+dp)