直播時移可以回看從直播開始時間到當前時間之間的直播視頻。通過閱讀本文,您可以了解直播時移的實現原理及請求方式。
實現原理
視頻直播流會被切成TS切片,通過HLS協議向播放用戶分發,用戶請求的M3U8播放列表中包含不斷刷新的TS切片地址。對于常規的HLS直播,TS切片地址及對應的TS文件無法保存,因此當前時間之前的視頻直播內容無法進行回溯。在開啟直播時移功能后,TS切片信息以及文件會進行保存,從而實現從直播開始時間到當前時間之間的視頻回溯功能。
使用限制
直播時移最大支持直播觀看人數為10萬人,如果需要支持更多人觀看,請提交工單。關于如何提交工單,請參見聯系我們。
使用場景
直播時移功能可以讓直播觀眾在直播過程中回看直播內容。比如在進行賽事直播時,通過時移功能可以讓觀眾像觀看影視劇一樣,回看賽事內容。
目前視頻直播有三種功能支持對直播內容進行回看,直播錄制,直播時移,直播截圖(直播截圖只能按頻率對直播內容進行截圖保存,不適用于播放場景)。
其中直播錄制功能偏向直播結束后對直播內容進行播放,直播時移偏向直播過程中觀眾端對直播內容進行回放。
功能使用
使用直播時移,分兩部分內容:
進行直播時移功能配置。
說明功能需要配置,才能將直播內容進行保存從而支持時移功能。
觀眾端發起請求使用時移功能。
配置直播時移功能
視頻直播目前支持兩種方式進行直播時移功能配置。
- 登錄視頻直播控制臺。
在左側導航欄選擇功能管理>直播時移,進入直播時移頁面。
選擇待配置的播流域名。
單擊添加。
配置直播時移。
直播時移配置參數及說明如下表所示。
參數
描述
AppName
視頻的應用名稱,輸入的AppName必須與直播推流的AppName保持一致,方可生效。不超過255字符,支持數字、大小寫字母、短橫線(-)、下劃線(_),短橫線、下劃線不能位于首位。如果您想要進行域名級別直播時移配置,輸入星號(*)即可。
StreamName
直播流名稱。
轉碼流
僅源流:僅支持源流時移。
包含轉碼流:可支持源流和轉碼流時移。
時移天數
視頻直播為您提供以下時移天數。
1天
3天
7天
15天
30天
單擊確定。
//需要<>內容替換成實際使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
OpenLiveShiftRequest openLiveShiftRequest = new OpenLiveShiftRequest();
openLiveShiftRequest.setDomainName("<DomainName>");
openLiveShiftRequest.setAppName("<AppName>");
openLiveShiftRequest.setStreamName("<StreamName>");
//數據保留時長,單位天,取值(1-30),默認值7
openLiveShiftRequest.setVision("<7>");
//是否忽略對應轉碼流生成時移數據,true/false,默認值true
openLiveShiftRequest.setIgnoreTranscode("<true>");
//
//其他業務代碼
//
try {
OpenLiveShiftResponse openLiveShiftResponse = client.getAcsResponse(openLiveShiftRequest);
System.out.println(new Gson().toJson(openLiveShiftResponse));
// todo something.
} catch (ServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AppName可以設置為星號(*),表示該配置針對于域名下所有直播流有效。
StreamName可以設置為星號(*),表示該配置針對于AppName下所有直播流有效。
添加完成后,可調用DescribeLiveShiftConfigs查詢指定域名的時移配置。
使用JAVA SDK,具體請參見Java SDK使用說明。
重新推流配置才能生效。
更多參數說明可參見OpenLiveShift - 開啟時移服務。
使用直播時移功能
配置時移功能后,直播服務將對直播流TS切片文件進行保存,觀眾端可發起時移播放請求進行直播內容回看。
我們先實現播放一段時移內容,再向您詳細介紹時移播放的具體功能,先看一下請求鏈接:
http://<DomainName>/<AppName>/<StreamName.m3u8>?aliyunols=on&lhs_offset_unix_s_0=300&auth_key=3sdda******
可以發現,時移請求與M3U8的直播地址類似,只是多了兩個參數,aliyunols=on為固定字段,lhs_offset_unix_s_0=300表示向前偏移300秒。
通過CDN調用時移請求時必須攜帶aliyunols=on參數。
目前時移播放只能使用M3U8格式直播地址。
推薦您使用阿里云播放器播放時移內容,關于阿里云播放器使用可參見播放器SDK。
在該示例中,我們實現了回退300秒觀看直播內容,在播放時移內容時通過lhs_offset_unix_s_0參數設置播放時移內容的時間,參數格式為lhs_{type}_{format}_{unit}_{zone}
。
參數中各變量取值如下:
type | format | unit | zone |
時間類型。取值:
| 時移的時間格式。取值:
| 時移的時間單位。取值:
| 時區,取值:0~9,表示東*區。其中,0表示UTC時間,8表示中國時區。 說明 當format取值為unix時,zone取值為0。 |
時移參數示例如下所示:
lhs_start_human_s_8=20170809200010
lhs_start_unix_s_0=1502280113
lhs_end_human_s_8=20170809200010
lhs_vodend_unix_s_0=1502280113
lhs_offset_unix_ms_0=1800000
(向前時移30分鐘)
lhs_start
和lhs_offset
必須指定其中一個,如果同時指定lhs_start
與lhs_offset
,時移播放將以lhs_offset
為準。lhs_end/lhs_vodend
為可選配置,如果不指定lhs_end/lhs_vodend
,時移播放會以直播模式播放至直播推流結束。如果指定了
lhs_end
,時移播放會以直播模式播放直到指定的lhs_end
時間點。如果指定了
lhs_vodend
,時移播放會以點播模式播放直到指定的lhs_vodend
時間點(點播模式會一次性返回所有ts切片,可以使用播放器進度條控制播放前進回退)。如果同時指定
lhs_end
與lhs_vodend
,時移播放將以lhs_vodend
為準。
在您的業務中,如果您無法知道具體的start和end時間點,可以通過查詢時移時間線獲取start和end。
查詢時移時間線示例代碼如下:
//需要將<>替換成實際使用的值
http://<DomainName>/openapi/timeline/query?aliyunols=on&app=<AppName>&stream=<StreamName>&format=ts&lhs_start_unix_s_0=<StartTime>&lhs_end_unix_s_0=<endTime>&auth_key=<auth_key>
示例說明如下:
名稱 | 描述 |
請求方式 | GET |
URL | 請求URL,例如: |
參數 |
|
常見錯誤處理 |
|
返回示例如下所示:
{
"retCode": 0,
"description": "success",
"content": {
"current": 1514269063,
"timeline": [
{
"start": 1514269054,
"end": 1514269058
}
]
}
}
參數 | 描述 |
current | 當前系統時間,播放器可以基于這個字段對時。 |
timeline | 有效的時移時間段,包含開始和結束時間戳。 |
start | 有效片段的開始時間(UNIX時間戳),單位:秒。 |
end | 有效片段的結束時間(UNIX時間戳),單位:秒。 |
一般情況下,一次推流會生成一個timeline對象(start接近于直播開始時間,end接近于current或直播結束時間),但由于斷流重推、網絡波動等原因可能會出現多個timeline對象。
您可以在控制臺查詢指定域名時移數據量。更多信息請參見用量查詢。
進階使用
時移播放轉碼流
時移功能可以結合轉碼功能使用,播放時播放轉碼流。時移播放轉碼流,需要先完成轉碼配置。配置轉碼功能可參見直播轉碼。
此處假設您已完成轉碼功能相關配置。
在配置時移功能時,將轉碼流也生成時移數據,示例代碼如下:
//是否忽略對應轉碼流生成時移數據,true/false,默認值true
openLiveShiftRequest.setIgnoreTranscode("<false>");
然后在轉碼流地址上增加時移參數,即可以實現時移播放轉碼流。
播放地址示例如下:
http://<DomainName>/<AppName>/<StreamName_轉碼模板ID.m3u8>?aliyunols=on&lhs_offset_unix_s_0=300&auth_key=3sdda******
重新推流,即可對轉碼流進行時移播放。
對于拉流觸發轉碼的轉碼配置,播放轉碼流的時移是不能觸發轉碼的,需要提前播放轉碼流直播觸發轉碼(您也可以將轉碼配置為推流觸發轉碼)。
目前時移功能暫不支持多碼率轉碼流。
時移播放封裝流
時移播放封裝流是將直播時移功能與直播封裝功能結合使用。
阿里云視頻直播支持直播封裝服務,支持CMAF、LL-HLS(低延遲HLS)等播放協議,可有效降低直播延遲。開啟直播封裝后,視頻直播流會被切成TS或CMAF切片,通過指定的HLS或LL-HLS協議向播放用戶分發,用戶請求的M3U8播放列表中包含不斷刷新的切片地址。相對于HLS,LL-HLS可以將切片分割成更小(0.2~1秒)的Part切片,并支持M3U8和Part切片的阻塞加載,從而實現端到端低至3~5秒的延遲;相對于TS格式,CMAF封裝格式有廣泛的設備和瀏覽器支持,且支持更新的編解碼器(codec),如H.265。
如果您對直播封裝功能暫不了解,請參見文檔直播封裝。
此處假設您已完成直播封裝功能配置。
實現時移播放封裝流,不需要對時移功能配置做出修改,只需要將封裝流地址增加時移參數即可。
播放地址示例如下:
http://<DomainName>/<AppName>/<StreamName-封裝格式.m3u8>?aliyunols=on&lhs_offset_unix_s_0=300&auth_key=3sdda******
重新推流,即可對封裝流進行時移播放。
如果需要時移播放封裝轉碼流,只需在封裝轉碼流地址上增加時移參數即可。
相關文檔
直播時移相關API,請參見直播時移。