視頻直播錄制可對當前直播實時錄制并可回放歷史直播視頻。本文將詳細為您介紹視頻直播錄制功能。
功能介紹
視頻直播是通過播放地址以實時流的形式播放推流端的數據,如果想要在直播結束后再次觀看或修改直播內容,就必須要使用視頻直播的錄制功能。
視頻直播錄制功能,就是將直播中心接收到的推流數據進行錄制,保存至您指定的存儲位置。目前直播錄制存儲提供兩種方式,錄制存儲至VOD和錄制存儲至OSS。
直播錄制的原理
直播錄制的過程,是通過拉取您推上來的直播流,將音視頻封裝成單獨的一個個媒體切片(封裝格式為TS),然后進行儲存。直播錄制在工作時遵循以下原則:
直播錄制只修改音視頻的封裝格式(RTMP/FLV轉成TS),絕不修改音視頻內容(即編碼層內容)。舉個例子,如果您推上來的直播流是花屏的,那錄制下來的也是花屏的。
直播錄制有權限往用戶儲存地址寫入錄制文件,但是不會也沒有權限修改/刪除用戶儲存地址的任務文件(包括已寫入的錄制文件)。用戶儲存地址中的錄制文件,完全由您自己管理。
功能對比
錄制存儲至VOD和錄制存儲至OSS都可以對直播內容進行錄制存儲。兩者使用場景有所不同,您可以根據您自己的業務決定具體采用哪種方式進行存儲。
存儲方式 | 關聯產品服務 | 封裝格式 | 適用場景 |
錄制存儲至VOD | 開通視頻點播服務 | TS/M3U8 | 傾向于對錄制內容進行二次生產,注重錄制內容后期處理,如剪輯,播放,設置錄制視頻封面等。 |
錄制存儲至OSS | 開通OSS服務 |
| 傾向于錄制內容管理,注重存儲。 |
同一個直播流不能同時配置兩種存儲方式。
限制條件
音視頻編碼格式
由于直播錄制需要先將直播流切分成TS文件,因此您推上來的直播流的音視頻編碼格式必須滿足TS封裝格式的要求。根據FLV標準和ISO/IEC 13818-1標準,直播錄制目前僅支持以下編碼格式:
視頻:H264、HEVC、MPEG4
音頻:AAC、MP3
如果直播流包含了非以上格式編碼的音視頻,直播錄制可能會出現:無法生成錄制文件、錄制黑屏、錄制沒有聲音,以及其他一些無法預見的異常情況。
異常的直播流
對于正常的直播流(沒有不支持的編碼格式、幀率穩定、時間戳單調線性增長),直播錄制均能正常生成錄制文件。當然,對于偶爾幀率不穩定,時間戳跳變的流,直播錄制也能做出一定的兼容,保證錄制文件的正常生成。但是如果推上來的直播流存在嚴重異常(長時間沒有視頻幀,時間戳增長沒有規律,音視頻頭缺失等等),直播錄制可能無法保證正常生成錄制文件。
錄制存儲至VOD
前置條件
若采用錄制存儲至VOD方式進行直播錄制功能配置,需要開通視頻點播服務并啟用點播系統Bucket。
錄制文件存儲在視頻點播VOD中,會產生存儲費用,在VOD中計費請參見點播基礎服務計費。
在啟用點播系統Bucket時,需要注意點播系統Bucket需要與待配置域名的直播中心同地域。
使用金融云賬號不支持視頻直播錄制到點播。
功能配置
完成前置條件相關內容之后,就可以進行錄制存儲至VOD配置。
視頻直播目前提供兩種方式添加錄制存儲至VOD配置。
- 登錄視頻直播控制臺。
在左側導航欄選擇功能管理>直播錄制,進入直播錄制頁面,選擇存儲至VOD配置頁簽。
選擇待配置的播流域名。
單擊添加。
配置錄制模板。
錄制模板參數及說明如下表所示。
參數
描述
AppName
視頻的應用名稱,輸入的AppName必須與直播推流的AppName保持一致,方可生效。如果您想要進行域名級別錄制,輸入星號(*)即可。
StreamName
存儲至VOD支持流級別的錄制。您只需輸入指定的流名稱即可。如果您想要進行全部流錄制,即該AppName下的流全部錄制,輸入星號(*)即可。
說明AppName與StreamName參數支持英文、數字、“-”、“_”符號,長度限制在255個字符以內。
存儲地址
選擇存儲位置。
錄制周期
錄制周期范圍為15~360分鐘,最大支持 6 小時錄制。超過 6 小時,系統將按照錄制命名規則生成新文件。ts切片時長默認為 30s。
說明錄制周期為當前直播轉為點播文件后的最大時長。
錄制轉碼模板
從列表中選擇存儲轉碼規則,可以在點播服務中對錄制的視頻進行轉碼處理。
存儲轉碼規則設置是將錄制下來的視頻轉換為可供傳播的點播文件格式。可轉碼為不同規格的視頻,也可以不轉碼即保持原畫格式。
錄制轉碼模板具體操作,請參見視頻點播轉碼配置。
說明視頻點播轉碼模板所在區域需與您當前域名所在區域保持一致。例如:當前域名為華東2區,視頻點播轉碼模板區域也需要在華東2區。
自動合并開關
開啟后可在直播錄制結束后自動將多個錄制周期文件合并成一個錄制文件存儲到VOD中。
自定合并轉碼模板
從列表中選擇存儲轉碼規則,對自動合成出來的視頻在點播服務中進行一次轉碼,錄制轉碼規則從當前點播系統中獲取。自動合并轉碼模板具體操作,請參見轉碼模板。
說明視頻點播轉碼模板所在區域需與您當前域名所在區域保持一致。例如:當前域名為華東2區,視頻點播轉碼模板區域也需要在華東2區。
單擊確定。
//需要將<>內容替換成實際使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
AddLiveRecordVodConfigRequest addLiveRecordVodConfigRequest=new AddLiveRecordVodConfigRequest();
addLiveRecordVodConfigRequest.setDomainName("<DomainName>");
addLiveRecordVodConfigRequest.setAppName("<AppName>");
addLiveRecordVodConfigRequest.setStreamName("<StreamName>");
addLiveRecordVodConfigRequest.setVodTranscodeGroupId("VOD_NO_TRANSCODE");
//點播系統Bucket地址
addLiveRecordVodConfigRequest.setStorageLocation("<StorageLocation>");
AddLiveRecordVodConfigResponse dddLiveRecordVodConfigResponse = null;
try {
dddLiveRecordVodConfigResponse = client.getAcsResponse(addLiveRecordVodConfigRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(dddLiveRecordVodConfigResponse));
以上示例代碼表示,對<DomainName>域名進行錄制存儲至VOD配置,AppName為<AppName>,StreamName為<StreamName>。錄制內容不進行轉碼(VOD_NO_TRANSCODE),存儲至點播系統Bucket<StorageLocation>。
AppName和StreamName可以填為*,表示所有AppName和所有StreamName(即不限制AppName或StreamName)。
可以配置多條規則,規則匹配時存在優先級:
AppName(不為*)、StreamName(不為*)的優先級最高。
AppName(不為*)的優先級次之。
AppName為*(即只限定域名)的優先級最低。
更多參數說明請參見AddLiveRecordVodConfig - 添加直播錄制轉點播配置。
完成配置后重新推流錄制配置才會生效。
斷流180秒后生成錄制文件。
錄制內容轉碼
錄制存儲至VOD文件格式為m3u8,如果想存儲其他格式可以通過轉碼配置實現。配置錄制轉碼示例代碼如下:
addLiveRecordVodConfigRequest.setVodTranscodeGroupId("<TranscodeGroupId>");
轉碼模板需要在點播系統進行配置,具體操作請參見點播轉碼模板。
<TranscodeGroupId>為點播系統配置的轉碼模板組ID。
配置轉碼后,會對錄制文件進行轉碼(原文件仍然保留),生成轉碼地址。
錄制內容合并
錄制內容合并目前分為兩種形式:
同一路流斷流180秒以內再次推流,錄制內容會自動合并成一個錄制文件。
推流時長超過錄制周期之后的文件合并。在推流時長超過錄制周期之后,會生成一個新的錄制文件(假設設置錄制周期5分鐘,推流時長8分鐘,一次推流將會產生兩個錄制文件)。
如果需要將多個錄制周期的文件進行合并,可以進行合并配置。
配置錄制文件合并示例代碼如下:
addLiveRecordVodConfigRequest.setAutoCompose("ON"); addLiveRecordVodConfigRequest.setComposeVodTranscodeGroupId("<TranscodeGroupId>");
說明合并之后會產生一個新的文件,原錄制文件仍然保留。
轉碼模板需要在點播系統進行配置,具體操作請參見點播轉碼模板。
<TranscodeGroupId>為點播系統配置的轉碼模板組ID。
設置錄制周期時長示例代碼如下:
//單位秒,取值范圍(300~21600),默認值900 addLiveRecordVodConfigRequest.setCycleDuration(<300>);
錄制文件管理
目前可以通過視頻直播控制臺查看存儲至VOD的錄制文件,若要對錄制文件進行管理請通過視頻點播進行,詳情請參見視頻點播媒體管理。
- 登錄視頻直播控制臺。
在左側導航欄選擇功能管理>直播錄制,進入直播錄制頁面,選擇錄制管理文件頁簽。
選擇配置的播流域名。
單擊存儲至VOD頁簽。
錄制存儲至OSS
前置條件
若采用錄制存儲至OSS方式進行直播錄制功能配置,需要開通OSS服務以及創建Bucket,具體操作請參見配置OSS。
錄制文件存儲在OSS中,會產生存儲費用,在OSS中計費請參見存儲費用。
OssBucket需要與待配置域名的直播中心同地域。
功能配置
完成前置條件相關內容之后,就可以進行錄制存儲至OSS配置。
視頻直播目前提供兩種方式添加錄制存儲至OSS配置。
- 登錄視頻直播控制臺。
在左側導航欄選擇功能管理>直播錄制,進入直播錄制頁面,選擇存儲至OSS配置頁簽。
選擇待配置的播流域名。
單擊添加。
配置錄制模板。
表 1. 錄制模板參數
參數
描述
AppName
視頻的應用名稱,輸入的AppName必須與直播推流地址的AppName保持一致,方可生效。如果您想要進行域名級別錄制,輸入星號(*)可。
StreamName
存儲至OSS支持流級別的錄制。您只需輸入指定的流名稱即可。如果您想要進行全部流錄制,即該AppName下的流全部錄制,輸入星號(*)可。
說明AppName與StreamName參數支持英文、數字、短劃線(-)、下劃線(_)符號,長度限制在255字符以內。
AppName與StreamName參數如果使用(*)號需注意
(*)號不能匹配任意字符串,只能通配當前已有的應用名稱或流名稱。
(*)號無法在字符串中進行通配。
存儲位置
選擇存儲位置。
說明存儲Bucket列表中包含標準Bucket和媒體Bucket。標準Bucket是OSS Bucket,用于存儲。媒體Bucket是MPS定制的Bucket,存入媒體Bucket中的視頻,可執行MPS轉碼任務。目前Bucket列表中,未對Bucket做區分。如果您需要將視頻轉成媒體文件,需要自行記住對應的媒體Bucket的名稱,方便您后期視頻轉成媒體文件存儲位置的選擇。
斷流拼接時長
直播斷流時長超過設定的拼接時長后,將會生成新文件,斷流拼接時長支持15~21600秒。
存儲格式
支持flv、m3u8、mp4、cmaf四種格式。
說明至少配置一個存儲格式,其中CMAF格式不能與M3U8格式同時選擇。
存儲規則
默認的存儲路徑為
M3U8:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }
TS:record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}
FMP4:record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}
MP4:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }
FLV:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }
示例
AppName為liveApp****,StreamName為liveStream****,當錄制m3u8格式的存儲路徑為record/liveApp****/liveStream****/{EscapedStartTime}_{EscapedEndTime }。
單個TS時長
單個切片時長,默認為30秒。支持單個TS時長范圍5~30秒。
錄制周期
錄制周期范圍為15分鐘~360分鐘,最大支持6小時錄制。超過6小時,系統將按照錄制命名規則生成新文件。
說明錄制周期為當前直播轉為點播文件后的最大時長。
表 2. 錄制轉碼流參數
參數
描述
錄制轉碼流
打開錄制轉碼流開關,配置參數。
存儲格式
支持flv、m3u8、mp4、cmaf四種格式。
說明至少配置一個存儲格式,其中CMAF格式不能與M3U8格式同時選擇。
存儲規則
默認的存儲路徑為
M3U8:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }
TS:transcodeRecord/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}
FMP4:transcodeRecord/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}
MP4:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }
FLV:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }
示例
AppName為liveApp****,StreamName為liveStream****,轉碼模板ID為lld,當錄制m3u8格式的實際存儲路徑為transcodeRecord/liveApp****/liveStream****_lld/{EscapedStartTime}_{EscapedEndTime }。
單個TS時長
單個切片時長,默認為30秒。支持單個TS時長5~30秒。
錄制周期
錄制周期范圍為15分鐘~360分鐘,最大支持6小時錄制。超過6小時,系統將按照錄制命名規則生成新文件。
說明錄制周期為當前直播轉為點播文件后的最大時長。
轉碼模板ID
支持選擇指定轉碼模板(上限10個)或全部轉碼模板。
轉碼模板所屬AppName需和錄制模板保持一致才可生效,若無轉碼模板,請先添加轉碼模板,請參見通用轉碼。
單擊確定。
//需要將<>內容替換成實際使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
AddLiveAppRecordConfigRequest addLiveAppRecordConfigRequest=new AddLiveAppRecordConfigRequest();
addLiveAppRecordConfigRequest.setAppName("<AppName>");
addLiveAppRecordConfigRequest.setStreamName("<StreamName>");
addLiveAppRecordConfigRequest.setDomainName("<DomainName>");
addLiveAppRecordConfigRequest.setOssEndpoint("<OssEndpoint>");
addLiveAppRecordConfigRequest.setOssBucket("<OssBucket>");
List<AddLiveAppRecordConfigRequest.RecordFormat> formatList=new ArrayList<AddLiveAppRecordConfigRequest.RecordFormat>();
AddLiveAppRecordConfigRequest.RecordFormat m3u8Format=new AddLiveAppRecordConfigRequest.RecordFormat();
m3u8Format.setFormat("m3u8");
//OSS存儲的錄制文件名
m3u8Format.setOssObjectPrefix("<record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
//切片名稱
m3u8Format.setSliceOssObjectPrefix("<record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}>");
formatList.add(m3u8Format);
addLiveAppRecordConfigRequest.setRecordFormats(formatList);
AddLiveAppRecordConfigResponse addLiveAppRecordConfigResponse = null;
try {
addLiveAppRecordConfigResponse = client.getAcsResponse(addLiveAppRecordConfigRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(addLiveAppRecordConfigResponse));
以上示例代碼表示,對<DomainName>域名進行錄制存儲至OSS配置,AppName為<AppName>,StreamName為<StreamName>,儲存格式為m3u8,存儲至<OssBucket>中。
OssObjectPrefix與SliceOssObjectPrefix長度不超過255字符(匹配變量后),具體支持變量請參見APIAddLiveAppRecordConfig - 添加錄制配置說明。
<OssEndpoint>可通過<OssBucket>所屬地域在OSSOSS地域和訪問域名進行查看。
AppName和StreamName可以填為*,表示所有AppName和所有StreamName(即不限制AppName或StreamName)。
可以配置多條規則,規則匹配時存在優先級:
AppName(不為*)、StreamName(不為*)的優先級最高。
AppName(不為*)的優先級次之。
AppName為*(即只限定域名)的優先級最低。
完成配置后重新推流錄制配置才會生效。
斷流180秒(該時間可以設置,詳見斷流拼接)后生成錄制文件。
錄制轉碼流
如果希望在存儲錄制內容時減少錄制文件體積,可通過錄制轉碼流實現(在保證畫質質量的前提下,調整視頻碼率、提高視頻壓縮率、減小文件體積)。錄制存儲至OSS功能支持同時存儲轉碼流與原始流,也支持僅存儲轉碼流或原始流。
使用直播轉碼功能會產生轉碼費用,按轉碼標準、分辨率規格及對應總轉碼時長計費。計費規則詳見直播轉碼費用。
//需要將<>內容替換成實際使用的值
List<AddLiveAppRecordConfigRequest.TranscodeRecordFormat> transcodeFormatList=new ArrayList<AddLiveAppRecordConfigRequest.TranscodeRecordFormat>();
AddLiveAppRecordConfigRequest.TranscodeRecordFormat m3u8TranscodeFormat=new AddLiveAppRecordConfigRequest.TranscodeRecordFormat();
m3u8TranscodeFormat.setFormat("m3u8");
//轉碼流錄制OSS存儲的錄制文件名
m3u8TranscodeFormat.setOssObjectPrefix("<transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
//轉碼流錄制切片名稱
m3u8TranscodeFormat.setSliceOssObjectPrefix("<transcodeRecord/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}>");
transcodeFormatList.add(m3u8TranscodeFormat);
addLiveAppRecordConfigRequest.setTranscodeRecordFormats(transcodeFormatList);
List<String> transcodeTemplateList=new ArrayList<String>();
//轉碼模板ID
transcodeTemplateList.add("<lld>");
addLiveAppRecordConfigRequest.setTranscodeTemplatess(transcodeTemplateList);
若僅需錄制轉碼流,則可以不設置原始流(setRecordFormats)。
設置錄制轉碼流(setTranscodeRecordFormats)時,需同時指定轉碼模板ID(setTranscodeTemplatess),轉碼模板需要進行配置,具體操作請參見直播轉碼。
錄制轉碼流需要在配置轉碼模板時,將轉碼配置為推流觸發。
轉碼流錄制文件名StreamName會轉換成
StreamName
加_轉碼模板ID
的形式。
斷流拼接
同一路流斷流在斷流拼接時長(默認180秒)以內再次推流,錄制內容會自動合并成一個錄制文件。
因需等待斷流拼接,所以才會在斷流拼接時長之后生成錄制文件。
您可以根據您實際的業務調整斷流拼接時長,設置斷流拼接時長:
//單位秒,取值范圍(15~21600)
addLiveAppRecordConfigRequest.setDelayTime(<180>);
不建議調整為過短或過長的時間。若生成錄制文件的時間設置過短,由于網絡波動,斷流重推等原因,就會生成大量的錄制文件。若設置過長則會導致錄制文件在直播結束(斷流)之后很長時間才能看到。
在一些特定的業務場景中,您可能完全不希望等待斷流拼接,而希望在直播結束后立即生成錄制文件,這種情況也是可以實現的。您可以給推流設置回調事件(設置推流回調事件請參見直播推流狀態回調),在接收到推流結束通知時通過調用 RealTimeRecordCommand - 實時錄制指令API做到取消斷流拼接。
//需要將<>內容替換成實際使用的值
RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
realTimeRecordCommandRequest.setCommand("cancel_delay");
realTimeRecordCommandRequest.setAppName("<AppName>");
realTimeRecordCommandRequest.setStreamName("<StreamName>");
realTimeRecordCommandRequest.setDomainName("<DomainName>");
RealTimeRecordCommandResponse realTimeRecordCommandResponse = null;
try {
realTimeRecordCommandResponse = client.getAcsResponse(realTimeRecordCommandRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(realTimeRecordCommandResponse));
如果錄制的是轉碼流,此處需要將<StreamName>設置成
StreamName
加_轉碼模板ID
的形式。setCommand("cancel_delay") 即表示重置斷流延遲時間,完全停止錄制,立刻生成錄制文件。
自定義錄制策略
在功能配置中,我們進行了直播錄制功能的配置,在直播推流時即會開始對直播內容進行錄制,我們稱其為自動錄制。
但有些時候,我們希望能夠通過業務決策自主決定是否需要對某一次直播內容進行錄制。直播錄制功能提供了解決這類問題的方法,自主決定錄制分為兩種情況:
一,由直播服務詢問您的業務系統是否需要對該直播內容進行錄制,得到響應需要錄制后再進行錄制,我們稱其為按需錄制。
二,由您的業務系統給直播服務發出通知對直播內容進行錄制,我們稱其為手動錄制。
按需錄制
實現按需錄制,需要您業務系統提供直播服務調用的URL地址,具體說明可參見按需錄制回調。
設置錄制功能按需錄制示例代碼如下:
//OnDemand字段填1,表示通過HTTP回調開啟按需錄制。
addLiveAppRecordConfigRequest.setOnDemand(1);
同時調用 AddLiveRecordNotifyConfig - 添加域名級別錄制回調配置API進行錄制回調配置。
//需要將<>內容替換成實際使用的值
AddLiveRecordNotifyConfigRequest addLiveRecordNotifyConfigRequest=new AddLiveRecordNotifyConfigRequest();
//設置按需錄制回調請求URL地址
addLiveRecordNotifyConfigRequest.setOnDemandUrl("<OnDemandUrl>");
addLiveRecordNotifyConfigRequest.setNotifyUrl("<NotifyUrl>");
addLiveRecordNotifyConfigRequest.setDomainName("<DomainName>");
AddLiveRecordNotifyConfigResponse addLiveRecordNotifyConfigResponse = null;
try {
addLiveRecordNotifyConfigResponse = client.getAcsResponse(addLiveRecordNotifyConfigRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(addLiveRecordNotifyConfigResponse));
<OnDemandUrl>為按需錄制回調請求URL地址,<NotifyUrl>為錄制回調(包括錄制事件和狀態回調) URL地址。
因接口<NotifyUrl>參數不能為空,所以必須要設置<NotifyUrl>,如果您只需要接收按需錄制請求,不需要錄制事件和錄制狀態回調,可以配置<NotifyUrl>為一個沒有方法實現的URL地址。
手動錄制
實現手動錄制,需要將自動錄制功能關閉。示例代碼如下:
//OnDemand字段填7,表示不進行自動錄制。
addLiveAppRecordConfigRequest.setOnDemand(7);
然后在直播的過程中,您可以根據業務情況通過調用 RealTimeRecordCommand - 實時錄制指令API開啟錄制。
//需要將<>內容替換成實際使用的值
RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
realTimeRecordCommandRequest.setCommand("start");
realTimeRecordCommandRequest.setAppName("<AppName>");
realTimeRecordCommandRequest.setStreamName("<StreamName>");
realTimeRecordCommandRequest.setDomainName("<DomainName>");
RealTimeRecordCommandResponse realTimeRecordCommandResponse = null;
try {
realTimeRecordCommandResponse = client.getAcsResponse(realTimeRecordCommandRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(realTimeRecordCommandResponse));
如果錄制的是轉碼流,此處需要將<StreamName>設置成
StreamName
加_轉碼模板ID
的形式。setCommand("start")表示啟動錄制。
停止錄制
無論是自動錄制,按需錄制,手動錄制,都可以調用RealTimeRecordCommand - 實時錄制指令API主動停止錄制。
//需要將<>內容替換成實際使用的值
RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
realTimeRecordCommandRequest.setCommand("stop");
realTimeRecordCommandRequest.setAppName("<AppName>");
realTimeRecordCommandRequest.setStreamName("<StreamName>");
realTimeRecordCommandRequest.setDomainName("<DomainName>");
RealTimeRecordCommandResponse realTimeRecordCommandResponse = null;
try {
realTimeRecordCommandResponse = client.getAcsResponse(realTimeRecordCommandRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(realTimeRecordCommandResponse));
setCommand("stop")表示停止錄制。
主動停止錄制,同樣需等待斷流拼接時長之后才會生成錄制文件。
如果錄制的是轉碼流,此處需要將<StreamName>設置成
StreamName
加_轉碼模板ID
的形式。
相關API
錄制周期配置
直播時長超過設定的錄制周期后,將生成新文件(例如直播20分鐘,錄制周期設置為15分鐘,將會生成兩個錄制文件),錄制周期支持15-360分鐘。
List<AddLiveAppRecordConfigRequest.RecordFormat> formatList=new ArrayList<AddLiveAppRecordConfigRequest.RecordFormat>();
AddLiveAppRecordConfigRequest.RecordFormat m3u8Format=new AddLiveAppRecordConfigRequest.RecordFormat();
m3u8Format.setFormat("m3u8");
m3u8Format.setOssObjectPrefix("<record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
m3u8Format.setSliceOssObjectPrefix("<record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}>");
//設置錄制周期,單位秒
m3u8Format.setCycleDuration(<900>);
AddLiveAppRecordConfigRequest.RecordFormat mp4Format=new AddLiveAppRecordConfigRequest.RecordFormat();
mp4Format.setFormat("mp4");
mp4Format.setOssObjectPrefix("<record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
//設置錄制周期,單位秒
mp4Format.setCycleDuration(<1500>);
formatList.add(mp4Format);
formatList.add(m3u8Format);
addLiveAppRecordConfigRequest.setRecordFormats(formatList);
注意在以上示例中,同時配置了兩種存儲格式,分別設置了錄制周期。按照此設置進行推流20分鐘,將會生成3個錄制文件(一個mp4,兩個m3u8)。
在直播未超過錄制周期的情況下,錄制文件一般在直播結束后生成。若是您的業務需要在直播未結束的情況下查看錄制文件,可以通過調用 RealTimeRecordCommand - 實時錄制指令API刷新錄制內容,強制重新開始錄制,如果restart之前在錄制,會立即生成錄制文件。
//需要將<>內容替換成實際使用的值
RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
realTimeRecordCommandRequest.setCommand("restart");
realTimeRecordCommandRequest.setAppName("<AppName>");
realTimeRecordCommandRequest.setStreamName("<StreamName>");
realTimeRecordCommandRequest.setDomainName("<DomainName>");
RealTimeRecordCommandResponse realTimeRecordCommandResponse = null;
try {
realTimeRecordCommandResponse = client.getAcsResponse(realTimeRecordCommandRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(realTimeRecordCommandResponse));
setCommand("restart")表示重新開始錄制。
如果錄制的是轉碼流,此處需要將<StreamName>設置成
StreamName
加_轉碼模板ID
的形式。若您的直播流錄制配置了多種存儲格式,此操作會將多種存儲格式一起刷新。
錄制內容合并與提取
視頻直播支持通過創建索引文件將錄制內容按照時間段提取出文件,也可以將起止時間段內的多個錄制文件內容合并為一個。
無論錄制內容最終保存成哪種格式,直播錄制都會先將直播流切片成一個個的TS切片,然后再合成對應封裝格式的錄制文件。通過此特性,可以自主創建M3U8索引文件,將TS切片文件進行組合,從而實現錄制內容的合并與提取。
錄制內容需要包含M3U8存儲格式才能夠進行合并或提取。
調用CreateLiveStreamRecordIndexFiles - 創建錄制索引文件API創建錄制內容索引文件。
CreateLiveStreamRecordIndexFilesRequest createLiveStreamRecordIndexFilesRequest=new CreateLiveStreamRecordIndexFilesRequest();
createLiveStreamRecordIndexFilesRequest.setAppName("<AppName>");
createLiveStreamRecordIndexFilesRequest.setStreamName("<StreamName>");
createLiveStreamRecordIndexFilesRequest.setDomainName("<DomainName>");
createLiveStreamRecordIndexFilesRequest.setOssEndpoint("<OssEndpoint>");
createLiveStreamRecordIndexFilesRequest.setOssBucket("<OssBucket>");
createLiveStreamRecordIndexFilesRequest.setStartTime("<StartTime>");
createLiveStreamRecordIndexFilesRequest.setEndTime("<EndTime>");
createLiveStreamRecordIndexFilesRequest.setOssObject("<IndexFiles/OssObject.m3u8>");
CreateLiveStreamRecordIndexFilesResponse createLiveStreamRecordIndexFilesResponse = null;
try {
createLiveStreamRecordIndexFilesResponse = client.getAcsResponse(createLiveStreamRecordIndexFilesRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(createLiveStreamRecordIndexFilesResponse));
以上示例表示,將直播流<AppName> <StreamName>的錄制內容,按照起止時間<StartTime>至<EndTime>創建出一個新的索引文件。存儲至<OssEndpoint>的<OssBucket>中,索引文件名為<IndexFiles/OssObject.m3u8>。
<StartTime>至<EndTime>格式為:yyyy-MM-ddTHH:mm:ssZ(UTC時間)。
創建錄制索引必保證直播流發生過推流行為,如果設置的時間內未發生過直播或直播流名稱錯誤等會導致創建錄制索引失敗。
錄制內容分為文件信息(包含AppName,StreamName,OSS存儲路徑等)和文件。文件信息(TS分片文件信息和創建的M3U8索引文件信息)保存在視頻直播中,文件(TS分片文件和M3U8索引文件)保存在OSS中。
存儲在OSS中的文件保存時間由OSS的存儲配置決定。
TS分片文件信息在視頻直播系統中僅保存3個月,創建M3U8索引文件只能選擇最近3個月的錄制內容。
M3U8索引文件信息在視頻直播系統中僅保存6個月,若要查詢僅能查詢6個月內創建的索引文件的信息。
如要合并或提取轉碼流,需要將StreamName設置成
StreamName
加_轉碼模板ID
的形式。<OssBucket>需要與直播中心同地域,否則無法通過域名查詢到創建的M3U8索引文件信息。
相關API
錄制文件管理
查看錄制文件
視頻直播支持三種方式進行錄制文件查看。
- 登錄視頻直播控制臺。
在左側導航欄選擇功能管理>直播錄制,進入直播錄制頁面,選擇錄制管理文件頁簽。
選擇待配置的播流域名。
單擊存儲至OSS頁簽。
//需要將<>內容替換成實際使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
DescribeLiveStreamRecordIndexFilesRequest describeLiveStreamRecordIndexFilesRequest=new DescribeLiveStreamRecordIndexFilesRequest();
describeLiveStreamRecordIndexFilesRequest.setAppName("<AppName>");
describeLiveStreamRecordIndexFilesRequest.setStreamName("<StreamName>");
describeLiveStreamRecordIndexFilesRequest.setDomainName("<DomainName>");
describeLiveStreamRecordIndexFilesRequest.setStartTime("<StartTime>");
describeLiveStreamRecordIndexFilesRequest.setEndTime("<EndTime>");
DescribeLiveStreamRecordIndexFilesResponse describeLiveStreamRecordIndexFilesResponse = null;
try {
describeLiveStreamRecordIndexFilesResponse = client.getAcsResponse(describeLiveStreamRecordIndexFilesRequest);
} catch (ClientException e) {
e.printStackTrace();
}
for(int i=0;i<describeLiveStreamRecordIndexFilesResponse.getRecordIndexInfoList().size();i++){
System.out.println(new Gson().toJson(describeLiveStreamRecordIndexFilesResponse.getRecordIndexInfoList().get(i)));
}
目前只支持查詢6個月內的數據。
EndTime和StartTime格式為:yyyy-MM-ddTHH:mm:ssZ(UTC時間),間隔不能超過4天。
更多查詢錄制文件信息接口說明,請參見DescribeLiveStreamRecordIndexFiles - 查詢某個時間段內的所有錄制索引文件API。
在配置錄制功能時,您已指定了錄制文件在OSS中的存儲地址。如果需要在OSS中查看錄制文件,可參見OSS列舉文件。
刪除錄制文件
視頻直播儲存的是錄制文件信息,如AppName,StreamName,OSS文件儲存路徑等,文件是儲存在OSS中。如果在刪除錄制時需要同步刪除儲存在OSS中的文件,則需要創建服務角色AliyunMTSVideoLifecycleRole,并精確授權AliyunMTSVideoLifecycleRolePolicy系統策略。
在直播控制臺刪除錄制文件時需要先進行授權,您需要按照如下步驟在RAM控制臺創建并授權RAM角色后,再登錄直播控制臺刪除錄制文件。
使用阿里云賬號登錄RAM控制臺。
在左側導航欄,選擇 。
在角色頁面,單擊創建角色。
在選擇類型頁簽,可信實體類型選擇阿里云服務,單擊下一步。
在配置角色頁簽,請按照以下參數配置:
角色類型:普通服務角色
角色名稱:AliyunMTSVideoLifecycleRole
備注:該參數為可選,您可以按照需求自定義填寫。
選擇受信服務:多媒體轉碼服務
配置完成后,單擊完成。
在創建完成頁簽,提示角色創建成功后,單擊精確授權。
在添加權限頁簽,請按照以下參數配置:
選擇權限類型:系統策略
輸入策略名稱:AliyunMTSVideoLifecycleRolePolicy
配置完成后,單擊確定。
目前有三種方式進行錄制文件刪除。
- 登錄視頻直播控制臺。
在左側導航欄選擇錄制文件管理。
選擇待刪除錄制文件的域名。
單擊存儲至OSS頁簽,選擇刪除。
單擊確定。
同步刪除選項默認不選中。若選中此選項,則在刪除視頻直播控制臺上錄制文件記錄時會同步刪除OSS中的錄制文件。
DeleteLiveStreamRecordIndexFilesRequest deleteLiveStreamRecordIndexFilesRequest=new DeleteLiveStreamRecordIndexFilesRequest();
deleteLiveStreamRecordIndexFilesRequest.setAppName("<AppName>");
deleteLiveStreamRecordIndexFilesRequest.setStreamName("<StreamName>");
deleteLiveStreamRecordIndexFilesRequest.setDomainName("<DomainName>");
List<String> recordList=new ArrayList<>();
//添加索引文件ID
recordList.add("<recordId>");
deleteLiveStreamRecordIndexFilesRequest.setRecordIds(recordList);
deleteLiveStreamRecordIndexFilesRequest.setRemoveFile("<true>");
DeleteLiveStreamRecordIndexFilesResponse deleteLiveStreamRecordIndexFilesResponse = null;
try {
deleteLiveStreamRecordIndexFilesResponse = client.getAcsResponse(deleteLiveStreamRecordIndexFilesRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(deleteLiveStreamRecordIndexFilesResponse));
<recordId>為索引文件ID,獲取索引文件ID可參見查看錄制文件。
更多刪除直播錄制文件接口說明,請參見DeleteLiveStreamRecordIndexFiles - 刪除直播錄制文件API。
一般情況下,不建議您直接刪除存儲在OSS中的錄制文件。如果需要刪除存儲在OSS中的錄制文件,可以通過視頻直播刪除錄制文件時同步刪除存儲在OSS中的文件。如果您因為業務需求需要直接刪除存儲在OSS中的錄制文件,可參考文檔OSS刪除文件。
其他刪除文件方法
刪除超過6個月的文件:由于只能查詢6個月以內的錄制文件信息,若要刪除超過6個月的文件請通過OSS進行,詳情請參見OSS刪除文件。
過期刪除錄制文件:由于媒體資源均存放在OSS的Bucket中,需要授權訪問才能正常刪除錄制文件,您可以點擊授權進行一鍵授權。授權后,再提交工單申請,我們會在后臺為您配置您需要的過期時間。關于如何提交工單,請參見聯系我們。配置過期時間后,錄制文件過期刪除功能授權操作即為完成。
云資源訪問授權是對系統創建,供視頻直播使用授予訪問云資源權限的角色。授權后如果誤刪角色,可進行重新授權。
相關文檔
使用Java SDK,可參見Java SDK使用說明。