視頻直播錄制可對當前直播實時錄制并可回放歷史直播視頻。本文將詳細為您介紹視頻直播錄制功能。
功能介紹
視頻直播是通過播放地址以實時流的形式播放推流端的數據,如果想要在直播結束后再次觀看或修改直播內容,就必須要使用視頻直播的錄制功能。
視頻直播錄制功能,就是將直播中心接收到的推流數據進行錄制,保存至您指定的存儲位置。目前直播錄制存儲提供兩種方式,錄制存儲至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。
二,通過調用AddLiveRecordVodConfig - 添加直播錄制轉點播配置API配置。
//需要將<>內容替換成實際使用的值
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為*(即只限定域名)的優先級最低。
完成配置后重新推流錄制配置才會生效。
斷流180秒后生成錄制文件。
錄制內容轉碼
錄制存儲至VOD文件格式為m3u8,如果想存儲其他格式可以通過轉碼配置實現。配置錄制轉碼示例代碼如下:
addLiveRecordVodConfigRequest.setVodTranscodeGroupId("<TranscodeGroupId>");
轉碼模板需要在點播系統進行配置,具體操作請參見點播配置普通轉碼模板。
<TranscodeGroupId>為點播系統配置的轉碼模板組ID。
配置轉碼后,會對錄制文件進行轉碼(原文件仍然保留),生成轉碼地址。
錄制內容合并
錄制內容合并目前分為兩種形式:
1,同一路流斷流180秒以內再次推流,錄制內容會自動合并成一個錄制文件。
2,推流時長超過錄制周期之后的文件合并。在推流時長超過錄制周期之后,會生成一個新的錄制文件(假設設置錄制周期5分鐘,推流時長8分鐘,一次推流將會產生兩個錄制文件)。
設置錄制周期時長示例代碼如下:
//單位秒,取值范圍(300~21600),默認值900
addLiveRecordVodConfigRequest.setCycleDuration(<300>);
如果需要將多個錄制周期的文件進行合并,可以進行合并配置。
配置錄制文件合并示例代碼如下:
addLiveRecordVodConfigRequest.setAutoCompose("ON");
addLiveRecordVodConfigRequest.setComposeVodTranscodeGroupId("<TranscodeGroupId>");
合并之后會產生一個新的文件,原錄制文件仍然保留。
轉碼模板需要在點播系統進行配置,具體操作請參見點播配置普通轉碼模板。
<TranscodeGroupId>為點播系統配置的轉碼模板組ID。
錄制文件管理
目前可以通過視頻直播控制臺查看存儲至VOD的錄制文件,詳情可參見在視頻直播控制臺查看錄制文件。若要對錄制文件進行管理請通過視頻點播進行,詳情請參見視頻點播媒體管理。
錄制存儲至OSS
前置條件
若采用錄制存儲至OSS方式進行直播錄制功能配置,需要開通OSS服務以及創建Bucket,具體操作請參見配置OSS。
錄制文件存儲在OSS中,會產生存儲費用,在OSS中計費請參見存儲費用。
OssBucket需要與待配置域名的直播中心同地域。
功能配置
完成前置條件相關內容之后,就可以進行錄制存儲至OSS配置。
視頻直播目前提供兩種方式添加錄制存儲至OSS配置。
一,通過控制臺操作,具體操作請參見操作指南錄制存儲至OSS。
二,通過調用AddLiveAppRecordConfig - 添加錄制配置API配置。
//需要將<>內容替換成實際使用的值
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字符(匹配變量后),具體支持變量請參見AddLiveAppRecordConfig - 添加錄制配置API說明。
<OssEndpoint>可通過<OssBucket>所屬地域在OSS訪問域名和數據中心進行查看。
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
錄制文件管理
視頻直播支持兩種方式進行錄制文件管理:
1,通過控制臺操作,詳情請參見控制臺操作指南錄制文件管理。
2,通過調用API進行操作。接下來將通過示例介紹如何通過Java SDK對錄制文件進行刪除。
查詢錄制文件信息。
說明目前刪除錄制文件需要指定索引文件ID,所以需要先查詢出錄制文件信息獲取到索引文件ID再進行刪除。
//需要將<>內容替換成實際使用的值 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中的文件(視頻直播儲存的是錄制文件信息,如AppName,StreamName,OSS文件儲存路徑等,文件是儲存在OSS中),則需要創建服務角色AliyunMTSVideoLifecycleRole,并精確授權AliyunMTSVideoLifecycleRolePolicy系統策略,具體操作可參見在視頻直播控制臺刪除錄制文件。
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。
更多刪除直播錄制文件接口說明,請參見DeleteLiveStreamRecordIndexFiles - 刪除直播錄制文件API。
其他刪除文件方法
刪除超過6個月的文件:由于只能查詢6個月以內的錄制文件信息,若要刪除超過6個月的文件請通過OSS進行,詳情請參見OSS刪除文件。
過期刪除錄制文件:由于媒體資源均存放在OSS的Bucket中,需要授權訪問才能正常刪除錄制文件,您可以點擊授權進行一鍵授權。授權后,再提交工單申請,我們會在后臺為您配置您需要的過期時間。關于如何提交工單,請參見聯系我們。配置過期時間后,錄制文件過期刪除功能授權操作即為完成。
云資源訪問授權是對系統創建,供視頻直播使用授予訪問云資源權限的角色。授權后如果誤刪角色,可進行重新授權。
相關文檔
使用Java SDK,可參見Java SDK使用說明。