API en vivo: Notificaciones
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: "http://httpbin.org/post"
o puede utilizar un objeto con las siguientes opciones: {"url": "http://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": "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"
}
]
}]
}
Notificaciones de Live to VOD (output_finished
solo evento)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://httpbin.org/post?vodFinished",
"event": "output_finished"
}]
}
Notificaciones para Live to VOD (todos los eventos)
{
"videocloud": {
"video": {
"name": "video name"
}
},
"notifications": [{
"url": "http://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 detallesfirst_segment_uploaded
- el primer segmento de la transmisión en vivo se carga al origenoutput_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
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": "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"
}
}
Recorte a la muestra S3
A continuación se muestra un state_changed
evento de ejemplo para crear un clip y enviarlo a un bucket de S3. Tenga en cuenta que incluye la dirección S3 del clip como 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"
}
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
ystatus
) 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:
- Cree una aplicación de controlador que pueda recibir solicitudes POST como la aplicación PHP que se muestra en la sección anterior.
- Aloje la aplicación en una URL pública.
- Cuando cree su trabajo en vivo en el módulo En vivo, expanda el Opciones avanzadas.
- Comprobar el Habilitar la opción de notificaciones de estado de la transmisión e ingrese la URL de su aplicación de controlador: