即時 API:通知

本主題顯示如何為Live API作業設置通知。

簡介

Brightcove Live系統發送各種事件的通知。您可以為通知設置偵聽器,以觸發進一步的操作。可以使用您使用的任何服務器端語言編寫偵聽器,並且偵聽器將查找傳入的POST請求,解析JSON請求主體,然後執行所需的任何操作。在下面,我們將看到您如何請求通知。

請求通知

您可以通過添加一個或多個來請求通知notifications輸出中的字段建立工作請求。

的價值notifications是通知目標對象的數組。您可以使用帶有URL的簡單字符串:"https://httpbin.org/post",或者您可以使用具有以下選項的對象:{"url": "https://httpbin.org/post", "credentials": "reference_to_your_credentials"}。當輸出更改其狀態時,將向您指定的目的地發送通知。如果將此參數應用於VOD輸出,則通知將僅與該VOD作業相關,而不與實時作業相關。

以下是一些範例:

現場工作通知

{
    "live_stream": true,
    "region": "us-west-2",
    "reconnect_time": 20,
    "notifications": [
      {"url": "https://httpbin.org/post/URLA",
        "credentials": "reference_to_your_credentials",
        "event": "first_segment_uploaded"},
      {"url": "https://httpbin.org/post/URLB",
      "credentials": "reference_to_your_credentials",
      "event": "state_changed"}
      ],
    "outputs": [
    {
        "label": "hls360p",
        "live_stream": true,
        "height": 360,
        "video_bitrate": 650,
        "segment_seconds": 6
    },
    {
        "url":"s3://YOURBUCKET/path/filename.mp4",
        "credentials": "accConfiguredCredsAWSIdSecret",
        "notifications":    [
        {
            "url": "https://httpbin.org/post?vodStateChange"
        },
        {
            "url": "https://httpbin.org/post?vodFinished",
            "event": "output_finished"
        }
        ]
    }]
}

直播到VOD的通知(output_finished僅活動)

{
  "videocloud": {
    "video": {
      "name": "video name"
    }
  },
  "notifications": [{
    "url": "https://httpbin.org/post?vodFinished",
    "event": "output_finished"
  }]
}

直播到VOD的通知(所有事件)

{
  "videocloud": {
    "video": {
      "name": "video name"
    }
  },
  "notifications": [{
    "url": "https://httpbin.org/post"
  }]
}

重試策略

如果發送通知的請求失敗,則默認重試策略是重試50次,兩次嘗試之間存在指數延遲。

          max_retry_times = 50
          delay_delta_s = 5
          next_retry = now_s + retry_count * delay_delta_s

活動

以下是您可以聽取的工作生命週期事件。請注意,事件範圍是針對每個作業的,因此實時作業的事件生命週期將與基於相同實時流的VOD裁剪作業的生命週期分開。

  • state_changed -現場工作的狀態已更改;有關詳細信息,請參見下表
  • first_segment_uploaded -實時流的第一段上傳到原始位置
  • output_finished -直播活動已經結束,並且VOD處理已創建至少一個音頻和一個視頻再現,或一個漸進式MP4再現

state_changed將通知下表中描述的以下狀態

