直播錄製是指將推送的直播流即時轉換成TS媒體切片後儲存到OSS或VOD中的過程。它將直播內容封裝成TS、M3U8、MP4或FLV等格式的視頻檔案,並支援H264、HEVC、MPEG4的視頻編碼和AAC、MP3的音頻編碼。使用者可以通過直播控制台或API介面選擇不同的錄製方式,包括自動錄製、定時任務錄製、按需錄製和手動錄製。錄製完成後,使用者可以通過直播控制台查詢錄製檔案,設定錄製檔案回調或進行即時處理。本文為您詳細介紹直播錄製相關資訊(包括錄製原理、錄製檔案的儲存、錄製方法等),您可以參考本章節完成直播錄製操作。
直播錄製原理
直播錄製的過程,是通過拉取您推上來的直播流,將音視頻封裝成單獨的一個個媒體切片(封裝格式為TS),然後存入您指定的OSS bucket或者存入到點播系統產生點播檔案。直播錄製在工作時遵循以下原則:
直播錄製只修改音視頻的封裝格式(RTMP/FLV轉成TS),絕不修改音視頻內容(即編碼層內容)。舉個例子,如果您推上來的直播流是花屏的,那錄製下來的也是花屏的。
直播錄製有許可權往使用者bucket寫入錄製檔案,但不會且沒有許可權修改/刪除使用者bucket的任務檔案(包括已寫入的錄製檔案)。使用者bucket中的錄製檔案,完全由您自己管理。
錄製儲存方式
同一路直播流錄製到VOD和錄製到OSS Bucket二者不能同時生效,只能選擇其中一種方式。
ApsaraVideo for Live提供以下兩種錄製檔案的儲存方式,您可以根據需要進行選擇:
錄製儲存至OSS:OSS Bucket必須與播放網域名稱的直播中心同地區,不支援跨地區錄製。
錄製儲存至VOD:將直播內容進行錄製儲存,並轉入ApsaraVideo for VOD系統中,按點播錄製規則產生點播檔案。ApsaraVideo for VOD支援使用雲剪輯功能對直播流的內容進行剪輯加工,實現ApsaraVideo for Live與短視頻的內容聯動。
錄製檔案的封裝格式
直播錄製支援將直播流錄製成TS/M3U8、MP4、FLV封裝格式的視頻檔案。但是不管是哪種封裝格式,直播錄製都會先將直播流切片成一個個的TS切片,然後再合成對應封裝格式的錄製檔案。
對於M3U8,直播錄製會將TS和M3U8都寫入使用者的bucket(因為M3U8隻是HLS協議中的索引檔案,音視頻資料仍然在TS中);而對於MP4和FLV,使用者bucket中只會有合成後的MP4和FLV切片。
限制條件
錄製儲存至OSS
錄製儲存至OSS的前提條件是您已建立OSS Bucket,且OSS Bucket必須與播放網域名稱的直播中心同地區,不支援跨地區錄製。具體操作,請參見建立OSS Bucket。
正常情況下,開通直播服務時,您已自動授權“允許直播服務寫入使用者OSS”,因此直播錄製寫入您指定的bucket時不存在許可權問題。如果該許可權意外被刪除,您可以參考以下方法重新設定:
通過控制台配置:您需要授權ApsaraVideo for Live可將視頻內容寫入OSS產品的許可權,授權後才能將視頻儲存至指定的OSS bucket中。具體操作,請參見配置直播寫入OSS許可權。
通過RAM進行許可權配置:詳情資訊,請參見建立RAM使用者並授權。
錄製儲存至VOD
錄製儲存至VOD的前提條件:您需要先開通ApsaraVideo for VOD服務,且開通點播服務的地區必須與播放網域名稱的直播中心同地區才能將視頻儲存至VOD。ApsaraVideo for VOD服務詳細操作,請參見開通ApsaraVideo for VOD。
音視頻編碼格式
由於直播錄製需要先將直播流切分成TS檔案,因此您推上來的直播流的音視頻編碼格式必須滿足TS封裝格式的要求。根據FLV標準和ISO/IEC 13818-1標準,直播錄製目前僅支援以下編碼格式:
視頻:H264、HEVC、MPEG4
音頻:AAC、MP3
說明如果直播流包含了非以上格式編碼的音視頻,直播錄製可能會出現:無法產生錄製檔案、錄製黑屏、錄製沒有聲音,以及其他一些無法預見的異常情況。
異常的直播流
對於正常的直播流(沒有不支援的編碼格式、幀率穩定、時間戳記單調線性增長),直播錄製均能正常產生錄製檔案。當然,對於偶爾幀率不穩定,時間戳記跳變的流,直播錄製也能做出一定的相容,保證錄製檔案的正常產生。
但如果推上來的直播流存在嚴重異常(長時間沒有視訊框架,時間戳記增長沒有規律,音視頻頭缺失等),直播錄製可能無法保證正常產生錄製檔案。
不同錄製方式及使用情境
ApsaraVideo for Live提供以下錄製方式,您可根據具體的情境進行選擇和使用:
錄製方式 | 使用情境 | 配置方式 | 儲存位置 |
錄製時可精確到某一路流。您可以輸入指定的網域名稱、應用程式名稱或流名稱,錄製某一路直播流。 |
| 支援兩種儲存方式:
| |
您可以通過API控制錄製的開始與結束時間,在您指定的時間內進行錄製。 | 調用API介面 | 僅支援錄製儲存至OSS | |
您可以配置一個回調,通過回調的方法精準控制每一路流的錄製方式。 | 調用API介面 | 僅支援錄製儲存至OSS | |
預設不錄製。您可以通過調用介面來進行手動錄製。 | 調用API介面 | 僅支援錄製儲存至OSS |
按網域名稱、AppName、StreamName多層級自動錄製
直播錄製支援按網域名稱、AppName、StreamName多層級的方式進行錄製。您可以指定網域名稱、應用程式名稱或流名稱,錄製某個網域名稱下或App下所有的直播流,也可以精確錄製某一路直播流。
配置儲存至OSS或儲存至VOD的錄製模板時您可以配置多個錄製模板,但是如果出現一路直播流同時可以匹配到多個錄製模板時,錄製模板生效存在優先順序,具體優先順序如下(數值越小,優先順序越高):
優先順序 | DomainName | AppName | StreamName |
1 | ✓ | ✓ | ✓ |
2 | ✓ | ✓ | * |
3 | ✓ | * | * |
✓ 代表通過控制台或API配置自動錄製規則時對應參數有值,且值不為*,* 代表對應參數值為*。
同一路直播流不能同時選擇錄製到OSS和錄製到VOD,只能選擇其中一種方式。具體實現方式如下:
錄製儲存至OSS
通過ApsaraVideo for Live控制台:
具體操作,請參見錄製儲存至OSS。
API調用流程:
配置錄製規則,調用介面請參見AddLiveAppRecordConfig。
進行推流,詳細內容請參見推流、拉流與播流。
其他相關API參考:
API名稱
說明
刪除App層級錄製配置,如果不再需要某項規則,可以通過該介面刪除。
查詢所有配置的規則列表.
錄製儲存至VOD
通過ApsaraVideo for Live控制台:
具體操作,請參見錄製儲存至VOD。
API調用流程:
配置錄製規則,調用介面請參見AddLiveRecordVodConfig。
進行推流,詳細內容請參見推流、拉流與播流。
其他相關API參考:
API名稱
說明
如果不再需要直播錄製轉點播配置,可以通過該介面刪除。
查詢直播轉點播所有配置列表。
按定時任務自動錄製
該功能僅針對流層級的配置生效(即配置中StreamName欄位不為空白才生效)。
如果您希望在指定的開始時間和結束時間內對一路直播流進行定時錄製,可以通過調用API的方式來實現定時任務的自動錄製。
API調用流程:
配置自動錄製規則,調用介面請參見AddLiveAppRecordConfig。
進行推流,詳細內容請參見推流、拉流與播流。
相關API參考:
API名稱 | 說明 |
刪除App層級錄製配置,如果不再需要某項規則,可以通過該介面刪除。 | |
查詢所有配置的規則列表. |
實踐樣本
例如:建立DomainName為example.com
,AppName為liveApp****
,StreamName為liveStream****
,北京時間為2019-02-15 09:00:00到2019-02-15 21:00:00的錄製任務。同時錄製為M3U8和MP4兩種格式,M3U8格式單個錄製檔案周期預設為6小時(即RecordFormat.1.CycleDuration不傳值),MP4格式單個錄製檔案的錄製周期設定為半小時,錄製到oss-cn-shanghai.aliyuncs.com名為liveBucket****的bucket中:
調用AddLiveAppRecordConfig介面,參數如下:
/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &OssBucket=liveBucket**** &OssEndpoint=oss-cn-shanghai.aliyuncs.com &RecordFormat.1.Format=m3u8 &RecordFormat.2.Format=mp4 &RecordFormat.2.CycleDuration=1800 &StartTime=2019-02-15T01:00:00Z &EndTime=2019-02-15T13:00:00Z &<公用請求參數>
說明StartTime和EndTime欄位填的是UTC時間(假設您本地為北京時間,UTC時間=北京時間-8),請注意和本地時區的對應。
推流。
說明如果指定了錄製時間段,在該時間段內如果沒有推流,自然不會錄製。
限定時間段的配置規則是一次性的,即當指定的時間段過去之後,該規則不會再觸發。
按需錄製
按需錄製的原理是當直播流推流上來之後,直播錄製服務會發送一條HTTP回調給您事先設定的後台服務,通過該回調的返回內容決定是否錄製這條直播流,並且可以動態修改錄製格式和錄製周期。
系統互動如下圖所示,您需要開發圖中的App商務服務,接收HTTP回調,並根據您自身的商務邏輯決定是否錄製。
按需錄製可以通過調用API 的方式來實現:
調用介面添加錄製配置配置錄製規則。其中OnDemand欄位填1,表示通過HTTP回調開啟按需錄製。
調用介面AddLiveRecordNotifyConfig,設定OnDemandUrl欄位。
推流。
App商務服務接收到該推流的按需錄製回調,根據自身業務決定是否錄製,返回內容。
直播錄製服務根據按需錄製回調返回的結果,啟動錄製或不啟動錄製。
涉及的API包括:
API名稱 | 描述 |
配置錄製規則。 | |
如果不再需要某項規則,可以通過該介面刪除。 | |
查詢所有配置的規則。 | |
配置某個網域名稱下的錄製回調,包括事件回調和按需錄製回調。 | |
如果不再需要某個網域名稱的錄製回調,可以通過該介面刪除。 | |
查詢某個網域名稱的錄製回調。 | |
更新某個網域名稱的錄製回調。 | |
按需錄製回調給您的HTTP訊息定義。 |
實踐樣本:
調用AddLiveAppRecordConfig介面,配置指定網域名稱為
example.com
,AppName為liveBucket****
下的所有直播流自動錄製:/?AppName=liveApp**** &DomainName=example.com &OssBucket=liveBucket**** &OssEndpoint=oss-cn-shanghai.aliyuncs.com &RecordFormat.1.Format=m3u8 &<公用請求參數>
調用AddLiveRecordNotifyConfig介面,設定OnDemandUrl欄位為
http://example.aliyundoc.com
:/?DomainName=example.com &OnDemandUrl=http://example.aliyundoc.com &<公用請求參數>
推流。
App商務服務接收到的按需錄製回調為:(詳見按需錄製回調)
GET /?app=liveApp****&domain=example.com&stream=liveStream****&vbitrate=2000&codec=h264 HTTP/1.1 Host: demo.aliyundoc.com User-Agent: Go-http-client/1.1
根據回調返回的結果:(詳見按需錄製回調)
如果收到以下結果,則進行錄製:
{ "ApiVersion" : "1.0", "NeedRecord" : true }
如果收到以下結果,則不錄製:
{ "ApiVersion" : "1.0", "NeedRecord" : false }
如果沒有設定OnDemandUrl,就不會有按需錄製回調,預設行為是不錄製。
在調用AddLiveRecordNotifyConfig介面,設定錄製回調前請先調用介面AddLiveAppRecordConfig設定錄製規則,否則無法啟動錄製任務。
手動錄製
針對直播錄製您還可以直接通過手動的方式實現某條直播流的錄製啟動。如果某條直播流正在錄製,您也可以通過手動的方式停止該直播流的錄製。
手動錄製通過調用API實現:
調用AddLiveAppRecordConfig介面配置錄製規則。設定ondemand=7,表示推流後不自動錄製。
推流。
調用RealTimeRecordCommand介面啟動錄製。
(如果需要)調用RealTimeRecordCommand介面停止錄製。
涉及到的API包括:
API名稱 | 說明 |
配置自動錄製規則。 | |
如果不再需要某項規則,可以通過該介面刪除。 | |
查詢所有配置的規則。 | |
即時錄製命令,可控制手動啟動錄製和手動停止錄製。 |
實踐樣本:
手動啟動錄製。
如果直播流
example.com/liveApp****/liveStream****
正在推流,可以按以下方式調用RealTimeRecordCommand介面啟動錄製:/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &Command=start &<公用請求參數>
手動停止錄製
如果直播流
example.com/liveApp****/liveStream****
正在錄製,可以按以下方式調用RealTimeRecordCommand介面停止錄製:/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &Command=stop &<公用請求參數>
如果直播流不存在(沒有推流),調用RealTimeRecordCommand介面手動啟動錄製會返回失敗。
手動啟動錄製的直播流如果發生了斷流,就會停止錄製,並且重新推流後不會自動啟動錄製(如果沒有配置自動錄製)。
錄製檔案擷取
直播錄製結束後,可以通過以下方法擷取到對應的錄製檔案:
方法一:通過直播控制台查看錄製檔案。詳細操作,請參見錄製檔案管理。
方法二:通過調用DescribeLiveStreamRecordIndexFiles查詢某個時間段內的所有錄製索引檔案。需注意介面中的StartTime和EndTime欄位填的均是UTC+0時間,請注意和本地時區的對應。例如您本地為北京時間,UTC時間=北京時間-8。
http(s)://live.aliyuncs.com/?Action=DescribeLiveStreamRecordIndexFiles &AppName=liveApp**** &DomainName=example.com &EndTime=2017-12-22T08:00:00Z &StartTime=2017-12-21T08:00:00Z &StreamName=liveStream**** &<公用請求參數>
方法三:通過調用AddLiveRecordNotifyConfig介面設定錄製檔案產生回調,每當一個錄製檔案產生,都能收到一個HTTP請求,便於您做一些業務上的即時處理。具體操作如下:
調用AddLiveRecordNotifyConfig介面,設定網域名稱
aliyundoc.com
下直播錄製檔案建置事件都回調到http://example.aliyundoc.com
這個地址:/?DomainName=aliyundoc.com &NotifyUrl=http://example.aliyundoc.com &<公用請求參數>
設定之後,如果一條直播流
aliyundoc.com/live/teststream
產生錄製檔案(TS/MP4/FLV),您就會收到以下內容的回調:POST / HTTP/1.1 Host: live.example.com User-Agent: Go-http-client/1.1 { "domain": "aliyundoc.com", "app": "live", "stream": "teststream", "uri": "live/teststream/0_2017-03-08-23:09:46_2017-03-08-23:10:40.flv", "duration": 69.403, "start_time": 1488985786, "stop_time": 1488985840 }
注意事項
如果想知道自動錄製(按網域名稱/AppName/StreamName多層級自動錄製、按定時任務自動錄製)是否生效,可以設定錄製回調,詳情請參見直播錄製回調。
如果希望針對每個錄製檔案做即時處理,可通過建立錄製內容索引檔案實現,詳情請參見錄製內容合并與提取。
錄製周期為當前直播轉為錄製檔案後的最大時間長度,直播時間長度超過設定的錄製周期後,將產生新檔案,錄製周期支援15-360分鐘。可在直播控制台上配置錄製模板時進行設定,也可以調用介面AddLiveRecordVodConfig(錄製到VOD)或介面AddLiveAppRecordConfig(錄製到OSS)進行設定。
如果在一個錄製周期內,直播流發生了斷流,但是在3分鐘內,該直播流又推上來了,那麼仍會在同一個錄製檔案中繼續錄製,不會產生新的錄製檔案。這就意味著,一條直播流必須斷流超過3分鐘,才會產生最後一個錄製檔案。
ApsaraVideo for Live支援觸發拉流,當使用觸發拉流網域名稱對應的播放地址進行播放時,會自動觸發阿里雲ApsaraVideo for Live服務進行拉流直播,無人播放時則不會回來源站點進行拉流。自動錄製、按需錄製、手動錄製功能應用在觸發拉流情境時,如果觸發拉流無人播放,則不會回來源站點拉流,自動錄製、按需錄製、手動錄製同樣也不會進行錄製。