现在各大互联网APP都标配电商直播带货了,没有直播带货开发经验都感觉自己跟不上技术的进步。今天快速基于Java实现一个安卓端电商直播APP,深入理解整个电商直播开发流程。我们最终实现效果如下:

按照惯例,为了快速实现,我们继续基于即构直播SDK进行开发。在正式开发之前,我们先理一下移动端电商直播开发流程。

  1. 初始化即构音视频SDK
  2. 房主创建房间ID,并进入房间。 观众根据房间ID进入房间
  3. 房主推实时视频流,观众拉实时视频流

注意,我们只实现直播实时音视频功能,具体的商品详情、支付等暂时不去实现。

1 JAVA实现电商直播功能

1.1 集成即构直播SDK

直播SDK集成方式请直接参考官方文档https://doc-zh.zego.im/article/195, 这里不过多描述。

1.2 初始化音视频SDK引擎

这里我们把所有调用即构实时音视频SDKAPI封装到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参数是采用对称算法生成。其大致原理如下:

  1. 生成一个随机数,并将有效时长等其他相关参数,按照固定格式排列得到未加密版的token
  2. 使用密钥(在即构官方控制台中获取,每个APPID对应一个密钥)并使用对称加密算法加密,得到加密版的token,这个token是给客户端登录时使用的。

具体的代码实现操作请参考文末提供的源码,这里不再过多描述。

需要注意的是,为了安全考虑,token的生成操作最好放到个人服务器中,以免泄露密钥。

2.2 观众登录房间

观众登录房间的方式与2.1.2中描述的一致,实现代码也一致,即房主与观众可以复用同一套登录函数。

3 推流与拉流

3.1 房主推流

房主进入房间后,需要做如下事情:

  1. 申请摄像头、语音的手机权限。
  2. 开启摄像头,本地预览画面。
  3. 推流。将本地实时画面推向即构服务器,由即构服务器做直播流数据分发。

申请摄像头等权限这里不描述,不清楚的可以直接查看文末源码或相关文档。

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【内附源码】的更多相关文章

  1. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  2. 可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)

    前言 在开发中,随着业务逻辑的调整,修改存储过程是必不可免的. 那怎么定位到需要修改的存储过程呢?一个一个的点开查询?存储过程少的话还行,一旦存储过程过多,这样是很浪费时间的,一个不注意还会遗漏掉. ...

  3. 急急如律令!火速搭建一个C#即时通信系统!(附源码分享——高度可移植!)

    (2016年3月更:由于后来了解到GGTalk开源即时通讯系统,因此直接采用了该资源用于项目开发,在此对作者表示由衷的感谢!) —————————————————————————————————— 人 ...

  4. 教你用纯Java实现一个网页版的Xshell(附源码)

    前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:Gat ...

  5. Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

    http://blog.csdn.net/yanzi1225627/article/details/21294553 原文

  6. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  7. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  8. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  9. 基于七牛Python SDK写的一个批量下载脚本

    前言 上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载. 虽然这个需求不太强烈,但有可能有人(在备份.迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也 ...

  10. 分享一个与ABP配套使用的代码生成器源码

    点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...

随机推荐

  1. linux 挂载 vdi 文件(virtual box虚拟机镜像文件)

    1. 下载 vdfuse 下载地址 2.解压deb文件 解压deb安装包文件,这里不使用安装命令是因为你的virtualbox 可能和vdfuse的版本不一致,导致安装失败,而我们只需要用到 vdfu ...

  2. 教你用JavaScript完成轮播图

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个轮播图.图片每3秒自动轮换,也可以点击左右按键轮播图片,当图片到达最左端或最右端时, ...

  3. 4.6:HBase操作实验

    〇.概述 1.拓扑结构 2.目标 进行Hbase实验来熟悉Hbase的基本操作. 一.基本操作 1.启动进程 16610 2.连接集群 3.常见操作

  4. day02-功能实现01

    家具网购项目实现01 1.项目开发环境搭建 创建一个web项目,添加需要的jar包(暂不使用Maven) 依照5.1的表格来创建项目的大体分层: 2.功能01-搭建前端页面 2.1需求分析/图解 2. ...

  5. Sql Server中order by对varchar类型排序结果不对

    1.问题描述 我写一个sql想要把查询结果根据LineNumber升序进行排序,即1.0,1.1,1.2,...1.3.2....2.0,......10.0,......15.2,......这样子 ...

  6. Redis-03 Redis事务

    需要特别注意,Redis 的命令是原子性的,而 Redis 的事务是非原子性的 事务相关命令 MULTI 命令 开启事务命令,Redis将操作命令逐个放到队列中,根据EXEC命令来原子化执行命令 EX ...

  7. A. Greatest Convex【Codeforces Round #842 (Div. 2)】

    A. Greatest Convex You are given an integer \(k\). Find the largest integer \(x\), where \(1≤x<k\ ...

  8. 一个小而美的 C 语言项目

    我最近在学习 C 语言,看的一本书叫做 <C Primer Plus>,这本书对 C 语言的描写.特性介绍.代码示例都介绍的比较详细,是小白入门 C 语言非常不错的一本书,还有一本经典书叫 ...

  9. Asp-Net-Core权限认证

    title: Asp.Net Core权限认证 date: 2022-10-27 16:17:52 tags: - .NET 翻了很多的博客,文档,发现asp.net core自带的权限认证还是比较复 ...

  10. [C++]const_cast,dynamic_cast,reinterpret_cast,static_cast转型

    C++四种新式转型: const_cast(expression) dynamic_cast(expression) reinterpret_cast(expression) static_cast( ...