建立 DVR 工作階段

本頁面說明如何使用 Live Stream API,從直播串流建立數位錄影機 (DVR) 工作階段。你可以在直播期間和結束後觀看 DVR 內容。

DVR 工作階段和頻道短片的差異

DVR 工作階段與頻道片段 (又稱為 VOD 片段) 類似,但有以下幾項主要差異:

  • DVR 工作階段:
    • API 會將 DVR 資訊清單儲存在與直播串流片段相同的位置,因此不會再將資料複製到 Cloud Storage。DVR 資訊清單與直播資訊清單類似,但長度較長。當保留時間結束時,系統會刪除資訊清單和片段檔案。
    • 你可以為過去、現在和未來的內容建立 DVR 工作階段。舉例來說,DVR 工作階段可以追蹤直播,或是安排 DVR 工作階段在未來的某個時間開始和停止。
    • DVR 工作階段的一般用途是支援直播活動的 DVR 功能。舉例來說,觀眾可以在直播開始後一小時加入,並以一小時的延遲時間 (或略過部分內容) 觀看內容。
  • 頻道短片:
    • Live Stream API 會將短片資訊清單和相關的片段檔案複製到使用者指定的目錄,以便在保留期間結束時不刪除。你可以完全掌控短片。
    • 只能剪輯過往的內容。不支援直播短片和排定日後的短片。
    • 剪輯片段的常見用途是封存直播內容,讓直播內容可無限期做為 VOD 檔案使用。

如要進一步瞭解頻道短片,請參閱「從直播內容建立 VOD 短片」。

設定 Google Cloud 專案和驗證

如果您尚未建立 Google Cloud 專案和憑證,請參閱「開始前」一節。

建立輸入端點

如要建立輸入端點,請使用 projects.locations.inputs.create 方法。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_NUMBER:您的 Google Cloud 專案編號,位於 IAM 設定頁面上的「專案編號」欄位
  • LOCATION:建立輸入端點的位置;請使用支援的地區之一
    顯示地區
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID:使用者定義的識別碼,用於建立新的輸入端點 (您會將輸入串流傳送至此)。這個值的長度必須介於 1 至 63 個半形字元之間,開頭和結尾須為 [a-z0-9],字元之間可以包含破折號 (-)。例如:my-input

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

這個指令會建立長期執行作業 (LRO),您可以使用該作業追蹤要求的進度。詳情請參閱「管理長時間執行的作業 」。

取得輸入端點詳細資料

如要取得輸入端點的詳細資料,請使用 projects.locations.inputs.get 方法。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_NUMBER:您的 Google Cloud 專案編號,位於 IAM 設定頁面上的「專案編號」欄位
  • LOCATION:輸入端點的位置;請使用其中一個支援的地區
    顯示地區
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID:輸入端點的使用者定義 ID

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
  "createTime": CREATE_TIME,
  "updateTime": UPDATE_TIME,
  "type": "RTMP_PUSH",
  "uri":  "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b",
  "tier": "HD"
}

找出 uri 欄位,並複製傳回的 INPUT_STREAM_URI,以便稍後在「傳送輸入測試串流」一節中使用。

建立管道

如要建立管道,請使用 projects.locations.channels.create 方法。以下範例會建立可產生 HLS 直播的管道。直播內容包含單一高畫質 (1280x720) 呈現方式。

如要啟用 DVR 工作階段建立功能,請將 retentionConfig 物件新增至頻道設定。

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

為直播頻道啟用保留功能後,系統會保留直播串流片段和資訊清單,以便建立 DVR 工作階段。retentionWindowDuration 物件會指定直播輸出內容上傳至 Cloud Storage 後的儲存時間長度。保留期間是從在 Cloud Storage 中建立區隔時起算。

保留期限上限為 30 天。保留時間結束後,系統會自動從 Cloud Storage 刪除片段檔案、直播資訊清單和 DVR 資訊清單。您無法使用已刪除的區隔建立 DVR 工作階段。刪除程序為非同步作業,可能需要 24 小時才能完成。

指定資訊清單的,即可啟用 DVR 工作階段建立功能。您會在實際建立工作階段時參照這個鍵。僅支援 HLS 資訊清單。

