Live-API: Benachrichtigungen
Einleitung
Das Brightcove Live-System sendet Benachrichtigungen zu verschiedenen Ereignissen. Sie können Listener für Benachrichtigungen einrichten, um weitere Aktionen auszulösen. Die Listener können in jeder von Ihnen verwendeten serverseitigen Sprache geschrieben werden, und sie suchen nach eingehenden POST-Anforderungen, analysieren den JSON-Anforderungstext und ergreifen dann die gewünschte Aktion. Im Folgenden sehen wir, wie Sie Benachrichtigungen anfordern können.
Benachrichtigungen anfordern
Sie können Benachrichtigungen anfordern, indem Sie eine oder mehrere hinzufügen notifications
Felder in den Ausgaben Ihr Job erstellen Anfrage.
Der Wert von notifications
ist ein Array von Benachrichtigungszielobjekten. Sie können eine einfache Zeichenfolge mit einer URL verwenden: "http://httpbin.org/post"
oder Sie können ein Objekt mit folgenden Optionen verwenden: {"url": "http://httpbin.org/post", "credentials": "reference_to_your_credentials"}
. Eine Benachrichtigung wird an das von Ihnen angegebene Ziel gesendet, wenn die Ausgabe ihren Status ändert. Wenn Sie diesen Parameter auf eine VOD-Ausgabe anwenden, beziehen sich die Benachrichtigungen nur auf diesen VOD-Job, nicht auf den Live-Job.
Hier sind einige Beispiele:
Benachrichtigungen für einen Live-Job
{
"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"
}
]
}]
}
Benachrichtigungen für Live zu VOD (output_finished
nur Veranstaltung)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://httpbin.org/post?vodFinished",
"event": "output_finished"
}]
}
Benachrichtigungen für Live zu VOD (alle Veranstaltungen)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://httpbin.org/post"
}]
}
Strategie wiederholen
Im Falle einer fehlgeschlagenen Anforderung zum Senden einer Benachrichtigung besteht die Standardwiederholungsstrategie darin, es 50 Mal mit einer exponentiellen Verzögerung zwischen den Versuchen zu wiederholen.
max_retry_times = 50
delay_delta_s = 5
next_retry = now_s + retry_count * delay_delta_s
Ereignisse
Nachfolgend finden Sie die Ereignisse eines Joblebenszyklus, auf die Sie hören können. Beachten Sie, dass der Ereignisumfang pro Job gilt, sodass der Ereignislebenszyklus für einen Live-Job getrennt vom Lebenszyklus für einen VOD-Clipping-Job wäre, der auf demselben Livestream basiert.
state_changed
- der Status des Live-Jobs hat sich geändert; Details finden Sie in der Tabelle untenfirst_segment_uploaded
- das erste Segment des Livestreams wird auf Origin hochgeladenoutput_finished
- Das Live-Ereignis ist beendet und die VOD-Verarbeitung hat mindestens eine Audio- und eine Videowiedergabe oder eine progressive MP4-Wiedergabe erstellt
Die state_changed
benachrichtigt über die folgenden Zustände, die in der folgenden Tabelle beschrieben sind
Bundesland | Beschreibung |
---|---|
JOB-Staaten (gemeldet in Benachrichtigungen als state ) |
|
error |
Ein Fehler ist aufgetreten; der Auftrag wird nicht bearbeitet. |
standby |
(Gilt nur für Static Entry Point [SEP] Jobs.) Der Job ist zugewiesen und bereit zur Aktivierung. |
waiting |
Der Job wurde einem Streaming-Worker zugewiesen und ist bereit für die Verbindung des Encoders. |
processing |
Der Encoder ist angeschlossen und der Job steht zur Wiedergabe bereit. |
disconnected |
Der Encoder hat die Verbindung getrennt und der Streaming-Worker wartet auf eine erneute Verbindung. |
cancelling |
Der Job wurde abgebrochen und der Worker stoppt den Job und verarbeitet KEINE ausstehenden VOD-Ausgaben. |
finishing |
Der Encoder ist länger als reconnect_time , und der Streaming-Worker stoppt die Jobs und erstellt alle zugehörigen VOD-Ausgaben. |
cancelled |
Der Auftrag wurde erfolgreich abgebrochen. |
finished |
Der Auftrag wurde erfolgreich beendet. |
failed |
Der Job wurde aufgrund eines Systemfehlers gestoppt. |
VOD-JOB-Zustände (gemeldet in Benachrichtigungen als jvod_state ) |
|
error |
Ein Fehler ist aufgetreten; der Auftrag wird nicht bearbeitet. |
waiting |
Der Job wartet auf die Verarbeitung. |
waiting_finish_live |
Der Job, der darauf wartet, dass der Live-Job beendet wird (wenn der Clip davon abhängt). |
processing |
Der Clip wird verarbeitet. |
creating_asset |
Ein VOD-Asset wird erstellt. |
cancelling |
Der Job wurde abgebrochen und der Worker stoppt den Job und verarbeitet KEINE ausstehenden VOD-Ausgaben. |
cancelled |
Der Auftrag wurde erfolgreich abgebrochen. |
finished |
Der Auftrag wurde erfolgreich beendet. |
failed |
Der Job wurde aufgrund eines Systemfehlers gestoppt. |
SSAI-Staaten (gemeldet in Benachrichtigungen als ssai_state ) |
|
none |
Der Job ist kein SSAI-Job. |
waiting_input |
Der Streaming-Worker wartet darauf, dass der Encoder eine Verbindung herstellt und die Stream-Eingabeinformationen bereitstellt. |
start_transcoding |
Der Encoder hat sich verbunden und die SSAI-Slate wurde für die Transcodierung basierend auf den Stream-Eingangsdaten und -Ausgangsdaten in die Warteschlange gestellt. |
transcoding |
Die Tafel wird transkodiert. |
error |
Die Slate konnte nicht heruntergeladen oder transkodiert werden. |
ready |
Die Slate wurde generiert und der Job ist für die SSAI-Wiedergabe bereit. |
SEP-Staaten (gemeldet in Benachrichtigungen als sep_state ) |
|
none |
Der Job ist kein SEP-Job. |
ready |
Der Einstiegspunkt wurde aktiviert und ist bereit für die Verbindung des Encoders. |
pending_activation |
Der Einstiegspunkt wurde für die Streaming-Worker-Zuweisung in die Warteschlange gestellt. |
activation_in_progress |
Der Einstiegspunkt wird aktualisiert, um Verbindungen zum Streaming-Worker weiterzuleiten. |
pending_deactivation |
Der Einstiegspunkt wurde für die Bereinigung vom Streaming-Worker in die Warteschlange gestellt. |
deactivation_in_progress |
Der Einstiegspunkt trennt die Verbindung zum Streaming-Worker. |
cancelled |
Der Einstiegspunkt wurde abgebrochen. |
finished |
Der Einstiegspunkt wurde erfolgreich abgeschlossen. |
RTMP-Ausgangszustände (gemeldet für rtmp_output_state_changed Benachrichtigungen als state ) |
|
starting |
Der Stream startet. |
connected |
Der Encoder hat sich verbunden. |
Disconnected |
Der Encoder hat sich getrennt. |
error |
Der Stream konnte nicht verbunden werden. |
pending_deactivation |
Der Einstiegspunkt wurde für die Bereinigung vom Streaming-Worker in die Warteschlange gestellt. |
deactivation_in_progress |
Der Einstiegspunkt trennt die Verbindung zum Streaming-Worker. |
cancelled |
Der Einstiegspunkt wurde abgebrochen. |
finished |
Der Einstiegspunkt wurde erfolgreich abgeschlossen. |
Beispielbenachrichtigungen
Livestream-Benachrichtigung
Hier ist eine Beispielbenachrichtigung für a state_changed
Event für einen Live-Job:
{
"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"
}
}
Clipping auf S3-Beispiel
Unten ist ein state_changed
Beispielereignis zum Erstellen eines Clips und zum Senden an einen S3-Bucket. Beachten Sie, dass es die S3-Adresse des Clips enthält als 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"
}
Umgang mit Benachrichtigungen
Um Benachrichtigungen zu erhalten, benötigen Sie lediglich eine App, die HTTP/HTTPS empfangen kann POST
Anfragen. Die App kann dann die JSON-Benachrichtigungen analysieren und basierend auf ihrem Inhalt tun, was Sie wollen.
Als einfaches Beispiel sehen wir hier eine PHP-App, die wir in Brightcove Learning Services verwenden, um Benachrichtigungen zu empfangen und in eine Textdatei zu schreiben.
<? php
// POST funktioniert nicht für JSON-Daten
$ problem = "Keine Fehler";
$ notificationType = null;
Versuchen {
$ json = file_get_contents ('php: // input');
$ decoded = json_decode ($ json, true);
// Benachrichtigung in hübsch gedrucktes JSON verwandeln
$ notification = json_encode ($ decodiert, JSON_PRETTY_PRINT);
} catch (Ausnahme $ e) {
$ problem = $ e ---> getMessage ();
$ Benachrichtigung = $ json;
}
$ logEntry = $ Benachrichtigung. "\\ n \\ n";
// Sag PHP, wo es die Protokolldatei finden kann und sag PHP, dass es sie öffnen soll
// und füge den zuvor erstellten String hinzu.
$ logFileLocation = "live-log.txt";
$ fileHandle = fopen ($ logFileLocation, 'a') oder die ("- 1");
fwrite ($ fileHandle, $ logEntry);
fclose ($ fileHandle);
// Zeile unten wird angezeigt, wenn Sie die App direkt durchsuchen
Echo "Live Callback App läuft";
?>
Hinweise
- In bestimmten Fällen werden identische Benachrichtigungen mehrmals versendet. Wenn Ihr Handler (abgesehen von der einfachen Protokollierung) basierend auf Benachrichtigungen Maßnahmen ergreift, sollten Sie ihn so konfigurieren, dass er nach Duplikaten sucht (mehrere Benachrichtigungen mit demselben
id
undstatus
) und ignoriere sie.
Benachrichtigungen im Live-Modul einrichten
Um Benachrichtigungen für ein im Live-Modul erstelltes Live-Ereignis einzurichten, müssen Sie Folgendes tun:
- Erstellen Sie eine Handler-Anwendung, die POST-Anforderungen empfangen kann, wie die im vorherigen Abschnitt gezeigte PHP-App.
- Hosten Sie die App auf einer öffentlichen URL.
- Wenn Sie Ihren Live-Job im Live-Modul erstellen, erweitern Sie die Erweiterte Optionen.
- Überprüf den Option für Stream-Statusbenachrichtigungen aktivieren und geben Sie die URL für Ihre Handler-App ein: