入門
Brightcoveライブシステムは、さまざまなイベントの通知を送信します。通知のリスナーを設定して、追加のアクションをトリガーできます。リスナーは、使用する任意のサーバーサイド言語で記述できます。リスナーは、受信する POST リクエストを探し、JSON リクエスト本文を解析し、必要なアクションを実行します。以下では、通知をリクエストする方法を示しています。
通知のリクエスト
1つ以上を含めることで通知をリクエストできますnotifications
出力のフィールドジョブを作成するリクエスト。
の値は、notifications
通知先オブジェクトの配列です。URL: で単純な文字列を使用することも"http://httpbin.org/post"
、次のオプションを指定してオブジェクトを使用することもできます{"url": "http://httpbin.org/post", "credentials": "reference_to_your_credentials"}
。出力の状態が変更されると、指定した宛先に通知が送信されます。このパラメータを VOD 出力に適用すると、通知はその VOD ジョブにのみ関連し、ライブジョブには関連付けられません。
以下にいくつかの例を挙げます。
ライブジョブの通知
{
"live_stream": true,
"region": "us-west-2",
"reconnect_time": 20,
"notifications": [
{"url": "http://httpbin.org/post/URLA",
"credentials": "reference_to_your_credentials",
"event": "first_segment_uploaded"},
{"url": "http://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": "http://httpbin.org/post?vodStateChange"
},
{
"url": "http://httpbin.org/post?vodFinished",
"event": "output_finished"
}
]
}]
}
ライブからVODへの通知(output_finished
イベントのみ)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://httpbin.org/post?vodFinished",
"event": "output_finished"
}]
}
ライブからVODへの通知(すべてのイベント)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://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 処理によって少なくとも 1 つのオーディオと 1 つのビデオレンディション、または 1 つのプログレッシブ 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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/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": "http:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist.m3u8",
"type": "playlist",
"playback_url_dvr": "http:\/\/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": "http:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist.m3u8",
"region": "us-west-2",
"reconnect_time": 1800,
"playback_url_dvr": "http:\/\/bcovlive-a.akamaihd.net\/621669558be84a7da4ff20bccb9a6a1a\/us-west-2\/NA\/playlist_dvr.m3u8"
}
}
S3 サンプルへのクリッピング
以下は、クリップを作成して S3 state_changed
バケットに送信するためのサンプルイベントです。クリップの S3 アドレスはとして含まれていることに注意してくださいjvod_url
。
{
"jvod_id": "b750cce9e21a4cc894c4507208495b0c",
"jvod_url": "s3:\/\/learning-services-media.brightcove.com\/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 ラーニングサービスで通知を受信してテキストファイルに書き込むために使用する PHP アプリケーションを示します。
<?php // POSTはJSONデータでは機能しません$ problem = "エラーなし"; $ notifyType = null;試す{ $json = file_get_contents('php://input'); $decoded = json_decode($json, true); // turn notification into pretty printed JSON $notification = json_encode($decoded, JSON_PRETTY_PRINT); }キャッチ(例外$ e){ $problem = $e--->getMessage(); $notification = $json; } $ logEntry = $ notification。 "\\ n \\ n"; //ログファイルを見つけることができる場所をPHPに通知し、//ログファイルを開くようにPHPに指示し、前に作成した文字列を追加します。 $ logFileLocation = "live-log.txt"; $ fileHandle = fopen($ logFileLocation、 'a')またはdie( "-1"); fwrite($ fileHandle、$ logEntry); fclose($ fileHandle); //アプリを直接参照すると、以下の行が表示されますecho "Live callback app is running"; ?>
注
- 場合によっては、同一の通知が複数回送信されます。ハンドラが通知に基づいて(単純なロギングとは別に)アクションを実行している場合は、重複をチェックし(
id
同じおよびを持つ複数の通知status
)、無視するようにハンドラを設定する必要があります。
ライブモジュールで通知を設定する
Live Module で作成したライブイベントの通知を設定するには、次の操作を行う必要があります。
- 前のセクションに示した PHP アプリのように、POST 要求を受信できるハンドラーアプリケーションを作成します。
- パブリック URL でアプリをホストします。
- ライブモジュールでライブジョブを作成する場合は、詳細オプションを展開します。
- [ ストリームステータス通知を有効にする] オプションをオンにして、ハンドラーアプリの URL を入力します。