API en vivo: Notificaciones

Este tema muestra cómo configurar notificaciones para trabajos de API en vivo.

Introducción

El sistema Brightcove Live envía notificaciones de varios eventos. Puede configurar oyentes para que las notificaciones activen más acciones. Los oyentes se pueden escribir en cualquier lenguaje del lado del servidor que use, y buscarán solicitudes POST entrantes, analizarán el cuerpo de la solicitud JSON y luego realizarán la acción que desee. A continuación veremos cómo puede solicitar notificaciones.

Solicitando notificaciones

Puede solicitar notificaciones incluyendo una o más notifications campos en las salidas su Crear trabajo pedido.

El valor de notifications es una matriz de objetos de destino de notificación. Puede utilizar una cadena simple con una url: "https://httpbin.org/post" o puede utilizar un objeto con las siguientes opciones: {"url": "https://httpbin.org/post", "credentials": "reference_to_your_credentials"}. Se enviará una notificación al destino que especifique cuando la salida cambie de estado. Si aplica este parámetro a una salida VOD, las notificaciones solo estarán relacionadas con ese trabajo VOD, no con el trabajo en vivo.

Aquí hay unos ejemplos:

Notificaciones para un trabajo en vivo

{
    "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"
        }
        ]
    }]
}

Notificaciones de Live to VOD (output_finished solo evento)

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

Notificaciones para Live to VOD (todos los eventos)

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

Reintentar estrategia

En el caso de una solicitud fallida para enviar una notificación, la estrategia de reintento predeterminada es reintentar 50 veces con un retraso exponencial entre intentos.

          max_retry_times = 50
          delay_delta_s = 5
          next_retry = now_s + retry_count * delay_delta_s

Eventos

A continuación se muestran los eventos de un ciclo de vida laboral que puede escuchar. Tenga en cuenta que el alcance del evento es por trabajo, por lo que el ciclo de vida del evento para un trabajo en vivo sería independiente del ciclo de vida para un trabajo de recorte de VOD basado en la misma transmisión en vivo.

  • state_changed- el estado del trabajo activo cambió; Mira la tabla de abajo para más detalles
  • first_segment_uploaded- el primer segmento de la transmisión en vivo se carga al origen
  • output_finished- el evento en vivo ha finalizado y el procesamiento de VOD ha creado al menos una reproducción de audio y una reproducción de video, o una reproducción progresiva de MP4

La state_changed notificará sobre los siguientes estados descritos en la siguiente tabla

Estados de trabajo en vivo
Expresar Descripción
Estados del TRABAJO (notificados en las notificaciones como state)
error Se ha producido un error; el trabajo no se procesará.
standby (Solo se aplica a trabajos de punto de entrada estático [SEP]). El trabajo está asignado y listo para su activación.
waiting El trabajo se asignó a un trabajador de transmisión y está listo para que el codificador se conecte.
processing El codificador está conectado y el trabajo está disponible para su reproducción.
disconnected El codificador se ha desconectado y el trabajador de transmisión está esperando una reconexión.
cancelling El trabajo ha sido cancelado y el trabajador lo está deteniendo y NO procesará ninguna salida de VOD pendiente.
finishing El codificador ha estado desconectado durante más de reconnect_time y el trabajador de transmisión está deteniendo los trabajos y creando cualquier salida VOD asociada.
cancelled El trabajo se canceló correctamente.
finished El trabajo ha finalizado correctamente.
failed El trabajo se detuvo como resultado de un error del sistema.
Estados VOD JOB (notificados en notificaciones como jvod_state)
error Se ha producido un error; el trabajo no se procesará.
waiting El trabajo en espera de procesamiento.
waiting_finish_live El trabajo en espera de que termine el Live Job (si el clip depende de eso).
processing El clip se está procesando.
creating_asset Se está creando un activo de VOD.
cancelling El trabajo ha sido cancelado y el trabajador lo está deteniendo y NO procesará ninguna salida de VOD pendiente.
cancelled El trabajo se canceló correctamente.
finished El trabajo ha finalizado correctamente.
failed El trabajo se detuvo como resultado de un error del sistema.
Estados SSAI (informados en notificaciones como ssai_state)
none El trabajo no es un trabajo de SSAI.
waiting_input El trabajador de transmisión está esperando que el codificador se conecte y proporcione la información de entrada de la transmisión.
start_transcoding El codificador se ha conectado y la pizarra SSAI se ha puesto en cola para la transcodificación en función de los datos de entrada y salida del flujo.
transcoding Se está transcodificando la pizarra.
error La lista no se pudo descargar ni transcodificar.
ready Se ha generado la pizarra y el trabajo está listo para la reproducción SSAI.
Estados SEP (notificados en notificaciones como sep_state)
none El trabajo no es un trabajo de SEP.
ready El punto de entrada se ha activado y está listo para que se conecte el codificador.
pending_activation El punto de entrada se ha puesto en cola para la asignación de trabajadores de transmisión.
activation_in_progress El punto de entrada se está actualizando para enrutar las conexiones al trabajador de transmisión.
pending_deactivation El punto de entrada se ha puesto en cola para la limpieza del trabajador de transmisión.
deactivation_in_progress El punto de entrada se está desconectando del trabajador de transmisión.
cancelled El punto de entrada ha sido cancelado.
finished El punto de entrada se ha completado con éxito.
Estados de salida RTMP (informados para rtmp_output_state_changed notificaciones como state)
starting La transmisión está comenzando.
connected El codificador se ha conectado.
Disconnected El codificador se ha desconectado.
error La transmisión no se pudo conectar.
pending_deactivation El punto de entrada se ha puesto en cola para la limpieza del trabajador de transmisión.
deactivation_in_progress El punto de entrada se está desconectando del trabajador de transmisión.
cancelled El punto de entrada ha sido cancelado.
finished El punto de entrada se ha completado con éxito.

