全部產品
Search
文件中心

ApsaraVideo Live:直播錄製

更新時間:Dec 04, 2024

ApsaraVideo for Live錄製可對當前直播即時錄製並可回放歷史直播視頻。本文將詳細為您介紹ApsaraVideo for Live錄製功能。

功能介紹

ApsaraVideo for Live是通過播放地址以即時資料流的形式播放推流端的資料,如果想要在直播結束後再次觀看或修改直播內容,就必須要使用ApsaraVideo for Live的錄製功能。

ApsaraVideo for Live錄製功能,就是將直播中心接收到的推流資料進行錄製,儲存至您指定的儲存位置。目前直播錄製儲存提供兩種方式,錄製儲存至VOD錄製儲存至OSS

直播錄製的原理

直播錄製的過程,是通過拉取您推上來的直播流,將音視頻封裝成單獨的一個個媒體切片(封裝格式為TS),然後進行儲存。直播錄製在工作時遵循以下原則:

  • 直播錄製只修改音視頻的封裝格式(RTMP/FLV轉成TS),絕不修改音視頻內容(即編碼層內容)。舉個例子,如果您推上來的直播流是花屏的,那錄製下來的也是花屏的。

  • 直播錄製有許可權往使用者儲存地址寫入錄製檔案,但是不會也沒有許可權修改/刪除使用者儲存地址的任務檔案(包括已寫入的錄製檔案)。使用者儲存地址中的錄製檔案,完全由您自己管理。

功能對比

錄製儲存至VOD和錄製儲存至OSS都可以對直播內容進行錄製儲存。兩者使用情境有所不同,您可以根據您自己的業務決定具體採用哪種方式進行儲存。

儲存方式

關聯產品服務

封裝格式

適用情境

錄製儲存至VOD

開通ApsaraVideo for VOD服務

TS/M3U8

傾向於對錄製內容進行二次生產,注重錄製內容後期處理,如剪輯,播放,設定錄製視頻封面等。

錄製儲存至OSS

開通OSS服務

  • TS/M3U8

  • MP4

  • FLV

  • CMAF

    說明

    不管是哪種封裝格式,直播錄製都會先將直播流切片成一個個的TS切片,然後再合成對應封裝格式的錄製檔案。

傾向於錄製內容管理,注重儲存。

說明

同一個直播流不能同時配置兩種儲存方式。

限制條件

音視頻編碼格式

由於直播錄製需要先將直播流切分成TS檔案,因此您推上來的直播流的音視頻編碼格式必須滿足TS封裝格式的要求。根據FLV標準和ISO/IEC 13818-1標準,直播錄製目前僅支援以下編碼格式:

  • 視頻:H264、HEVC、MPEG4

  • 音頻:AAC、MP3

說明

如果直播流包含了非以上格式編碼的音視頻,直播錄製可能會出現:無法產生錄製檔案、錄製黑屏、錄製沒有聲音,以及其他一些無法預見的異常情況。

異常的直播流

對於正常的直播流(沒有不支援的編碼格式、幀率穩定、時間戳記單調線性增長),直播錄製均能正常產生錄製檔案。當然,對於偶爾幀率不穩定,時間戳記跳變的流,直播錄製也能做出一定的相容,保證錄製檔案的正常產生。但是如果推上來的直播流存在嚴重異常(長時間沒有視訊框架,時間戳記增長沒有規律,音視頻頭缺失等等),直播錄製可能無法保證正常產生錄製檔案。

錄製儲存至VOD

前置條件

若採用錄製儲存至VOD方式進行直播錄製功能配置,需要開通ApsaraVideo for VOD服務啟用點播系統Bucket

重要
  • 錄製檔案儲存體在ApsaraVideo for VODVOD中,會產生儲存費用,在VOD中計費請參見點播基礎服務計費

  • 在啟用點播系統Bucket時,需要注意點播系統Bucket需要與待佈建網域名的直播中心同地區。

  • 使用金融雲帳號不可使用視訊直播錄製到點播。

功能配置

完成前置條件相關內容之後,就可以進行錄製儲存至VOD配置。

ApsaraVideo for Live目前提供兩種方式添加錄製儲存至VOD配置。

