Inicio rápido: Introducción a Azure Video Analyzer
![]()
Como alternativa, consulte los temas en Creación de aplicaciones de vídeo en el servicio.
Este inicio rápido le guiará por los pasos necesarios para empezar a usar Azure Video Analyzer. Usa una máquina virtual de Azure como un dispositivo IoT Edge y una secuencia de vídeo en directo simulada.
Después de completar los pasos de la configuración, podrá ejecutar la secuencia de vídeo en directo simulada mediante una canalización que detecta e informa de todos los movimientos de esa secuencia. El siguiente diagrama representa gráficamente esa canalización.
Requisitos previos
Una cuenta de Azure que tenga una suscripción activa. Cree una cuenta gratuita, en caso de que aún no lo haya hecho.
Nota
Necesitará una suscripción de Azure en la que tenga acceso a los roles Colaborador y Administrador de acceso de usuario. Si no tiene los permisos adecuados, póngase en contacto con el administrador de la cuenta para que se los conceda.
Visual Studio Code con las siguientes extensiones:
Sugerencia
Al instalar la extensión de Azure IoT Tools, es posible que se le solicite que instale Docker. Si lo desea, ignore esta petición.
Configuración de los recursos de Azure
El proceso de implementación tardará unos 20 minutos. Al finalizar, tendrá determinados recursos de Azure implementados en la suscripción de Azure, entre los que se incluyen:
- Cuenta de Video Analyzer: este servicio en la nube se usa para registrar el módulo perimetral Video Analyzer y para reproducir vídeo grabado y análisis de vídeo.
- Cuenta de almacenamiento: para almacenar vídeo grabado y análisis de vídeo.
- Identidad administrada: es la identidad administrada asignada por el usuario que se usa para administrar el acceso a la cuenta de almacenamiento anterior.
- Máquina virtual: esta es una máquina virtual que actuará como su dispositivo perimetral simulado.
- IoT Hub: funciona como un centro de mensajes común para la comunicación bidireccional entre la aplicación de IoT, los módulos de IoT Edge y los dispositivos que administra.
Configurado su entorno de desarrollo
Obtención de la cadena de conexión de IoT Hub
- En Azure Portal, vaya a la instancia de IoT Hub que creó como parte del paso de configuración anterior.
- Busque la opción Directivas de acceso compartido en el panel de navegación izquierdo y haga clic allí.
- Haga clic en la directiva llamada iothubowner
- Copie la Cadena de conexión principal: su aspecto será similar a
HostName=xxx.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX
Conexión a IoT Hub
- Abra Visual Studio Code, seleccione Ver > Explorador. O bien, seleccione Ctrl+Mayús+E.
- En la esquina inferior izquierda de la pestaña Explorador, seleccione Azure IoT Hub.
- Seleccione el icono Más opciones para ver el menú contextual. Luego, seleccione Set IoT Hub Connection String (Establecer cadena de conexión de IoT Hub).
- Cuando aparezca un cuadro de entrada, escriba la cadena de conexión de IoT Hub.
- En unos 30 segundos, actualice Azure IoT Hub en la sección inferior izquierda. Debería ver el dispositivo perimetral
avasample-iot-edge-device, que debe tener los siguientes módulos implementados:- Módulo perimetral de Video Analyzer (nombre del módulo avaedge)
- Simulador RTSP (nombre de módulo rtspsim)
Sugerencia
Si ha implementado manualmente Video Analyzer en un dispositivo perimetral (por ejemplo, un dispositivo ARM64), verá que el módulo se muestra en ese dispositivo, bajo Azure IoT Hub. Puede seleccionar ese módulo y seguir el resto de los pasos siguientes.
Preparación para supervisar los módulos
Cuando use o ejecute este inicio rápido, los eventos se enviarán a IoT Hub. Para ver estos eventos, siga estos pasos:
En Visual Studio Code, abra la pestaña Extensiones (o presione Ctrl + Mayús + X) y busque Azure IoT Hub.
Haga clic con el botón derecho y seleccione la opción Configuración de la extensión.
Busque y habilite "Show Verbose Message" (Mostrar mensaje detallado).
(Mostrar mensaje detallado)Abra el panel del explorador en Visual Studio Code y busque Azure IoT Hub en la esquina inferior izquierda.
Expanda el nodo Devices (Dispositivos).
Haga clic con el botón derecho en
avasample-iot-edge-devicey seleccione Iniciar la supervisión del punto de conexión de eventos integrado.Nota
Es posible que se le pida que proporcione información del punto de conexión integrado del centro de IoT. Para obtener esa información, en Azure Portal, vaya a su centro de IoT y busque la opción Puntos de conexión integrados en el panel de navegación izquierdo. Haga clic ahí y busque el punto de conexión compatible con el centro de eventos en la sección Punto de conexión compatible con el centro de eventos. Copie y use el texto del cuadro. El aspecto del punto de conexión será similar a este:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
Uso de llamadas de método directo
Ahora puede analizar secuencias de vídeo en directo mediante la invocación de métodos directos expuestos por el módulo perimetral Video Analyzer. Lea Métodos directos de Video Analyzer para examinar todos los métodos directos proporcionados por el módulo. El esquema de los métodos directos se puede encontrar aquí.
Enumeración de topologías de canalización
En este paso se enumeran todas las topologías de canalización del módulo.
- Haga clic con el botón derecho en el módulo "avaedge" y seleccione Invoke Module Direct Method (Invocar método directo del módulo) en el menú contextual.
- Verá un cuadro de edición emergente en la parte superior central de la ventana de Visual Studio Code. Escriba
pipelineTopologyListen el cuadro de edición y pulse Entrar. - A continuación, copie y pegue la carga de JSON siguiente en el cuadro de edición y presione ENTRAR.
{
"@apiVersion" : "1.1"
}
En unos segundos, verá la siguiente respuesta en la ventana de salida:
[DirectMethod] Invoking Direct Method [pipelineTopologyList] to [avasample-iot-edge-device/avaedge] ...
[DirectMethod] Response from [avasample-iot-edge-device/avaedge]:
{
"status": 200,
"payload": {
"value": []
}
}
Se espera la respuesta anterior ya que no se ha creado ninguna topología de canalización.
Establecimiento de una topología de canalización
Con los mismos pasos de antes, puede invocar pipelineTopologySet para establecer una topología de canalización mediante el siguiente JSON como carga. Se ocupará de la creación de una topología de canalización llamada "MotionDetection".
{
"@apiVersion": "1.1",
"name": "MotionDetection",
"properties": {
"description": "Analyzing live video to detect motion and emit events",
"parameters": [
{
"name": "rtspUrl",
"type": "string",
"description": "rtspUrl"
},
{
"name": "rtspUserName",
"type": "string",
"description": "rtspUserName",
"default": "dummyUserName"
},
{
"name": "rtspPassword",
"type": "string",
"description": "rtspPassword",
"default": "dummypw"
}
],
"sources": [
{
"@type": "#Microsoft.VideoAnalyzer.RtspSource",
"name": "rtspSource",
"transport": "tcp",
"endpoint": {
"@type": "#Microsoft.VideoAnalyzer.UnsecuredEndpoint",
"credentials": {
"@type": "#Microsoft.VideoAnalyzer.UsernamePasswordCredentials",
"username": "${rtspUserName}",
"password": "${rtspPassword}"
},
"url": "${rtspUrl}"
}
}
],
"processors": [
{
"@type": "#Microsoft.VideoAnalyzer.MotionDetectionProcessor",
"sensitivity": "medium",
"name": "motionDetection",
"inputs": [
{
"nodeName": "rtspSource",
"outputSelectors": []
}
]
}
],
"sinks": [
{
"hubOutputName": "inferenceOutput",
"@type": "#Microsoft.VideoAnalyzer.IotHubMessageSink",
"name": "iotHubSink",
"inputs": [
{
"nodeName": "motionDetection"
}
]
}
]
}
}
Esta carga de JSON crea una topología que define tres parámetros, donde dos de ellos tienen valores predeterminados. La topología tiene un nodo de origen (origen RTSP), un nodo de procesador (procesador de detección de movimiento y un nodo receptor (receptor de mensajes de IoT Hub). La representación visual de la topología se muestra más arriba.
En unos segundos, se ve la siguiente respuesta en la ventana SALIDA.
{
"status": 201,
"payload": {
"systemData": {
"createdAt": "2021-03-21T18:16:46.491Z",
"lastModifiedAt": "2021-03-21T18:16:46.491Z"
},
"name": "MotionDetection",
"properties": {
"description": "Analyzing live video to detect motion and emit events",
"parameters": [
{
"name": "rtspPassword",
"type": "string",
"description": "rtspPassword",
"default": "dummypw"
},
{
"name": "rtspUrl",
"type": "string",
"description": "rtspUrl"
},
{
"name": "rtspUserName",
"type": "string",
"description": "rtspUserName",
"default": "dummyUserName"
}
],
"sources": [
{
"@type": "#Microsoft.VideoAnalyzer.RtspSource",
"name": "rtspSource",
"transport": "tcp",
"endpoint": {
"@type": "#Microsoft.VideoAnalyzer.UnsecuredEndpoint",
"url": "${rtspUrl}",
"credentials": {
"@type": "#Microsoft.VideoAnalyzer.UsernamePasswordCredentials",
"username": "${rtspUserName}",
"password": "${rtspPassword}"
}
}
}
],
"processors": [
{
"@type": "#Microsoft.VideoAnalyzer.MotionDetectionProcessor",
"sensitivity": "medium",
"eventAggregationWindow": "PT1S",
"name": "motionDetection",
"inputs": [
{
"nodeName": "rtspSource",
"outputSelectors": []
}
]
}
],
"sinks": [
{
"@type": "#Microsoft.VideoAnalyzer.IotHubMessageSink",
"hubOutputName": "inferenceOutput",
"name": "iotHubSink",
"inputs": [
{
"nodeName": "motionDetection",
"outputSelectors": []
}
]
}
]
}
}
}
El estado que se devuelve es 201, que indica que se ha creado una topología.
Pruebe los siguientes pasos:
- Vuelva a invocar a
pipelineTopologySet. El código de estado que se devuelve es 200. Este código indica que se ha actualizado correctamente una topología ya existente. - Vuelva a invocar a
pipelineTopologySet, pero cambie la cadena de descripción. El código de estado devuelto es 200 y la descripción se ha actualizado al nuevo valor. - Invoque a
pipelineTopologyListcomo se describió en la sección anterior. Ahora puede ver la topología "MotionDetection" en la carga devuelta.
Lectura de la topología de canalización
Invoque a pipelineTopologyGet mediante el uso de la siguiente carga.
{
"@apiVersion" : "1.1",
"name" : "MotionDetection"
}
En unos segundos, se ve la siguiente respuesta en la ventana SALIDA:
{
"status": 200,
"payload": {
"systemData": {
"createdAt": "2021-03-21T18:16:46.491Z",
"lastModifiedAt": "2021-03-21T18:16:46.491Z"
},
"name": "MotionDetection",
"properties": {
"description": "Analyzing live video to detect motion and emit events",
"parameters": [
{
"name": "rtspPassword",
"type": "string",
"description": "rtspPassword",
"default": "dummypw"
},
{
"name": "rtspUrl",
"type": "string",
"description": "rtspUrl"
},
{
"name": "rtspUserName",
"type": "string",
"description": "rtspUserName",
"default": "dummyUserName"
}
],
"sources": [
{
"@type": "#Microsoft.VideoAnalyzer.RtspSource",
"name": "rtspSource",
"transport": "tcp",
"endpoint": {
"@type": "#Microsoft.VideoAnalyzer.UnsecuredEndpoint",
"url": "${rtspUrl}",
"credentials": {
"@type": "#Microsoft.VideoAnalyzer.UsernamePasswordCredentials",
"username": "${rtspUserName}",
"password": "${rtspPassword}"
}
}
}
],
"processors": [
{
"@type": "#Microsoft.VideoAnalyzer.MotionDetectionProcessor",
"sensitivity": "medium",
"eventAggregationWindow": "PT1S",
"name": "motionDetection",
"inputs": [
{
"nodeName": "rtspSource",
"outputSelectors": []
}
]
}
],
"sinks": [
{
"@type": "#Microsoft.VideoAnalyzer.IotHubMessageSink",
"hubOutputName": "inferenceOutput",
"name": "iotHubSink",
"inputs": [
{
"nodeName": "motionDetection",
"outputSelectors": []
}
]
}
]
}
}
}
En la carga de respuesta, observe estos detalles:
- El código de estado es 200, lo que indica que se ha realizado correctamente.
- La carga incluye las marcas de tiempo
createdAtylastModifiedAt.
Creación de una canalización en vivo mediante la topología
A continuación, cree una canalización en vivo que haga referencia a la topología de canalización anterior. Invoque el método directo livePipelineSet mediante la siguiente carga:
{
"@apiVersion" : "1.1",
"name": "mdpipeline1",
"properties": {
"topologyName": "MotionDetection",
"description": "Sample pipeline description",
"parameters": [
{
"name": "rtspUrl",
"value": "rtsp://rtspsim:554/media/camera-300s.mkv"
},
{
"name": "rtspUserName",
"value": "testuser"
},
{
"name": "rtspPassword",
"value": "testpassword"
}
]
}
}
Tenga en cuenta que esta carga:
- La carga anterior especifica la topología ("MotionDetection") que usará la canalización en vivo.
- La carga contiene el valor de parámetro para
rtspUrl, el cual no tenía un valor predeterminado en la carga de topología. Este valor es un vínculo al vídeo de ejemplo siguiente:
En unos segundos, se ve la siguiente respuesta en la ventana SALIDA:
{
"status": 201,
"payload": {
"systemData": {
"createdAt": "2021-03-21T18:27:41.639Z",
"lastModifiedAt": "2021-03-21T18:27:41.639Z"
},
"name": "mdpipeline1",
"properties": {
"state": "Inactive",
"description": "Sample pipeline description",
"topologyName": "MotionDetection",
"parameters": [
{
"name": "rtspPassword",
"value": "testpassword"
},
{
"name": "rtspUrl",
"value": "rtsp://rtspsim:554/media/camera-300s.mkv"
},
{
"name": "rtspUserName",
"value": "testuser"
}
]
}
}
}
En la carga de respuesta, observe que:
- El código de estado es 201, lo que indica que se ha creado una nueva canalización en vivo.
- El estado es "Inactivo", lo que indica que la canalización en vivo se creó pero no se activó. Para más información, consulte Estados de canalización.
Intente los siguientes métodos directos como se indica a continuación:
- Vuelva a invocar a
livePipelineSetcon la misma carga y observe que el código de estado devuelto es ahora 200. - Vuelva a invocar a
livePipelineSet, pero con una descripción diferente y observe la descripción actualizada en la carga de respuesta, la cual indica que la canalización en vivo se actualizó correctamente. - Invoque
livePipelineSet, pero cambie el nombre a "mdpipeline2" yrtspUrla "rtsp://rtspsim:554/media/lots_015.mkv". En la carga de respuesta, observe la canalización en vivo que se acaba de crear (es decir, el código de estado 201).Nota
Como se explica en Topologías de canalización, puede crear varias canalizaciones en vivo para analizar secuencias de vídeo en directo de muchas cámaras con la misma topología de canalización. Si crea canalizaciones en vivo adicionales, procure eliminarlas durante el paso de limpieza.
Activación de la canalización en vivo
A continuación, puede activar la canalización en vivo, que inicia el flujo de vídeo en directo (simulado) a través de la canalización. Invoque el método directo livePipelineActivate mediante la siguiente carga:
{
"@apiVersion" : "1.1",
"name" : "mdpipeline1"
}
En pocos segundos, verá la siguiente respuesta en la ventana SALIDA.
{
"status": 200,
"payload": null
}
El código de estado 200 indica que la canalización en vivo se ha activado correctamente.
Comprobación del estado de la canalización en vivo
Ahora, invoque el método directo livePipelineGet mediante la carga siguiente:
{
"@apiVersion" : "1.1",
"name" : "mdpipeline1"
}
En pocos segundos, verá la siguiente respuesta en la ventana SALIDA.
{
"status": 200,
"payload": {
"systemData": {
"createdAt": "2021-03-21T18:27:41.639Z",
"lastModifiedAt": "2021-03-21T18:27:41.639Z"
},
"name": "mdpipeline1",
"properties": {
"state": "Active",
"description": "Sample pipeline description",
"topologyName": "MotionDetection",
"parameters": [
{
"name": "rtspPassword",
"value": "testpassword"
},
{
"name": "rtspUrl",
"value": "rtsp://rtspsim:554/media/camera-300s.mkv"
},
{
"name": "rtspUserName",
"value": "testuser"
}
]
}
}
}
En la carga de respuesta, observe los siguientes detalles:
- El código de estado es 200, lo que indica que se ha realizado correctamente.
- El estado es "Activo", lo que indica que la canalización en vivo se encuentra activa en este momento.
Observación de resultados
La canalización en vivo que ha creado y activado anteriormente usa el nodo de procesador de detección de movimiento para detectar el movimiento en la secuencia de vídeo en directo entrante y envía eventos al receptor de IoT Hub. A continuación, estos eventos se retransmiten a IoT Hub como mensajes, como se puede observar ahora. Verá mensajes en la ventana de salida que tienen el siguiente "cuerpo":
{
"timestamp": 145471641211899,
"inferences": [
{
"type": "motion",
"motion": {
"box": {
"l": 0.514644,
"t": 0.574627,
"w": 0.3375,
"h": 0.096296
}
}
}
]
}
Observe este detalle:
- En la sección Inferencias se indica que el tipo es movimiento. Proporciona datos adicionales sobre el evento de movimiento y proporciona un rectángulo de selección para la región del fotograma de vídeo (en la marca de tiempo especificada) donde se detectó el movimiento.
Invocación de llamadas de método directo adicionales para la limpieza
A continuación, puede invocar métodos directos para desactivar y eliminar la canalización en vivo (en ese orden).
Desactivación de la canalización en vivo
Invoque el método directo livePipelineDeactivate mediante la siguiente carga:
{
"@apiVersion" : "1.1",
"name" : "mdpipeline1"
}
En pocos segundos, verá la siguiente respuesta en la ventana SALIDA:
{
"status": 200,
"payload": null
}
El código de estado 200 indica que la canalización en vivo se ha desactivado correctamente.
A continuación, intente invocar livePipelineGet como se ha indicado en este mismo artículo. Observe el valor de estado.
Eliminación de la canalización en vivo
Invoque el método directo livePipelineDelete mediante la siguiente carga
{
"@apiVersion" : "1.1",
"name" : "mdpipeline1"
}
En pocos segundos, verá la siguiente respuesta en la ventana SALIDA:
{
"status": 200,
"payload": null
}
El código de estado 200 indica que la canalización en vivo se ha eliminado correctamente.
Si también creó la canalización denominada "mdpipeline2", no podrá eliminar la topología de canalización sin eliminar también esta canalización adicional. Vuelva a invocar el método directo livePipelineDelete mediante la siguiente carga:
{
"@apiVersion" : "1.1",
"name" : "mdpipeline2"
}
En pocos segundos, verá la siguiente respuesta en la ventana de salida:
{
"status": 200,
"payload": null
}
El código de estado 200 indica que la canalización en vivo se ha eliminado correctamente.
Puede invocar a livePipelineList con la misma carga que pipelineTopologyList. Observe que no se enumera ninguna canalización en vivo.
Eliminación de la topología de canalización
Una vez eliminadas todas las canalizaciones en vivo, puede invocar el método directo pipelineTopologyDelete con la siguiente carga:
{
"@apiVersion" : "1.1",
"name" : "MotionDetection"
}
En pocos segundos, verá la siguiente respuesta en la ventana SALIDA.
{
"status": 200,
"payload": null
}
El código de estado 200 indica que la topología se ha eliminado correctamente.
Puede intentar invocar a pipelineTopologyList y observar que el módulo no contiene topologías.
Limpieza de recursos
Si quiere probar otros artículos de inicio rápidos o tutoriales, conserve los recursos que creó. En caso contrario, vaya a Azure Portal, luego a los grupos de recursos, seleccione el grupo de recursos en que ejecutó este inicio rápido y elimine todos los recursos.
Pasos siguientes
- Pruebe el inicio rápido para grabar vídeos en la nube al detectarse movimiento
- Pruebe el inicio rápido para analizar vídeo en directo
- Más información sobre los mensajes de diagnóstico