現場工作狀態
國家 描述
工作狀態(在通知中報告為state
error 發生錯誤;工作將不會被處理。
standby (僅適用於靜態入口點[SEP]作業。)作業已分配並準備激活。
waiting 作業已分配給流工作者,並準備好連接編碼器。
processing 連接了編碼器,並且可以播放作業。
disconnected 編碼器已斷開連接,流工作者正在等待重新連接。
cancelling 工作已取消,工作者正在停止工作,而且不會處理任何擱置的 VOD 輸出。
finishing 編碼器已斷開連接超過reconnect_time,並且流媒體工作者正在停止作業並創建任何關聯的VOD輸出。
cancelled 工作已成功取消。
finished 工作已成功完成。
failed 工作因系統錯誤而停止。
VOD工作狀態(在通知中報告為jvod_state
error 發生錯誤;工作將不會被處理。
waiting 等待處理的作業。
waiting_finish_live 等待實時作業結束的作業(如果片段取決於該作業)。
processing 剪輯正在處理中。
creating_asset 正在創建VOD資產。
cancelling 工作已取消,工作者正在停止工作,而且不會處理任何擱置的 VOD 輸出。
cancelled 工作已成功取消。
finished 工作已成功完成。
failed 工作因系統錯誤而停止。
SSAI國家(在通知中報告為ssai_state
none 該工作不是SSAI工作。
waiting_input 流工作者正在等待編碼器連接並提供流輸入信息。
start_transcoding 編碼器已連接,並且已根據流輸入數據和輸出數據對SSAI進行排隊以進行轉碼。
transcoding 該板岩正在轉碼。
error 該板岩無法下載或轉碼。
ready 板岩已生成,並且該作業已準備好進行SSAI播放。
SEP國家(在通知中報告為sep_state
none 該作業不是SEP作業。
ready 入口點已激活,可以連接編碼器。
pending_activation 入口點已排隊等待流工作者分配。
activation_in_progress 入口點正在更新,以將連接路由到流工作者。
pending_deactivation 進入點已排入佇列,以便從串流工作者清理。
deactivation_in_progress 進入點正在中斷與串流工作者的連線。
cancelled 入口點已被取消。
finished 進入點已順利完成。
RTMP輸出狀態(報告為rtmp_output_state_changed通知為state
starting 流正在開始。
connected 編碼器已連接。
Disconnected 編碼器已中斷連線。
error 串流無法連線。
pending_deactivation 進入點已排入佇列,以便從串流工作者清理。
deactivation_in_progress 進入點正在中斷與串流工作者的連線。
cancelled 入口點已被取消。
finished 進入點已順利完成。

通知樣本

直播通知

這是有關state_changed現場工作的活動:

          {
              "outputs": [
                  {
                      "rfc_6381_video_codec": null,
                      "finished_at": "2017-10-19T20:08:11.115Z",
                      "segment_seconds": 4,
                      "created_at": "2017-10-19T19:47:04.534Z",
                      "privacy": false,
                      "md5_checksum": null,
                      "audio_codec": "AAC",
                      "error_class": null,
                      "updated_at": "2017-10-19T20:08:11.115Z",
                      "video_bitrate_in_kbps": 2150.4,
                      "id": "0-621669558be84a7da4ff20bccb9a6a1a",
                      "state": "cancelled",
                      "playback_url": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_0\/chunklist.m3u8",
                      "duration_in_ms": 1156873,
                      "file_size_bytes": null,
                      "height": 720,
                      "playback_url_dvr": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_0\/chunklist_dvr.m3u8",
                      "error_message": null,
                      "video_codec": "H.264",
                      "audio_bitrate_in_kbps": 196.608,
                      "fragment_duration_in_ms": null,
                      "test": false,
                      "playback_url_vod": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_0\/chunklist_vod.m3u8",
                      "total_bitrate_in_kbps": 2347.008,
                      "format": null,
                      "label": "hls720p",
                      "frame_rate": null,
                      "video_codec_profile": "high",
                      "keyframe_interval": 60,
                      "keyframe_interval_follow_source": false,
                      "live_stream": true,
                      "channels": null,
                      "playback_added_cdns": [

                      ],
                      "width": 1280,
                      "rfc_6381_audio_codec": null,
                      "audio_sample_rate": null
                  },
                  {
                      "rfc_6381_video_codec": null,
                      "finished_at": "2017-10-19T20:08:11.115Z",
                      "segment_seconds": 4,
                      "created_at": "2017-10-19T19:47:04.534Z",
                      "privacy": false,
                      "md5_checksum": null,
                      "audio_codec": "AAC",
                      "error_class": null,
                      "updated_at": "2017-10-19T20:08:11.115Z",
                      "video_bitrate_in_kbps": 1536,
                      "id": "1-621669558be84a7da4ff20bccb9a6a1a",
                      "state": "cancelled",
                      "playback_url": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_1\/chunklist.m3u8",
                      "duration_in_ms": 1156873,
                      "file_size_bytes": null,
                      "height": 540,
                      "playback_url_dvr": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_1\/chunklist_dvr.m3u8",
                      "error_message": null,
                      "video_codec": "H.264",
                      "audio_bitrate_in_kbps": 196.608,
                      "fragment_duration_in_ms": null,
                      "test": false,
                      "playback_url_vod": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_1\/chunklist_vod.m3u8",
                      "total_bitrate_in_kbps": 1732.608,
                      "format": null,
                      "label": "hls540p",
                      "frame_rate": null,
                      "video_codec_profile": "main",
                      "keyframe_interval": 60,
                      "keyframe_interval_follow_source": false,
                      "live_stream": true,
                      "channels": null,
                      "playback_added_cdns": [

                      ],
                      "width": 960,
                      "rfc_6381_audio_codec": null,
                      "audio_sample_rate": null
                  },
                  {
                      "rfc_6381_video_codec": null,
                      "finished_at": "2017-10-19T20:08:11.115Z",
                      "segment_seconds": 4,
                      "created_at": "2017-10-19T19:47:04.534Z",
                      "privacy": false,
                      "md5_checksum": null,
                      "audio_codec": "AAC",
                      "error_class": null,
                      "updated_at": "2017-10-19T20:08:11.115Z",
                      "video_bitrate_in_kbps": 819.2,
                      "id": "2-621669558be84a7da4ff20bccb9a6a1a",
                      "state": "cancelled",
                      "playback_url": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_2\/chunklist.m3u8",
                      "duration_in_ms": 1156873,
                      "file_size_bytes": null,
                      "height": 360,
                      "playback_url_dvr": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_2\/chunklist_dvr.m3u8",
                      "error_message": null,
                      "video_codec": "H.264",
                      "audio_bitrate_in_kbps": 196.608,
                      "fragment_duration_in_ms": null,
                      "test": false,
                      "playback_url_vod": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/profile_2\/chunklist_vod.m3u8",
                      "total_bitrate_in_kbps": 1015.808,
                      "format": null,
                      "label": "hls360p",
                      "frame_rate": null,
                      "video_codec_profile": "main",
                      "keyframe_interval": 60,
                      "keyframe_interval_follow_source": false,
                      "live_stream": true,
                      "channels": null,
                      "playback_added_cdns": [

                      ],
                      "width": 640,
                      "rfc_6381_audio_codec": null,
                      "audio_sample_rate": null
                  },
                  {
                      "playlist_type": "defaultS3",
                      "dvr_filename": "playlist_dvr.m3u8",
                      "filename": "playlist.m3u8",
                      "playback_url": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist.m3u8",
                      "type": "playlist",
                      "playback_url_dvr": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist_dvr.m3u8"
                  }
              ],
              "input": {
                  "finished_at": "2017-10-19T20:08:11.115Z",
                  "created_at": "2017-10-19T19:47:04.534Z",
                  "privacy": false,
                  "md5_checksum": null,
                  "audio_codec": null,
                  "error_class": null,
                  "updated_at": "2017-10-19T20:08:11.115Z",
                  "video_bitrate_in_kbps": null,
                  "id": "input-621669558be84a7da4ff20bccb9a6a1a",
                  "state": "cancelled",
                  "duration_in_ms": 1156873,
                  "file_size_bytes": null,
                  "audio_tracks": null,
                  "height": null,
                  "error_message": null,
                  "video_codec": null,
                  "audio_bitrate_in_kbps": null,
                  "test": false,
                  "total_bitrate_in_kbps": null,
                  "format": null,
                  "frame_rate": null,
                  "url": null,
                  "channels": null,
                  "width": null,
                  "audio_sample_rate": null
              },
              "event": "state_changed",
              "job": {
                  "event_length": 0,
                  "static": false,
                  "finished_at": "2017-10-19T20:08:11.115Z",
                  "test": false,
                  "submitted_at": "2017-10-19T19:47:04.534Z",
                  "created_at": "2017-10-19T19:47:04.534Z",
                  "privacy": false,
                  "out_worker_bytes_rate": 0,
                  "ad_insertion": false,
                  "metadata_passthrough": false,
                  "live_stream": true,
                  "out_worker_bytes": 147114065,
                  "live_dvr_sliding_window_duration_ms": 57600000,
                  "updated_at": "2017-10-19T20:08:11.115Z",
                  "encryption": [

                  ],
                  "live_dvr_sliding_window_duration_ms": 57600000,
                  "ssai_state": "none",
                  "id": "621669558be84a7da4ff20bccb9a6a1a",
                  "state": "cancelled",
                  "playback_url": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist.m3u8",
                  "region": "us-west-2",
                  "reconnect_time": 1800,
                  "playback_url_dvr": "https:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist_dvr.m3u8"
              }
          }
          

裁剪到S3示例

下面是一個示例state_changed事件,用於創建剪輯並將其發送到S3存儲桶。請注意,它包含剪輯的S3地址為jvod_url

          {
              "jvod_id": "b750cce9e21a4cc894c4507208495b0c",
              "jvod_url": "s3:\/\/some.bucket\/test_dur60.mp4",
              "jvod_created_at": 1517520650785,
              "jvod_duration_s": 30,
              "jvod_cancelling_flag": false,
              "label": "last_30",
              "jvod_reported_duration_s": null,
              "jvod_finished_at": 0,
              "jvod_type": "s3",
              "account_id": "a95ac581551b4478b27910e5675db1f8",
              "jvod_worker_id": "b55b6fec738e4d2788544d3233b5ecf6",
              "user_id": "c2691d4d039040be96c190a949d754a7",
              "job_id": "7005c6e07bc24ca7b69b6b9d24052720",
              "jvod_last_state_change_at": 1517520652312,
              "jvod_region": "us-west-2",
              "cloud_id": "301c91a5d9254b5d944b108c355f12be",
              "event": "state_changed",
              "jvod_state": "processing"
          }

處理通知

要接收通知,您只需要一個可以接收HTTP / HTTPS的應用程序POST要求。然後,該應用可以解析JSON通知,並根據其內容執行您想要的任何操作。

舉一個簡單的例子,這是我們在Brightcove Learning Services中使用的一個PHP應用程序,用於接收通知並將它們寫入文本文件。

          <?php
            //POST 不適用於 JSON 數據
            $ 問題 =「無錯誤」;
            $ notificationType = null;
            嘗試{
                $ JSON = 文件的內容('PHP://輸入');
                $ 解碼 = 解碼($ JSON,真);
                //將通知轉換為漂亮的打印 JSON
                $ 通知 = JSON_ 編碼($ 解碼,JSON_PRETY);
            } catch(Exception $ e){
                $ problem = $ e ---> getMessage();
                $ notification = $ json;
            }

            $ logEntry = $ notification。“ \\ n \\ n”;

            //告訴PHP 在哪裡可以找到日誌文件並告訴 PHP 打開它
            //並添加我們之前創建的字符串。
                $ logFileLocation =“ live-log.txt”;
                $ 文件句柄 = fopen($ 日誌文件位置,'A')或死亡(「-1」);
                fwrite($ fileHandle,$ logEntry);
                fclose($ fileHandle);

            //當您直接瀏覽應用程式時,會顯示下面的行
            回顯“實時回調應用程序正在運行”;
            ?>
          

注意事項

  • 在某些情況下,相同的通知將被發送多次。如果您的處理程序正在基於通知採取措施(除了簡單的日誌記錄),則應將其配置為檢查重複項(具有相同提示的多個通知)idstatus)並忽略它們。

在實時模塊中設置通知

要為在實時模塊中創建的實時事件設置通知,您需要執行以下操作:

  1. 創建一個可以接收POST請求的處理程序應用程序,如上一節中所示的PHP應用程序。
  2. 將應用託管在公共網址上。
  3. 在“實時”模塊中創建實時作業時,展開高級選項
  4. 檢查啟用流狀態通知選項並輸入您的處理程序應用程序的網址:
    在即時模組中啟用通知
    在即時模組中啟用通知