控制台配置錄製儲存至VOD

  1. 登入ApsaraVideo for Live控制台
  2. 在左側導覽列選擇功能管理>直播錄製,進入直播錄製頁面,選擇儲存至VOD配置頁簽。

  3. 選擇待配置的播流網域名稱。

  4. 單擊添加

  5. 配置錄製模板。

    image

    錄製模板參數及說明如下表所示。

    參數

    描述

    AppName

    視頻的應用程式名稱,輸入的AppName必須與直播推流的AppName保持一致,方可生效。如果您想要進行網域名稱層級錄製,輸入星號(*)即可。

    StreamName

    儲存至VOD支援流層級的錄製。您只需輸入指定的流名稱即可。如果您想要進行全部流錄製,即該AppName下的流全部錄製,輸入星號(*)即可。

    說明

    AppNameStreamName參數支援英文、數字、“-”、“_”符號,長度限制在255個字元以內。

    儲存地址

    選擇儲存位置。

    錄製周期

    錄製周期範圍為15~360分鐘,最大支援 6 小時錄製。超過 6 小時,系統將按照錄製命名規則產生新檔案。ts切片時間長度預設為 30s。

    說明

    錄製周期為當前直播轉為點播檔案後的最大時間長度。

    錄製轉碼模板

    從列表中選擇儲存轉碼規則,可以在點播服務中對錄製的視頻進行轉碼處理。

    儲存轉碼規則設定是將錄製下來的視頻轉換為可供傳播的點播檔案格式。可轉碼為不同規格的視頻,也可以不轉碼即保持原畫格式。

    錄製轉碼模板具體操作,請參見ApsaraVideo for VOD轉碼配置

    說明

    ApsaraVideo for VOD轉碼模板所在地區需與您當前網域名稱所在地區保持一致。例如:當前網域名稱為華東2區,ApsaraVideo for VOD轉碼模板地區也需要在華東2區。

    自動合并開關

    開啟後可在直播錄製結束後自動將多個錄製周期檔案合并成一個錄製檔案儲存體到VOD中。

    說明

    開啟多錄製周期合并,會使用ApsaraVideo for VOD服務的基礎剪輯合成功能和轉碼功能。計費詳情參見剪輯合成計費媒資轉碼計費

    自定合并轉碼模板

    從列表中選擇儲存轉碼規則,對自動合成出來的視頻在點播服務中進行一次轉碼,錄製轉碼規則從當前點播系統中擷取。自動合并轉碼模板具體操作,請參見轉碼模板

    說明

    ApsaraVideo for VOD轉碼模板所在地區需與您當前網域名稱所在地區保持一致。例如:當前網域名稱為華東2區,ApsaraVideo for VOD轉碼模板地區也需要在華東2區。

  6. 單擊確定

API配置錄製儲存至VOD

//需要將<>內容替換成實際使用的值
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

  • 配置轉碼後,會對錄製檔案進行轉碼(原檔案仍然保留),產生轉碼地址。

錄製內容合并

錄製內容合并目前分為兩種形式:

  1. 同一路流斷流180秒以內再次推流,錄製內容會自動合并成一個錄製檔案。

  2. 推流時間長度超過錄製周期之後的檔案合并。在推流時間長度超過錄製周期之後,會產生一個新的錄製檔案(假設設定錄製周期5分鐘,推流時間長度8分鐘,一次推流將會產生兩個錄製檔案)。

    如果需要將多個錄製周期的檔案進行合并,可以進行合并配置。

    重要

    開啟多錄製周期合并,會使用ApsaraVideo for VOD服務的基礎剪輯合成功能和轉碼功能。計費詳情參見 增值服務計費以及基礎服務計費

    配置錄製檔案合并範例程式碼如下:

    addLiveRecordVodConfigRequest.setAutoCompose("ON");
    addLiveRecordVodConfigRequest.setComposeVodTranscodeGroupId("<TranscodeGroupId>");
    說明
    • 合并之後會產生一個新的檔案,原錄製檔案仍然保留。

    • 轉碼模板需要在點播系統進行配置,具體操作請參見點播轉碼模板

    • <TranscodeGroupId>為點播系統配置的轉碼模板組ID

    設定錄製周期時間長度範例程式碼如下:

    //單位秒,取值範圍(300~21600),預設值900
    addLiveRecordVodConfigRequest.setCycleDuration(<300>);

錄製檔案管理

目前可以通過ApsaraVideo for Live控制台查看儲存至VOD的錄製檔案,若要對錄製檔案進行管理請通過ApsaraVideo for VOD進行,詳情請參見ApsaraVideo for VOD媒體管理

在ApsaraVideo for Live控制台查看儲存至VOD錄製檔案

  1. 登入ApsaraVideo for Live控制台
  2. 在左側導覽列選擇功能管理>直播錄製,進入直播錄製頁面,選擇錄製管理檔案頁簽。

  3. 選擇配置的播流網域名稱。

  4. 單擊儲存至VOD頁簽。

    image

錄製儲存至OSS

前置條件

若採用錄製儲存至OSS方式進行直播錄製功能配置,需要開通OSS服務以及建立Bucket,具體操作請參見配置OSS

重要
  • 錄製檔案儲存體在OSS中,會產生儲存費用,在OSS中計費請參見儲存費用

  • OssBucket需要與待佈建網域名的直播中心同地區。

