Java 实现阿里云直播

阿里云播放器直接在线点播视频以及直播技术,此处记录直播实现过程

官网

阿里云直播-快速入门

准备步骤

  1. 创建 阿里云账号
  2. 根据 流程 完成实名认证,以确保可以使用阿里云相应服务
  3. 在密钥管理页面获取阿里云访问密钥,AccessKeyId 和 AccessKeySecret
  4. 开通阿里云直播服务

关键点

  1. 阿里云直播服务端提供了 一系列 API ,但如果只是单纯的直播[推流和拉流] ,实际不需要使用这些 API

推流准备

  1. 推流即直播人员进行视频播放的操作,这需要使用推流客户端 第三方推流工具 OBS
  2. 在推流工具中需要指定推流地址、流名称、鉴权密钥
  3. 如果上述信息阿里云验证合法,既可以开始直播,在阿里云后端可以看到正在直播的流信息

拉流准备

  1. 拉流即直播观众通过视频播放器在线获取直播信息,播放器使用 阿里云播放器 即可,该播放器目前只是阿里云的点播和直播服务
  2. 获取拉流地址后传入播放器,即可开始观看直播

Java 开发注意点

  1. 在阿里云直播的文档中有提供 Java SDK
    • 目前 SDK 中推荐引入的版本号是 2.3.0 ,但其实所有 API 参照的都是最新版 SDK ,最新的版本号可在 阿里云SDK频道 找到
  2. 但如果只是单纯的直播[推流和拉流] ,则不需要进行以上操作
  3. 推流的关键点在于 直播鉴权
    • 此处介绍的直播鉴权只是说的 auth_key 的拼接和验证规则
    • 完整的推流和拉流地址并不知这些,需要依旧案例参考

获取推流地址

  1. 此处获取的只是推流地址的房间号及其他请求参数
  2. 完整的推流地址需要加上阿里云直播中心地址用户的产品名称
    • 直播中心地址 http://video-center.alivecdn.com
    • 产品名称[支持自定义] /appName/
  3. vhost 用于接收拉流地址,即申请阿里云直播时准备的直播域名
  4. 此处使用 Java MD5加密 实现字串加密,加密后长度需要是 32 位
  5. 加密串中的 Constants.ALI_LIVE_PRIVATE_KEY 可在阿里云后端的直播鉴权处获取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 获取推流地址
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);
}

获取拉流地址

  1. 此处获取的拉流地址是完整的,因为拉流地址是直接获取后传入前端的阿里云播放器中
  2. 注意房间名后面加的后缀 .m3u8 用于表示接受的直播视频类型,阿里云官方还提供其他几种类型,可在文档中查看
  3. 拉流地址和推流地址最大的区别在于请求地址的不同,拉流是请求自己提供给阿里云的直播域名,而拉流是请求阿里云的直播中心
  4. 而且推流时需要指定 vhost 告知阿里云直播域名,但拉流时不需要
  5. 获取到拉流地址后可直接参照 Java + jQuery 实现阿里云播放器接口 实现播放器的对接
    • 在播放器的的配置中指明 isLive: true 表名是直播操作
    • 上述笔记中实现的是点播接口,利用的通过 vid 获取 playAuth 的方式,这不适用于直播
    • 直播需要直接指定 source: url 即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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);
}