라이브 API: 알림
서문
Brightcove Live 시스템은 다양한 이벤트에 대한 알림을 보냅니다. 추가 작업을 트리거하도록 알림에 대한 리스너를 설정할 수 있습니다. 리스너는 사용하는 모든 서버 측 언어로 작성 될 수 있으며 수신 POST 요청을 찾고 JSON 요청 본문을 구문 분석 한 다음 원하는 작업을 수행합니다. 아래에서 알림을 요청하는 방법을 볼 수 있습니다.
알림 요청
하나 이상을 포함하여 알림을 요청할 수 있습니다. 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"
}
]
}]
}
Live to VOD ( output_finished
이벤트 만 해당)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://httpbin.org/post?vodFinished",
"event": "output_finished"
}]
}
Live to 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 샘플로 클리핑
아래는 샘플입니다state_changed
클립을 생성하여 S3 버킷으로 보내기위한 이벤트입니다. 클립의 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 Learning Services에서 알림을 수신하고 텍스트 파일에 작성하는 데 사용하는 PHP 앱이 있습니다.
<?php
//JSON 데이터에 대해 POST가 작동하지 않음
$ 문제 = “오류 없음”;
$ notificationType = null;
{
$ JSON = 파일 _get_내용 ('PHP://입력');
$ 디코딩 = json_decode ($ JSON, 사실);
//알림을 예쁜 인쇄 된 JSON으로 변환
$ 알림 = json_인코딩 ($ 디코딩, JSON_PRETTY_인쇄);
} 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);
//앱을 직접 탐색할 때 아래 줄이 표시됩니다.
echo "라이브 콜백 앱이 실행 중입니다.";
?>
참고
- 경우에 따라 동일한 알림이 두 번 이상 전송됩니다. 핸들러가 알림을 기반으로 작업 (단순 로깅 제외)을 수행하는 경우 중복 (동일한 여러 알림이있는 여러 알림)을 확인하도록 구성해야합니다.
id
과status
) 무시하십시오.
라이브 모듈에서 알림 설정
라이브 모듈에서 생성 된 라이브 이벤트에 대한 알림을 설정하려면 다음을 수행해야합니다.
- 이전 섹션에 표시된 PHP 앱과 같은 POST 요청을 수신 할 수있는 핸들러 애플리케이션을 만듭니다.
- 공개 URL에서 앱을 호스팅합니다.
- 라이브 모듈에서 라이브 작업을 생성 할 때고급 옵션 .
- 을 체크하다스트림 상태 알림 활성화 옵션핸들러 앱의 URL을 입력하십시오.