Señalización de metadatos con tiempo con Azure Media Services
Advertencia
Azure Media Services se retirará el 30 de junio de 2024. Para obtener más información, consulte la Guía de retirada de AMS.
Los metadatos con tiempo son datos personalizados que se insertan en una secuencia en vivo. Tanto los datos como su marca de tiempo de inserción se conservan en la propia secuencia multimedia. Esto es para que los clientes que reproducen la secuencia de vídeo puedan obtener los mismos metadatos personalizados exactamente al mismo tiempo en relación con la secuencia de vídeo.
Nota
Los metadatos con tiempo de espera solo funcionan para los eventos en directo creados con la ingesta RTMP y RTMPS.
Requisitos previos
- Una cuenta de Media Services
- Familiaridad con el streaming en vivo desde un codificador local. Si no lo ha hecho antes, pruebe primero el streaming en vivo con el inicio rápido de OBS . Una vez que tenga esa configuración y en ejecución, debería poder realizar los pasos siguientes.
- Una herramienta para probar entradas HTTP.
Visualización del ejemplo
En el ejemplo siguiente se muestra cómo un reproductor de vídeo detecta y muestra los metadatos con tiempo de la secuencia de vídeo. Usa el reproductor de Shaka y su compatibilidad integrada con los datos de mensajes de eventos ('emsg') a través de EmsgEvent.
Media Services también admite los eventos MetadataEvent del reproductor shaka ID3, "emsg" que usan el URI https://aomedia.org/emsg/ID3
de identificador de esquema .
Revisión del código en Stackblitz
Hemos proporcionado un jugador de Shaka de ejemplo en Stackblitz para que trabaje con usted. Use este botón para bifurcar el código de ejemplo en Stackblitz.com.
Revisar la página HTML
El documento index.html contiene:
- un elemento div donde se mostrará el mensaje una vez enviado.
- un elemento de vídeo HTML5 estándar. Observe que el elemento de vídeo está establecido
autoplay
en y enstart muted
. - un campo de entrada para la dirección URL del localizador de streaming. Hay una dirección URL de marcador de posición en el campo de entrada que puede ver, pero no es una secuencia en directo. Reemplazará este valor.
<script type="module" src="./index.js"></script>
<link href="./style.css" type="text/css" rel="stylesheet">
<div class="grid-container">
<div id="header">
<a href="https://github.com/Azure-Samples/media-services-v3-node-tutorials/tree/main/Player/examples/shaka">
<span class="microsoft"><svg aria-hidden="true" role="presentation" viewBox="0 0 26 25"
xmlns="http://www.w3.org/2000/svg">
<path d="M12.5708 0.981934H0.907471V12.3682H12.5708V0.981934Z" fill="#F25022"></path>
<path d="M25.4625 0.981934H13.7992V12.3682H25.4625V0.981934Z" fill="#7FBA00"></path>
<path d="M12.5708 13.5649H0.907471V24.9512H12.5708V13.5649Z" fill="#00A4EF"></path>
<path d="M25.4629 13.5649H13.7996V24.9512H25.4629V13.5649Z" fill="#FFB900"></path>
</svg></span>
<span class="title">Shaka Player LL-HLS with Timed Metadata Sample</span>
</a>
</div>
<div id="videoArea">
<div id="video-container" data-shaka-player-cast-receiver-id="07AEE832">
<div id="metadata" class="metadata-hide"></div>
<video autoplay muted playsinline id="video" style="width: 100%; height: 100%"></video>
</div>
</div>
<div id="clock">
</div>
<div id="console">Waiting for timed metadata signals to arrive...</div>
<div id="manifest">
<label>Your Manifest (paste and hit enter):</label>
<input id="manifestUrl" type="url" placeholder="place manifest URL here" size="80"
value="//aka.ms/lowlatencydemo.m3u8" />
</div>
<div id="footer">
<a href="http://media.azure">Azure Media Services</a>
</div>
</div>
Revisión de JavaScript
El archivo index.js crea y administra los eventos del reproductor y del reproductor. La onEventMessage
función está registrada para controlar el emsg
evento desde shaka Player y mostrar los mensajes recibidos de post.
player.addEventListener('emsg', onEventMessage);
function onEventMessage(event) {
// In version 4.2.x of Shaka player, the event message from AMS will fire here.
// In version 4.3.0 and higher of Shaka player, the message will only fire in the "metadata' event, since the Shaka player is looking for ID3 messages and filtering them out to that event.
console.log('Timed Metadata Event Message');
//console.log('emsg:', event)
// emsg box information are in emsg.details
const dataMsg = new TextDecoder().decode(event.detail.messageData);
console.log('EMSG: Scheme = ' + event.detail.schemeIdUri);
console.log('EMSG: StartTime = ' + event.detail.startTime);
console.log(
'video.currenttime=' + document.getElementById('video').currentTime
);
// The start time and the presentationTimeDelta are in seconds on the presentation timeline. Shaka player does this work for us. The value startTime-presentationTimeDelta will give you the exact time in the video player's timeline to display the event.
console.log(
'EMSG: startTime-presentationTimeDelta = ' +
(event.detail.startTime - event.detail.presentationTimeDelta)
);
console.log(
'EMSG: presentationTimeDelta = ' + event.detail.presentationTimeDelta
);
console.log('EMSG: endTime = ' + event.detail.endTime);
console.log('EMSG: timescale = ' + event.detail.timescale);
console.log('EMSG: duration = ' + event.detail.eventDuration);
console.log('EMSG: message length = ' + event.detail.messageData.length);
try {
const frames = shaka.util.Id3Utils.getID3Frames(event.detail.messageData);
if (frames.length > 0) {
console.log('EMSG: message = ', frames[0]);
console.log('EMSG: mimeType = ', frames[0].mimeType);
if (frames[0].mimeType === 'application/json') {
const jsonPayload = JSON.parse(frames[0].data);
let message = jsonPayload.message;
console.log('message=' + message);
// Now do something with your custom JSON payload
let metadataDiv = document.getElementById('metadata');
metadataDiv.innerText = message;
let logLine = document.createElement('p');
logLine.innerText = 'onEmsg - timestamp:' + (event.detail.startTime - event.detail.presentationTimeDelta).toFixed(2) + ' ' + JSON.stringify(jsonPayload);
document.getElementById('console').appendChild(logLine).scrollIntoView(false);
metadataDiv.className = 'metadata-show';
setTimeout(() => {
metadataDiv.className = 'metadata-hide';
}, 5000); // clear the message
console.log('JSON= ' + JSON.stringify(jsonPayload));
}
}
} catch (err) {
console.error(err.stack);
}
}
Creación de un evento en directo con un localizador de streaming
Si aún no lo ha hecho con el inicio rápido de OBS mencionado anteriormente, cree un evento en directo con un localizador de streaming.
- Use el Azure Portal, REST o su SDK favorito para crear un evento en directo. Copie la dirección URL de ingesta y péguela en un editor de texto, ya que deberá editarla para enviar un mensaje al reproductor con una solicitud HTTP PUT.
- Inicie el evento en directo y asegúrese de que también se ha iniciado el punto de conexión de streaming asociado.
Transmisión del evento en directo
Copie y pegue el localizador de streaming en el campo de entrada del reproductor en Stackblitz o, opcionalmente, actualice el valor en el elemento de entrada del archivo index.html. Debería ver el streaming de eventos en directo al reproductor.
Creación de la dirección URL POST
Edite la dirección URL de ingesta:
- Cambio de
RTMPS
aHTTPS
. - Quite el número de puerto, incluidos los dos puntos.
- Quite
/live/
de la ruta de acceso. - Anexe
ingest.isml/eventdata
a la ruta de acceso.
Ejemplo:
rtmps://mylivestream.channel.media.azure-test.net:2935/live/0251458ba5df44b2b807ea02f40fed76
se convierte en
https://mylivestream.channel.media.azure-test.net/0251458ba5df44b2b807ea02f40fed76/ingest.isml/eventdata
Creación y envío de una solicitud
Puede usar cualquier herramienta o SDK que desee para enviar una solicitud HTTP POST con los metadatos del cuerpo al reproductor.
Encabezados y cuerpo de la solicitud
Recordatorio: El encabezado de tipo de contenido HTTP DEBE establecerse en application/json. A continuación, agregue la información que desea mostrar con la clave establecida como "message". Este es un sencillo mensaje de ejemplo:
POST https://mylivestream.channel.media.azure-test.net/0251458ba5df44b2b807ea02f40fed76/ingest.isml/eventdata
Content-Type: application/json
{
“message”: “Hello world!”
}
Al enviar la solicitud, debería ver que el mensaje en la carga JSON aparece en el elemento div flotante sobre el elemento de vídeo.
Solicitudes alternativas
Puede enviar información adicional para una superposición interactiva. La configuración completa de ese escenario no se trata aquí, pero este es el aspecto que podría tener el cuerpo de la solicitud para una prueba. Puede recorrer en iteración las respuestas de cada "pregunta" (aquí reemplazando "message" como clave) y proporcionar un botón para que el visor seleccione.
POST https://mylivestream.channel.media.azure-test.net/0251458ba5df44b2b807ea02f40fed76/ingest.isml/eventdata
Content-Type: application/json
{
"question": "What is the airspeed velocity of an unladen swallow?",
"answers" : [
{"a1": "A shrubbery!"},
{"a2": "I am not a witch!"},
{"a3": "An African or European swallow?"},
{"a4": "It's just a flesh wound."},
]
}
Sugerencia
Abra las Herramientas de desarrollo para el explorador y watch los eventos de vídeo que se desencadenan, así como los mensajes recibidos de la carga JSON de la solicitud.
Ejemplo post con cURL
Al usar cURL, debe establecer el encabezado mediante -H “Content-Type: application/json”
. Use la -d
marca para establecer los datos JSON en la línea de comandos (comillas de escape en el cuerpo JSON con una barra diagonal inversa al usar la línea de comandos). Opcionalmente, puede apuntar a un archivo JSON mediante -d \@\<path-to-json-file\>
.
Post es implícito al enviar datos, por lo que no es necesario usar la marca -X POST.
Post de ejemplo:
curl https://mylivestream.channel.media.azure.net/618377123f4c49b3937ade20204ca0b2/ingest.isml/eventdata -H "Content-Type: application/json" -d "{\\"message\\":\\"Hello from Seattle\\"}" -v
Limpieza de recursos
Asegúrese de apagar el evento en directo y el punto de conexión de streaming y eliminar los recursos que no pretende seguir usando o se le facturará.
Obtener ayuda y soporte técnico
Puede ponerse en contacto con Media Services con preguntas o seguir nuestras actualizaciones mediante uno de los métodos siguientes:
- PREGUNTAS Y RESPUESTAS
-
Stack Overflow. Etiquete las preguntas con
azure-media-services
. - @MSFTAzureMedia o use @AzureSupport para solicitar soporte técnico.
- Abra una incidencia de soporte técnico a través del Azure Portal.