当前位置: 首页 > 后端技术 > Java

快速实现一个基于电商直播SDK的淘宝直播APP【附源码】

时间:2023-04-02 10:29:21 Java

现在各大互联网APP都标配了电商直播带货。没有直播带货开发经验,感觉跟不上技术进步。今天快速实现一个基于Java的Android端电商直播APP,深刻理解整个电商直播开发流程。我们最终的实现效果如下:按照惯例,为了快速实现,我们继续基于直播SDK进行开发。在正式开发之前,我们先了解一下移动电商直播的开发流程。初始化语音视频SDK,房主创建房间ID并进入房间。观众根据房间ID进入房间。所有者推送实时视频流,观看者拉取实时视频流。注意我们只实现直播实时音视频功能,具体商品详情、支付等暂不实现。1JAVA实现电商直播功能1.1集成直播SDK直播SDK集成方法,直接参考官方文档https://doc-zh.zego.im/article/195,此处不再赘述.1.2初始化音视频SDK引擎这里我们将所有调用实时音视频SDK的API封装到Zego类中,使用单例模式调用。初始化ZEGOSDK引擎的工作被放到构造函数中:privateZego(Applicationapp){ZegoEngineProfileprofile=newZegoEngineProfile();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合法性创建房间前,主播需要提供房间号。当然这一步可以由后台generate自动执行。作为demo,我们暂时让房主自己设置。为了避免房间号冲突,我们需要验证当前房间号是否已经存在。如果有个人服务器,自然好判断。如果您没有个人服务器,可以调用Zego提供的服务器端API接口查询当前房间的人数。具体的调用方法可以参考https://doc-zh.zego.im/article/8780,也可以直接参考本文提供的源码。简单的说,使用服务端API就是访问一个http地址,返回相应的JSON参数。2.1.2使用ID创建房间并登录我们将登录房间功能封装到Zego类中。登录房间代码如下。注意这里不需要显式创建房间,如果指定的房间ID不存在,会自动创建。publicbooleanloginRoom(StringuserId,StringuserName,StringroomId,Stringtoken){ZegoUseruser=newZegoUser(userId,userName);ZegoRoomConfigconfig=newZegoRoomConfig();config.token=令牌;//请求开发者服务器获取config.isUserStatusNotify=true;mEngine.loginRoom(roomId,user,config);returntrue;}注意这个函数需要传入token参数。令牌参数是使用对称算法生成的。总的原理是:产生一个随机数,将有效时间等其他相关参数按照固定格式排列,得到一个未加密的token。使用密钥(在机狗官方控制台获取,每个APPID对应一个密钥),用对称加密算法加密,得到加密版的token,用于客户端登录。具体代码实现操作请参考文末提供的源码,此处不再赘述。需要注意的是,出于安全考虑,令牌生成操作最好放在个人服务器中,以免泄露密钥。2.2观众登录房间观众登录房间的方法与2.1.2中描述的一致,实现代码也一致,即主播和观众可以复用同一套登录函数.3推拉3.1房主推送房主进入房间后,需要进行如下操作:申请摄像头和语音电话权限。打开相机并在本地预览屏幕。推流。将本地实时画面推送到即时服务器,由即时服务器分发直播数据。申请摄像头等权限这里不再赘述。如果不清楚,可以直接查看文末的源码或相关文档。3.1.1开启摄像头预览实时图像预览效果如下:如果你需要大量的代码从头开始做一个摄像头实时图像预览,也就是SDK已经封装了这一行的工作,我们只需要提供一个已经布局在ContentView中的TextureView就可以了。示例代码如下:ZegoCanvascanvas=newZegoCanvas(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即可:ZegoCanvascanvas=newZegoCanvas(textureView);canvas.viewMode=ASPECT_FILL;mEngine.startPlayingStream(streamId,canvas);流的介绍,我们知道在播放实时画面的时候(楼主和观众是一样的),最多只需要两个参数,TextureView和对应的流ID,所以我们把这两个参数封装到PreviewItem中:publicclassPreviewItem{publicTextureViewtv;公共字符串streamId;publicPreviewItem(TextureViewtv,StringstreamId){this.tv=tv;this.streamId=streamId;}}然后封装playPreview函数,楼主和观众可以统一调用:publicvoidplayPreview(PreviewItempi,booleanisMyself){canvas.viewMode=ASPECT_FILL;//不管有没有推送,先停止发布mEngine.stopPublishingStream();if(isMyself){//本地预览mEngine.startPublishingStream(pi.streamId);mEngine.startPreview(画布);}else{//Pullvideostream//拉取远程视频流mEngine.startPlayingStream(pi.streamId,canvas);}}如果你是房主,在预览画面同时,如果你是执行推流任务的观众,直接拉流即可。4其他工作由于本文没有使用个人后台服务器做一些权限控制,所以会有安全隐患。如果是在线APP,请记得将敏感操作放在自己的后台服务器执行。4.1观众如何知道主播的视频流ID?在本文中,对于每个用户,如果需要推流,将其推流ID设置为其userID。强烈建议不要对在线产品执行此操作。最好由个人服务器生成。RoomID_UserID_后缀建议采用Avoidstreaming的形式。用户通过监听onRoomStreamUpdate回调信息,可以获取到新增(或退出)视频流的ID。4.2如何获取车主ID?直播间的产品信息?直播间的名字信息?同样的问题,如果你有个人服务器,可以直接访问服务器,查询相关数据库获取。但是,如果您没有个人服务器怎么办?这里我们通过房主监听每个用户登录房间的回调函数+房间内的实时消息来实现。具体描述如下:房主监听登录房间回调函数,如果用户登录房间,则发送产品信息、房主userID、房间名称等数据消息。发送消息可以通过调用sendCustomCommand函数来实现:publicvoidsendMsg(StringroomId,ArrayListuserList,Msgmsg){StringmsgPack=msg.toString();//发送自定义信令,仅在`toUserList`中指定的用户可以通过//onIMSendCustomCommandResult接收此信令。//如果`toUserList`参数为`null`,SDK将向房间内的所有用户发送此信号}});}5Android电商直播源码分享想要快速用Java实现电商直播demo的开发者可以直接从以下地址获取电商直播源码。电商直播demo源码