Notificaciones de muestra

Notificación de transmisión en vivo

Aquí hay una notificación de muestra para un state_changed evento para un trabajo en vivo:

          {
              "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"
              }
          }
          

Recorte a la muestra S3

A continuación se muestra una muestra state_changed evento para crear un clip y enviarlo a un depósito S3. Tenga en cuenta que incluye la dirección S3 del clip como 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"
          }

Manejo de notificaciones

Para recibir notificaciones, simplemente necesita una aplicación que pueda recibir HTTP / HTTPS POST peticiones. Luego, la aplicación puede analizar las notificaciones JSON y hacer lo que quiera en función de su contenido.

Como ejemplo simple, aquí hay una aplicación PHP que usamos en Brightcove Learning Services para recibir notificaciones y escribirlas en un archivo de texto.

          <? php
            // POST no funcionará para datos JSON
            $problem = "No errors";
            $notificationType = null;
            intentar {
                $json = file_get_contents('php://input');
                $decoded = json_decode($json, true);
                // convierte la notificación en un JSON bastante impreso
                $notification = json_encode($decoded, JSON_PRETTY_PRINT);
            } catch (Exception $e) {
                $problem = $e--->getMessage();
                $notification = $json;
            }

            $logEntry = $notification."\n \n";

            // Dígale a PHP dónde puede encontrar el archivo de registro y dígale a PHP que lo abra
            // y agregue la cadena que creamos anteriormente.
                $logFileLocation = "live-log.txt";
                $fileHandle = fopen($logFileLocation, 'a') or die("-1");
                fwrite ($ fileHandle, $ logEntry);
                fclose ($ fileHandle);

            // la línea de abajo se muestra cuando navega por la aplicación directamente
            echo "La aplicación de devolución de llamada en vivo se está ejecutando";
            ?>
          

Notas

  • En ciertos casos, se enviarán notificaciones idénticas más de una vez. Si el controlador está realizando acciones (aparte del registro simple) en función de las notificaciones, debe configurarlo para que compruebe si hay duplicados (varias notificaciones con la misma id y status) e ignóralos.

Configurar notificaciones en el módulo Live

Para configurar notificaciones para un evento en vivo creado en el Módulo en vivo, deberá hacer lo siguiente:

  1. Cree una aplicación de controlador que pueda recibir solicitudes POST como la aplicación PHP que se muestra en la sección anterior.
  2. Aloje la aplicación en una URL pública.
  3. Cuando cree su trabajo en vivo en el módulo En vivo, expanda el Opciones avanzadas.
  4. Comprobar el Habilitar la opción de notificaciones de estado de la transmisión e ingrese la URL de su aplicación de controlador:
    Habilitar notificaciones en el módulo en vivo
    Habilitar notificaciones en el módulo en vivo