功能配置

完成前置條件相關內容之後,就可以進行錄製儲存至OSS配置。

ApsaraVideo for Live目前提供兩種方式添加錄製儲存至OSS配置。

控制台配置錄製儲存至OSS

  1. 登入ApsaraVideo for Live控制台
  2. 在左側導覽列選擇功能管理>直播錄製,進入直播錄製頁面,選擇儲存至OSS配置頁簽。

  3. 選擇待配置的播流網域名稱。

  4. 單擊添加

  5. 配置錄製模板。

    image

    表 1. 錄製模板參數

    參數

    描述

    AppName

    視頻的應用程式名稱,輸入的AppName必須與直播推流地址的AppName保持一致,方可生效。如果您想要進行網域名稱層級錄製,輸入星號(*)可。

    StreamName

    儲存至OSS支援流層級的錄製。您只需輸入指定的流名稱即可。如果您想要進行全部流錄製,即該AppName下的流全部錄製,輸入星號(*)可。

    說明
    • AppNameStreamName參數支援英文、數字、短劃線(-)、底線(_)符號,長度限制在255字元以內。

    • AppNameStreamName參數如果使用(*)號需注意

      • (*)號不能匹配任一字元串,只能通配當前已有的應用程式名稱或流名稱。

      • (*)號無法在字串中進行通配。

    儲存位置

    選擇儲存位置。

    說明

    儲存Bucket列表中包含標準Bucket和媒體Bucket。標準Bucket是OSS Bucket,用於儲存。媒體Bucket是MPS定製的Bucket,存入媒體Bucket中的視頻,可執行MPS轉碼任務。目前Bucket列表中,未對Bucket做區分。如果您需要將視頻轉成媒體檔案,需要自行記住對應的媒體Bucket的名稱,方便您後期視頻轉成媒體檔案儲存位置的選擇。

    斷流拼接時間長度

    直播斷流時間長度超過設定的拼接時間長度後,將會產生新檔案,斷流拼接時間長度支援15~21600秒。

    儲存格式

    支援flvm3u8mp4cmaf四種格式。

    說明

    至少配置一個儲存格式,其中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 }

    樣本

    AppNameliveApp****StreamNameliveStream****,當錄製m3u8格式的儲存路徑為record/liveApp****/liveStream****/{EscapedStartTime}_{EscapedEndTime }

    單個TS時間長度

    單個切片時間長度,預設為30秒。支援單個TS時間長度範圍5~30秒。

    錄製周期

    錄製周期範圍為15分鐘~360分鐘,最大支援6小時錄製。超過6小時,系統將按照錄製命名規則產生新檔案。

    說明

    錄製周期為當前直播轉為點播檔案後的最大時間長度。

    image

    表 2. 錄製轉碼流參數

    參數

    描述

    錄製轉碼流

    開啟錄製轉碼流開關,配置參數。

    儲存格式

    支援flvm3u8mp4cmaf四種格式。

    說明

    至少配置一個儲存格式,其中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 }

    樣本

    AppNameliveApp****StreamNameliveStream****轉碼模板ID為lld,當錄製m3u8格式的實際儲存路徑為transcodeRecord/liveApp****/liveStream****_lld/{EscapedStartTime}_{EscapedEndTime }

    單個TS時間長度

    單個切片時間長度,預設為30秒。支援單個TS時間長度5~30秒。

    錄製周期

    錄製周期範圍為15分鐘~360分鐘,最大支援6小時錄製。超過6小時,系統將按照錄製命名規則產生新檔案。

    說明

    錄製周期為當前直播轉為點播檔案後的最大時間長度。

    轉碼模板ID

    支援選擇指定轉碼模板(上限10個)或全部轉碼模板。

    轉碼模板所屬AppName需和錄製模板保持一致才可生效,若無轉碼模板,請先添加轉碼模板,請參見通用轉碼

  6. 單擊確定

API配置錄製儲存至OSS

        //需要將<>內容替換成實際使用的值
        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的形式。

  • 若您的直播流錄製配置了多種儲存格式,此操作會將多種儲存格式一起重新整理。

錄製內容合并與提取

ApsaraVideo for Live支援通過建立索引檔案將錄製內容按照時間段提取出檔案,也可以將起止時間段內的多個錄製檔案內容合并為一個。