"manifests": [
{
  ...
  "key": "manifest_hls"
}

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_NUMBER:您的 Google Cloud 專案編號,位於 IAM 設定頁面上的「專案編號」欄位
  • LOCATION:建立管道的所在位置;請使用支援的區域之一
    顯示地區
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:要建立的管道使用者定義的 ID,這個值必須介於 1 至 63 個半形字元之間,開頭和結尾須為 [a-z0-9],字元之間可包含破折號 (-)
  • INPUT_ID:輸入端點的使用者定義 ID
  • BUCKET_NAME:您建立的 Cloud Storage 值區名稱,用於保存即時串流資訊清單和區段檔案

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

這個指令會建立長期執行作業 (LRO),您可以使用該作業追蹤要求的進度。詳情請參閱「管理長時間執行的作業 」。

啟動管道

如要啟動管道,請使用 projects.locations.channels.start 方法。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_NUMBER:您的 Google Cloud 專案編號,位於 IAM 設定頁面上的「專案編號」欄位
  • LOCATION:頻道所在位置;請使用支援的區域之一
    顯示地區
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:管道的使用者定義 ID

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "start",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

這個指令會建立長期執行作業 (LRO),您可以使用該作業追蹤要求的進度。詳情請參閱「管理長時間執行的作業 」。

傳送輸入測試串流

開啟新的終端機視窗。使用「取得輸入端點詳細資料」一節中的 INPUT_STREAM_URI 執行下列指令:

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv INPUT_STREAM_URI

建立 DVR 工作階段

如要建立 DVR 工作階段,請使用 projects.locations.channels.dvrSessions.create 方法。

請使用 dvrManifests 陣列中的 manifestKey 欄位,指定要儲存內容的資訊清單。在本頁的管道設定範例中,這個鍵設為 manifest_hls

您可以將直播的多個時間段落合併為單一 DVR 工作階段,方法是將 timeInterval 物件新增至 dvrWindows 陣列。

"dvrManifests": [
  {
    "manifestKey": "manifest_hls"
  }
],
"dvrWindows": [
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:03:20.000Z",
      "endTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:05:20.000Z",
      "endTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

注意事項:

  • 每個 DVR 工作階段在 dvrWindows 中至少必須包含一個 timeInterval
  • dvrManifests.manifestKey 欄位必須參照 DVR 工作階段父項頻道中定義的 HLS 資訊清單。如果 DVR 工作階段建立要求成功,則系統會在 dvrManifests.outputUri 欄位中傳回產生的 DVR 資訊清單 URI。這個 URI 位於頻道 outputUri 欄位指定的路徑中。
  • dvrManifests 陣列僅支援每個要求一個資訊清單。如果您想為同一個 DVR 視窗產生多個資訊清單,就必須將資訊清單分割成多個 DVR 工作階段。
  • timeInterval 物件集合不得重疊,且必須依時間順序排列。startTime 必須早於每個 timeInterval 中的 endTime
  • startTimeendTime 是指直播時間軸。如果資訊清單啟用了嵌入式時間碼,這個時間軸就會根據輸入串流中提供的嵌入式時間碼,可能與時鐘時間不同。
  • DVR 倒帶時間範圍的總時間上限為 24 小時。
  • dvrWindows 中最後一個 timeIntervalendTime 可以留空。在這種情況下,系統會自動計算 endTime,以便將 DVR 工作階段的總時間 (即 24 小時) 盡可能拉長。
  • DVR 段落可涵蓋任何時間範圍,包括未來的時間範圍。不過,dvrWindows 延後至未來時間的 DVR 工作階段數量上限為 1。
  • 如果所有 DVR 時段都嚴格限定在過去,則 DVR 工作階段數量沒有限制。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_NUMBER:您的 Google Cloud 專案編號,位於 IAM 設定頁面上的「專案編號」欄位
  • LOCATION:頻道所在位置;請使用支援的區域之一
    顯示地區
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:管道的使用者定義 ID
  • DVR_SESSION_ID:DVR 工作階段的使用者定義 ID
  • INTERVAL_START_TIME:原始直播資訊清單中的 Unix Epoch 紀元時間;使用 RFC3339 世界標準時間「Zulu」格式的時間戳記 (例如 2014-10-02T15:01:23Z)
  • INTERVAL_END_TIME:原始直播資訊清單中的 Mark-out Unix Epoch 時間;使用 RFC3339 世界標準時間「Zulu」格式的時間戳記 (例如 2014-10-02T15:01:23Z)

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

這個指令會建立長期執行作業 (LRO),您可以使用該作業追蹤要求的進度。詳情請參閱「管理長時間執行的作業 」。

取得 DVR 工作階段

如要取得 DVR 工作階段,請使用 projects.locations.channels.dvrSessions.get 方法。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_NUMBER:您的 Google Cloud 專案編號,位於 IAM 設定頁面上的「專案編號」欄位
  • LOCATION:頻道所在位置;請使用支援的區域之一
    顯示地區
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:管道的使用者定義 ID
  • DVR_SESSION_ID:DVR 工作階段的使用者定義 ID

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "dvrManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
    }
  ],
  "dvrWindows": [
    {
      "timeInterval": {
        "startTime": "INTERVAL_START_TIME",
        "endTime": "INTERVAL_END_TIME"
      }
    }
  ]
}

回應應包含 state 欄位,指出工作階段的狀態:

{
  ...
  "state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
  ...
}

如需狀態清單和說明,請參閱 state 參考說明文件。

驗證值區內容

開啟 DVR 工作階段的 dvrManifests.outputUri 欄位中指定的 Cloud Storage 值區。確認該資料夾包含下列檔案和目錄:

  • DVR 工作階段的頂層資訊清單,名稱與頻道設定中指定的 manifests.fileName 相同 (例如 main.m3u8)。您可以使用線上媒體播放器播放這個資訊清單。
  • 頻道中指定的每個 muxStreams.key 的子目錄 (例如 mux_video_ts)。每個子目錄都包含 DVR 工作階段的播放清單 (例如 index-1.m3u8)。

播放 DVR 工作階段

如要在 Shaka Player 中播放產生的媒體檔案,請完成下列步驟:

  1. 將您建立的 Cloud Storage bucket 設為可公開讀取
  2. 如要在 Cloud Storage 值區中啟用跨來源資源共享 (CORS),請按照下列步驟操作:
    1. 建立包含下列內容的 JSON 檔案:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. JSON_FILE_NAME 替換為您在前一個步驟建立的 JSON 檔案名稱後,執行下列指令:
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. 在 Cloud Storage 值區中,找出系統產生的檔案。在該檔案的「Public access」(公開存取權) 資料欄中,按一下「Copy URL」(複製網址)
  4. 前往 Shaka Player (這是一個線上即時串流播放器)。
  5. 按一下頂端導覽列中的「Custom Content」(自訂內容)
  6. 按一下「+」按鈕。
  7. 將檔案的公開網址貼到「Manifest URL」(資訊清單網址) 方塊中。

  8. 在「Name」(名稱) 方塊中輸入名稱。

  9. 按一下「Save」(儲存)

  10. 按一下「Play」(播放)

這時候應該就會看到即時串流內容以測試模式播放。

測試圖案影片

廣告插播事件

如果您為直播建立廣告插播事件,DVR 工作階段就會包含直播中顯示的廣告區隔。