版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82788122
Java 实现阿里云直播
阿里云播放器直接在线点播视频以及直播技术,此处记录直播实现过程
更多精彩
- 更多技术博客,请移步 asing1elife’s blog
官网
准备步骤
关键点
- 阿里云直播服务端提供了 一系列 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
可在阿里云后端的直播鉴权处获取
// 获取推流地址
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);
}