簡介
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);
//當您直接瀏覽應用程式時,會顯示下面的行
回顯“實時回調應用程序正在運行”;
?>
注意事項
- 在某些情況下,相同的通知將被發送多次。如果您的處理程序正在基於通知採取措施(除了簡單的日誌記錄),則應將其配置為檢查重複項(具有相同提示的多個通知)
id
和status
)並忽略它們。
在實時模塊中設置通知
要為在實時模塊中創建的實時事件設置通知,您需要執行以下操作:
- 創建一個可以接收POST請求的處理程序應用程序,如上一節中所示的PHP應用程序。
- 將應用託管在公共網址上。
- 在“實時”模塊中創建實時作業時,展開高級選項。
- 檢查啟用流狀態通知選項並輸入您的處理程序應用程序的網址: