準備步驟
創建 阿里雲賬號
根據 流程 完成實名認證,以確保可以使用阿里雲相應服務
在密鑰管理頁面獲取阿里雲訪問密鑰,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);