共计 3834 个字符,预计需要花费 10 分钟才能阅读完成。
当初各大互联网 APP
都标配电商直播带货了,没有直播带货开发教训都感觉本人跟不上技术的提高。明天疾速基于 Java 实现一个安卓端电商直播APP
,深刻了解整个电商直播开发流程。咱们最终实现成果如下:
依照常规,为了疾速实现,咱们持续基于即构直播 SDK
进行开发。在正式开发之前,咱们先理一下挪动端电商直播开发流程。
- 初始化
即构音视频 SDK
,- 房主创立房间
ID
,并进入房间。观众依据房间ID
进入房间- 房主推实时视频流,观众拉实时视频流
留神,咱们只实现直播实时音视频性能,具体的商品详情、领取等临时不去实现。
1 JAVA 实现电商直播性能
1.1 集成即构直播 SDK
直播 SDK
集成形式请间接参考官网文档 https://doc-zh.zego.im/article/195, 这里不过多形容。
1.2 初始化音视频 SDK 引擎
这里咱们把所有调用即构 实时音视频 SDK
的 API
封装到 Zego
类中,并应用单例模式调用。其中初始化 ZEGO SDK
引擎工作放入到构造函数中:
private Zego(Application app) {ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = KeyCenter.APPID;
profile.scenario = ZegoScenario.GENERAL; // 通用场景接入
profile.application = app;
mEngine = ZegoExpressEngine.createEngine(profile, null);
}
这里有 APPID
参数须要返回控制台 https://console.zego.im 创立一个我的项目获取。
2 创立电商直播房间与登录房间实时通话
登录画面如下:
2.1 房主创立房间
2.1.1 验证房间 ID 的有效性
在创立房间之前,须要房主提供房间号,当然了,这一步能够由后盾主动生成。作为一个Demo
,咱们临时让房主本人设置。为了防止房间号抵触,咱们须要先验证以后房间号是否已存在,如果有集体服务器天然很轻松判断。如果没有集体服务器,能够调用即构提供的服务器端 API 接口查问以后房间的人数,具体调用办法能够返回 https://doc-zh.zego.im/article/8780 查问,也能够间接参考复用本文提供的源码。
简略来说,应用服务器端
API
就是拜访一个http
址,返回对应的JSON
参数。
2.1.2 应用 ID 创立房间并登录
咱们将登录房间函数封装到 Zego
类外面。登录房间代码如下。
留神,毋庸显式创立房间,如果指定的房间 ID 不存在,则会主动创立。
public boolean loginRoom(String userId, String userName, String roomId, String token) {ZegoUser user = new ZegoUser(userId, userName);
ZegoRoomConfig config = new ZegoRoomConfig();
config.token = token; // 申请开发者服务端获取
config.isUserStatusNotify = true;
mEngine.loginRoom(roomId, user, config);
return true;
}
留神到此函数须要传入 token
参数。token
参数是采纳 对称算法 生成。其大抵原理如下:
- 生成一个随机数,并将 无效时长 等其余相干参数,依照固定格局排列失去未加密版的
token
。- 应用密钥(在即构官网控制台中获取,每个 APPID 对应一个密钥)并应用对称加密算法加密,失去加密版的
token
,这个token
是给客户端登录时应用的。
具体的代码实现操作请参考文末提供的源码,这里不再过多形容。
须要留神的是,为了平安思考,token
的生成操作最好放到集体服务器中,免得泄露密钥。
2.2 观众登录房间
观众登录房间的形式与 2.1.2 中形容的统一,实现代码也统一,即房主与观众能够复用同一套登录函数。
3 推流与拉流
3.1 房主推流
房主进入房间后,须要做如下事件:
- 申请摄像头、语音的手机权限。
- 开启摄像头,本地预览画面。
- 推流。将本地实时画面推向即构服务器,由即构服务器做直播流数据散发。
申请摄像头等权限这里不形容,不分明的能够间接查看文末源码或相干文档。
3.1.1 开启摄像头并预览
实时画面预览成果如下:
如果从零开始做个摄像头实时画面预览须要大量代码量,即构 SDK
早已将这行工作封装好,咱们只需提供一个曾经在 ContentView
中布局好的 TextureView
即可。示例代码如下:
ZegoCanvas canvas = new ZegoCanvas(textureView);
canvas.viewMode = ASPECT_FILL;
mEngine.startPreview(canvas);
3.1.2 推流与进行推流
推流更简略,间接调用即构 实时音视频 SDK
一行代码:
mEngine.startPublishingStream(streamId);
指定视频流的惟一 ID
,传给startPublishingStream
函数即可。进行推流间接调用 stopPublishingStream()
函数:
mEngine.stopPublishingStream();
3.2 拉流预览
与本地预览实时画面一样,即构 SDK
将拉取近程视频流也封装到了极致,只需一行代码即可。咱们在调用的时候仅需指定 TextureView
与对应的流ID
:
ZegoCanvas canvas = new ZegoCanvas(textureView);
canvas.viewMode = ASPECT_FILL;
mEngine.startPlayingStream(streamId, canvas);
3.3 播放实时画面对立封装
依据拉流与推流的介绍,咱们晓得,其实播放实时画面得时候(房主和观众都一样)最多仅需 TextureView
与对应的流 ID
两个参数,因而咱们把这两个参数封装到 PreviewItem
中:
public class PreviewItem {
public TextureView tv;
public String streamId;
public PreviewItem(TextureView tv, String streamId) {
this.tv = tv;
this.streamId = streamId;
}
}
而后封装 playPreview
函数, 不论是房主还是观众,都能够对立调用这个函数:
public void playPreview(PreviewItem pi, boolean isMyself) {ZegoCanvas canvas = new ZegoCanvas(pi.tv);
canvas.viewMode = ASPECT_FILL;
// 不论有没有推流,先进行推流
mEngine.stopPublishingStream();
if (isMyself) {// 本地预览
mEngine.startPublishingStream(pi.streamId);
mEngine.startPreview(canvas);
} else {// 拉取视频流
// 拉取近程视频流
mEngine.startPlayingStream(pi.streamId, canvas);
}
}
如果是房主,则在预览画面的同时,执行推流工作。如果是观众,间接拉流即可。
4 其余工作
因为本文没有采纳集体后盾服务器做一些权限管制,因而会存在平安危险。如果是线上APP
,请务必记得将敏感操作放到本人的后盾服务器中执行。
4.1 观众如何得悉房主的视频流 ID?
在本文中,对于每个用户,如果须要推流,则将其推流的 ID
设置为其 userID
, 强烈建议线上产品不要这么做,最好是由集体服务器生成,举荐 RoomID_UserID_后缀
模式,以防止串流 。用户在监听到onRoomStreamUpdate
回调信息后,能够失去新增(或退出)的视频流 ID。
4.2 如何获取房主 ID?直播间的商品信息?直播间的名称信息?
同样的问题,如果有集体服务器,间接拜访服务器查问相干数据库即可获取。但没有集体服务器怎么办?这里咱们通过房主监听每个用户登录房间回调函数 + 房间内实时音讯来实现。具体可形容如下:
房主监听登录房间回调函数,如果有用户登录房间,则发送商品信息、房主 userID、房间名称等数据音讯。
发送音讯能够调用 sendCustomCommand
函数实现:
public void sendMsg(String roomId, ArrayList<ZegoUser> userList, Msg msg) {String msgPack = msg.toString();
// 发送自定义信令,`toUserList` 中指定的用户才能够通过
// onIMSendCustomCommandResult 收到此信令.
// 若 `toUserList` 参数传 `null` 则 SDK 将发送该信令给房间内所有用户
mEngine.sendCustomCommand(roomId, msgPack, userList, new IZegoIMSendCustomCommandCallback() {
@Override
public void onIMSendCustomCommandResult(int errorCode) {}});
}
5 电商直播安卓源码分享
想要 Java 疾速实现电商直播 Demo 的开发者,可间接从以下地址获取电商直播源码。
电商直播 demo 源码