乐趣区

一对一直播系统搭建方法展示:Java 实现阿里云直播

准备步骤
创建 阿里云账号
根据 流程 完成实名认证,以确保可以使用阿里云相应服务
在密钥管理页面获取阿里云访问密钥,AccessKeyId 和 AccessKeySecret
开通阿里云直播服务
关键点
阿里云直播服务端提供了 一系列 API,但如果只是单纯的直播 [推流和拉流],实际不需要使用这些 API
推流准备
推流即直播人员进行视频播放的操作,这需要使用推流客户端 第三方推流工具 OBS
在推流工具中需要指定推流地址、流名称、鉴权密钥
如果上述信息阿里云验证合法,既可以开始直播,在阿里云后端可以看到正在直播的流信息
拉流准备
拉流即直播观众通过视频播放器在线获取直播信息,播放器使用 阿里云播放器 即可,该播放器目前只是阿里云的点播和直播服务
获取拉流地址后传入播放器,即可开始观看直播
Java 开发注意点
在阿里云直播的文档中有提供 Java SDK
目前 SDK 中推荐引入的版本号是 2.3.0,但其实所有 API 参照的都是最新版 SDK,最新的版本号可在 阿里云 SDK 频道 找到
但如果只是单纯的直播 [推流和拉流],则不需要进行以上操作
推流的关键点在于 直播鉴权
此处介绍的直播鉴权只是说的 auth_key 的拼接和验证规则
完整的推流和拉流地址并不知这些,需要依旧案例参考
获取推流地址
此处获取的只是推流地址的房间号及其他请求参数
完整的推流地址需要加上阿里云直播中心地址和用户的产品名称
直播中心地址 http://video-center.alivecdn.com
产品名称 [支持自定义] /appName/
vhost 用于接收拉流地址,即申请阿里云直播时准备的直播域名
此处使用 Java MD5 加密 实现字串加密,加密后长度需要是 32 位
加密串中的 Constants.ALI_LIVE_PRIVATE_KEY 可在阿里云后端的直播鉴权处获取 1
// 获取推流地址

public String getPushUri(String roomName, Long endTime) {

return getRoomName(roomName) + “vhost=” + Constants.ALI_LIVE_PULL_URL + “&” + generateAuthKey(roomName, endTime);

}

// 房间号

private String getRoomName(String roomName) {

return roomName + “?”;

}

// 完整验签串

private String generateAuthKey(String roomName, Long endTime) {

return “auth_key=” + endTime + generateUuid() + generateEncryptStr(roomName, endTime);

}

// 唯一标识

private String generateUuid() {

String uuid = “0”;

String uid = “0”;

return “-” + uuid + “-” + uid + “-“;

}

// 验签密钥

private String generateEncryptStr(String roomName, Long endTime) {

String uri = Constants.ALI_LIVE_APP_NAME + roomName;

return md5(uri + “-” + endTime + generateUuid() + Constants.ALI_LIVE_PRIVATE_KEY);

}
获取拉流地址
此处获取的拉流地址是完整的,因为拉流地址是直接获取后传入前端的阿里云播放器中
注意房间名后面加的后缀 .m3u8 用于表示接受的直播视频类型,阿里云官方还提供其他几种类型,可在文档中查看
拉流地址和推流地址最大的区别在于请求地址的不同,拉流是请求自己提供给阿里云的直播域名,而拉流是请求阿里云的直播中心
而且推流时需要指定 vhost 告知阿里云直播域名,但拉流时不需要
获取到拉流地址后可直接参照 Java + jQuery 实现阿里云播放器接口 实现播放器的对接
在播放器的的配置中指明 isLive: true 表名是直播操作
上述笔记中实现的是点播接口,利用的通过 vid 获取 playAuth 的方式,这不适用于直播
直播需要直接指定 source: url 即可
public String getPullUrl(String roomName, Long endTime) {

roomName += “.m3u8”;

return “http://” + Constants.ALI_LIVE_PULL_URL + generateUri(roomName) + generateAuthKey(roomName, endTime);

}

// 获取请求参数

private String generateUri(String roomName) {

return Constants.ALI_LIVE_APP_NAME + getRoomName(roomName);

}

// 房间号

private String getRoomName(String roomName) {

return roomName + “?”;

}

// 完整验签串

private String generateAuthKey(String roomName, Long endTime) {

return “auth_key=” + endTime + generateUuid() + generateEncryptStr(roomName, endTime);

}

// 唯一标识

private String generateUuid() {

String uuid = “0”;

String uid = “0”;

return “-” + uuid + “-” + uid + “-“;

}

// 验签密钥

private String generateEncryptStr(String roomName, Long endTime) {

String uri = Constants.ALI_LIVE_APP_NAME + roomName;

return md5(uri + “-” + endTime + generateUuid() + Constants.ALI_LIVE_PRIVATE_KEY);

退出移动版