Live-API: Benachrichtigungen

In diesem Thema wird gezeigt, wie Benachrichtigungen für Live-API-Jobs eingerichtet werden.

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: "https://httpbin.org/post" oder Sie können ein Objekt mit folgenden Optionen verwenden: {"url": "https://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": "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"
        }
        ]
    }]
}

Benachrichtigungen für Live zu VOD (output_finished nur Veranstaltung)

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

Benachrichtigungen für Live zu VOD (alle Veranstaltungen)

{
  "videocloud": {
    "video": {
      "name": "video name"
    }
  },
  "notifications": [{
    "url": "https://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

Veranstaltungen

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 unten
  • first_segment_uploaded- das erste Segment des Livestreams wird auf Origin hochgeladen
  • output_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

Live-Jobstatus
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 seit mehr als einem Jahr getrennt reconnect_time, und der Streaming-Worker stoppt die Jobs und erstellt alle zugehörigen VOD-Ausgänge.
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": "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"
              }
          }
          

Clipping auf S3-Beispiel

Im Folgenden finden Sie 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:\/\/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"
          }

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;
            versuche {
                $ 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 „Die 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 und status) 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:

  1. Erstellen Sie eine Handler-Anwendung, die POST-Anforderungen empfangen kann, wie die im vorherigen Abschnitt gezeigte PHP-App.
  2. Hosten Sie die App auf einer öffentlichen URL.
  3. Wenn Sie Ihren Live-Job im Live-Modul erstellen, erweitern Sie die Erweiterte Optionen.
  4. Überprüf den Option für Stream-Statusbenachrichtigungen aktivieren und geben Sie die URL für Ihre Handler-App ein:
    Benachrichtigungen im Live-Modul aktivieren
    Benachrichtigungen im Live-Modul aktivieren