說明
  • 無論錄製內容最終儲存成哪種格式,直播錄製都會先將直播流切片成一個個的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索引檔案資訊)儲存在ApsaraVideo for Live中,檔案(TS分區檔案和M3U8索引檔案)儲存在OSS中。

  • 儲存在OSS中的檔案儲存時間由OSS的儲存配置決定。

  • TS分區檔案資訊在ApsaraVideo for Live系統中僅儲存3個月,建立M3U8索引檔案只能選擇最近3個月的錄製內容。

  • M3U8索引檔案資訊在ApsaraVideo for Live系統中僅儲存6個月,若要查詢僅能查詢6個月內建立的索引檔案的資訊。

  • 如要合并或提取轉碼流,需要將StreamName設定成StreamName_轉碼模板ID的形式。

  • <OssBucket>需要與直播中心同地區,否則無法通過網域名稱查詢到建立的M3U8索引檔案資訊。

相關API

錄製檔案管理

查看錄製檔案

ApsaraVideo for Live支援三種方式進行錄製檔案查看。

控制台查看錄製檔案

  1. 登入ApsaraVideo for Live控制台
  2. 在左側導覽列選擇功能管理>直播錄製,進入直播錄製頁面,選擇錄製管理檔案頁簽。

  3. 選擇待配置的播流網域名稱。

  4. 單擊儲存至OSS頁簽。

    image

API查看錄製檔案

        //需要將<>內容替換成實際使用的值 
        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)));

        }
重要

OSS查看錄製檔案

在配置錄製功能時,您已指定了錄製檔案在OSS中的儲存地址。如果需要在OSS中查看錄製檔案,可參見OSS列舉檔案

刪除錄製檔案

ApsaraVideo for Live儲存的是錄製檔案資訊,如AppName,StreamName,OSS檔案儲存路徑等,檔案是儲存在OSS中。如果在刪除錄製時需要同步刪除儲存在OSS中的檔案,則需要建立服務角色AliyunMTSVideoLifecycleRole,並精確授權AliyunMTSVideoLifecycleRolePolicy系統策略。

詳細授權過程

在直播控制台刪除錄製檔案時需要先進行授權,您需要按照如下步驟在RAM控制台建立並授權RAM角色後,再登入直播控制台刪除錄製檔案。

  1. 使用阿里雲帳號登入RAM控制台

  2. 在左側導覽列,選擇身份管理 > 角色

  3. 角色頁面,單擊建立角色

  4. 選擇類型頁簽,可信實體類型選擇阿里雲服務,單擊下一步image

  5. 配置角色頁簽,請按照以下參數配置:

    • 角色類型:普通服務角色

    • 角色名稱:AliyunMTSVideoLifecycleRole

    • 備忘:該參數為可選,您可以按照需求自訂填寫。

    • 選擇受信服務:多媒體轉碼服務

    配置完成後,單擊完成image

  6. 建立完成頁簽,提示角色建立成功後,單擊精確授權

  7. 添加許可權頁簽,請按照以下參數配置:

    • 選擇權限類別型:系統策略

    • 輸入策略名稱稱:AliyunMTSVideoLifecycleRolePolicy

    配置完成後,單擊確定image

目前有三種方式進行錄製檔案刪除。

控制台刪除錄製檔案

  1. 登入ApsaraVideo for Live控制台
  2. 在左側導覽列選擇錄製檔案管理

  3. 選擇待刪除錄製檔案的網域名稱。

  4. 單擊儲存至OSS頁簽,選擇刪除

    刪除錄製檔案

  5. 單擊確定

    同步刪除選項預設不選中。若選中此選項,則在刪除ApsaraVideo for Live控制台上錄製檔案記錄時會同步刪除OSS中的錄製檔案。確定刪除

API刪除錄製檔案

        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));
重要

OSS刪除錄製檔案

一般情況下,不建議您直接刪除儲存在OSS中的錄製檔案。如果需要刪除儲存在OSS中的錄製檔案,可以通過ApsaraVideo for Live刪除錄製檔案時同步刪除儲存在OSS中的檔案。如果您因為業務需求需要直接刪除儲存在OSS中的錄製檔案,可參考文檔OSS刪除檔案

其他刪除檔案方法

刪除超過6個月的檔案:由於只能查詢6個月以內的錄製檔案資訊,若要刪除超過6個月的檔案請通過OSS進行,詳情請參見OSS刪除檔案

到期刪除錄製檔案:由於媒體資源均存放在OSS的Bucket中,需要授權訪問才能正常刪除錄製檔案,您可以點擊授權進行一鍵授權。授權後,再提交工單申請,我們會在後台為您配置您需要的到期時間。關於如何提交工單,請參見聯絡我們。配置到期時間後,錄製檔案到期刪除功能授權操作即為完成。

說明

雲資源訪問授權是對系統建立,供ApsaraVideo for Live使用授予訪問雲資源許可權的角色。授權後如果誤刪角色,可進行重新授權。

相關文檔

使用Java SDK,可參見Java SDK使用說明

更多錄製回調功能使用,可參見直播錄製回調以及按需錄製回調