基于电商直播SDK快速实现一个淘宝直播APP【内附源码】
现在各大互联网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源码
基于电商直播SDK快速实现一个淘宝直播APP【内附源码】的更多相关文章
- Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析
Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...
- 可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)
前言 在开发中,随着业务逻辑的调整,修改存储过程是必不可免的. 那怎么定位到需要修改的存储过程呢?一个一个的点开查询?存储过程少的话还行,一旦存储过程过多,这样是很浪费时间的,一个不注意还会遗漏掉. ...
- 急急如律令!火速搭建一个C#即时通信系统!(附源码分享——高度可移植!)
(2016年3月更:由于后来了解到GGTalk开源即时通讯系统,因此直接采用了该资源用于项目开发,在此对作者表示由衷的感谢!) —————————————————————————————————— 人 ...
- 教你用纯Java实现一个网页版的Xshell(附源码)
前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:Gat ...
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
http://blog.csdn.net/yanzi1225627/article/details/21294553 原文
- 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...
- 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)
本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 基于七牛Python SDK写的一个批量下载脚本
前言 上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载. 虽然这个需求不太强烈,但有可能有人(在备份.迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也 ...
- 分享一个与ABP配套使用的代码生成器源码
点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...
随机推荐
- 3.7:基于Weka的K-means聚类的算法示例
〇.目标 1.使用Weka平台,并在该平台使用数据导入.可视化等基本操作: 2.对K-means算法的不同初始k值进行比较,对比结果得出结论. 一.打开Weka3.8并导入数据 二.导入数据 三.Si ...
- 【实时数仓】Day04-DWS层业务:DWS设计、访客宽表、商品主题宽表、流合并、地区主题表、FlinkSQL、关键词主题表、分词
一.DWS层与DWM设计 1.思路 之前已经进行分流 但只需要一些指标进行实时计算,将这些指标以主题宽表的形式输出 2.需求 访客.商品.地区.关键词四层的需求(可视化大屏展示.多维分析) 3.DWS ...
- go-carbon 1.5.1 版本发布, 修复已知 bug 和新增土耳其翻译文件
carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github.com/golang-m ...
- 为什么 Random.Shared 是线程安全的
在多线程环境中使用 Random 类来生成伪随机数时,很容易出现线程安全问题.例如,当多个线程同时调用 Next 方法时,可能会出现种子被意外修改的情况,导致生成的伪随机数不符合预期. 为了避免这种情 ...
- dubbo2升级到dubbo3实践
dubbo当前版本 2.7.3 期望升级到 3.0.11. 升级过程 maven依赖变更 <dependency> <groupId>org.apache.dubbo</ ...
- Linux NTP工具的基本使用
NTP 时间同步 NTP(Network Time Protocol)协议,网络时间协议.利用ntp协议可以实现网络中的计算机时间同步. 实现NTP协议的工具: ntpdate:只能同步一次时间 nt ...
- SQL语句查询关键字
SQL语句查询关键字前戏 SQL语句中关键字的执行顺序和编写顺序并不是一致的,可能会错乱 eg: select id,name from userinfo;我们先写的select再写的from,但是执 ...
- JavaScript中的防抖与节流-图文版
01.防抖还是节流 防抖 与 节流 目的都是避免一定时间内,大量重复的操作造成的性能损耗.因此原理也类似,都是阻止过多的事件执行,只保留一部分来执行.适用场景略有不同,也有交叉,动手练习一遍就懂了. ...
- ArcGIS工具 - 统计工具数量
ESRI作为GIS行业中的龙头,代表产品ArcGIS也在不断地优化和升级,从10.0开始已发布了8个版本,其工具箱(ToolBox)是它一个特色,每个版本的工具箱数量是不相同的,为源地理来教您如何统计 ...
- Docker使用阿里云拉取配置源也无法拉取的镜像-github镜像镜像gcr.io
我搞了一天都没搞好,最后用了这个办法解决了拉取镜像的问题 对于大部分镜像来说,我们配置源就可以,但是对于较新的镜像,没得搞啊,铁子们,真的崩溃... 最终发现可以通过Aliyun的自动构建来处理被墙镜 ...