你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:检测运动并发出事件
或者,请查看在服务中创建视频应用程序下的主题。
注意
我们即将停用 Azure 视频分析器预览版服务,建议你在 2022 年 12 月 1 日前从视频分析器转换你的应用程序。
Azure 视频分析器媒体版不受此停用的影响。 它现在已重命名为 Azure 视频索引器。 单击此处了解详情。
必需操作:若要最大程度地减少工作负载的中断,请在 2022 年 12 月 1 日之前根据此指南中所述的建议从视频分析器转换应用程序。 在 2022 年 12 月 1 日之后,Azure 视频分析器帐户无法再正常使用。 从 2022 年 5 月 2 日起,将无法创建新的视频分析器帐户。
本快速入门将引导你完成开始使用 Azure 视频分析器的步骤。 它将 Azure VM 用作 IoT Edge 设备和模拟的实时视频流。 完成设置步骤后,你将能通过视频管道运行模拟实时视频流,该管道可检测和报告该流中的任何运动。 下图显示了该管道的图形表示形式。
本文基于用 C# 编写的示例代码。
本文基于用 Python 编写的示例代码。
先决条件
包含活动订阅的 Azure 帐户。 如果没有帐户,可免费创建一个帐户。
包含以下扩展的 Visual Studio Code:
提示
在安装 Azure IoT Tools 扩展时,系统可能会提示你安装 Docker。 可以忽略此提示。
包含活动订阅的 Azure 帐户。 如果没有帐户,可免费创建一个帐户。
包含以下扩展的 Visual Studio Code:
提示
在安装 Azure IoT Tools 扩展时,系统可能会提示你安装 Docker。 可以忽略此提示。
设置 Azure 资源
部署过程大约需要 20 分钟。 完成部署后,Azure 订阅中会部署某些 Azure 资源,包括:
- 视频分析器帐户 - 此云服务用于注册视频分析器边缘模块,并用于播放录制的视频和视频分析。
- 存储帐户 - 用于存储录制的视频和视频分析。
- 托管标识 - 这是用户分配的托管标识,用于管理对上述存储帐户的访问。
- 虚拟机 - 这是将用作模拟边缘设备的虚拟机。
- IoT 中心 - 这充当消息中心,用于在 IoT 应用程序、IoT Edge 模块以及它管理的设备之间进行双向通信。
除上述资源外,还会在存储帐户的“deployment-output”文件共享中创建以下项,用于快速入门和教程:
- appsettings.json - 此文件包含设备连接字符串和在 Visual Studio Code 中运行示例应用程序所需的其他属性。
- env.txt - 此文件包含使用 Visual Studio Code 生成部署清单所需的环境变量。
- deployment.json - 这是模板用于将 Edge 模块部署到模拟边缘设备的部署清单。
提示
如果在创建所有必需的 Azure 资源时遇到问题,请使用此快速入门中的手动步骤。
概述
此图显示本快速入门中信号的流动方式。 Edge 模块模拟托管实时流式处理协议 (RTSP) 服务器的 IP 相机。 RTSP 源节点从该服务器拉取视频源,并将视频帧发送到运动检测处理器节点。 通过运动检测处理器节点,你可以在实时视频中检测运动。 它会检查传入的视频帧并确定视频中是否有移动。 如果检测到运动,它会将视频帧传递到管道中的下一个节点,并发出事件。 最后,任何发出的事件都会发送到 IoT 中心消息接收器,这些事件在此接收器中被发布到 IoT 中心。
设置开发环境
获取示例代码
克隆 AVA C# 示例存储库。
启动 Visual Studio Code,然后打开下载的存储库所在的文件夹。
在 Visual Studio Code 中,浏览到 src/cloud-to-device-console-app 文件夹,然后创建一个名为 appsettings.json 的文件。 该文件包含运行程序所需的设置。
浏览到上述设置步骤中创建的存储帐户中的文件共享,并找到“deployment-output”文件共享下的“appsettings.json”文件。 单击该文件,然后点击“下载”按钮。 应在新的浏览器选项卡中打开内容,如下所示:
{ "IoThubConnectionString" : "HostName=xxx.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX", "deviceId" : "avasample-iot-edge-device", "moduleId" : "avaedge" }
借助 IoT 中心连接字符串,可以使用 Visual Studio Code 通过 Azure IoT 中心将命令发送到 Edge 模块。 将上述 JSON 复制到“src/cloud-to-device-console-app/appsettings.json”文件中。
接下来,浏览到 src/edge 文件夹并创建一个名为 .env 的文件。 此文件包含 Visual Studio Code 用来将模块部署到边缘设备的属性。
浏览到上述设置步骤中创建的存储帐户中的文件共享,并找到“deployment-output”文件共享下的“env.txt”文件。 单击该文件,然后点击“下载”按钮。 应在新的浏览器选项卡中打开内容,如下所示:
SUBSCRIPTION_ID="<Subscription ID>" RESOURCE_GROUP="<Resource Group>" AVA_PROVISIONING_TOKEN="<Provisioning token>" VIDEO_INPUT_FOLDER_ON_DEVICE="/home/localedgeuser/samples/input" VIDEO_OUTPUT_FOLDER_ON_DEVICE="/var/media" APPDATA_FOLDER_ON_DEVICE="/var/lib/videoanalyzer" CONTAINER_REGISTRY_USERNAME_myacr="<your container registry username>" CONTAINER_REGISTRY_PASSWORD_myacr="<your container registry password>"
将 JSON 从“env.txt”文件复制到“src/edge/.env”文件中 。
连接到 IoT 中心
在 Visual Studio Code 中,通过选择左下角“Azure IoT 中心”窗格旁边的“更多操作”图标,设置 IoT 中心连接字符串 。 从 src/cloud-to-device-console-app/appsettings.json 文件复制该字符串。
注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
大约 30 秒后,在左下部分刷新 Azure IoT 中心。 你应会看到已部署以下模块的边缘设备
avasample-iot-edge-device
:- Edge 中心(模块名称为“edgeHub”)
- Edge 代理(模块名称为“edgeAgent”)
- 视频分析器(模块名称为“avaedge”)
- RTSP 模拟器(模块名称为“rtspsim”)
准备监视模块
运行本快速入门或教程时,事件将发送到 IoT 中心。 若要查看这些事件,请执行以下步骤:
在 Visual Studio Code 中打开“资源管理器”窗格,然后在左下角查找“Azure IoT 中心”。
展开“设备”节点。
右键单击
avasample-iot-edge-device
,并选择“开始监视内置事件终结点”。注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
获取示例代码
克隆 AVA Python 示例存储库。
启动 Visual Studio Code,然后打开下载的存储库所在的文件夹。
在 Visual Studio Code 中,浏览到 src/cloud-to-device-console-app 文件夹,然后创建一个名为 appsettings.json 的文件。 该文件包含运行程序所需的设置。
浏览到上述设置步骤中创建的存储帐户中的文件共享,并找到“deployment-output”文件共享下的“appsettings.json”文件。 单击该文件,然后点击“下载”按钮。 应在新的浏览器选项卡中打开内容,如下所示:
{ "IoThubConnectionString": "HostName=xxx.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX", "deviceId": "avasample-iot-edge-device", "moduleId": "avaedge" }
借助 IoT 中心连接字符串,可以使用 Visual Studio Code 通过 Azure IoT 中心将命令发送到 Edge 模块。 将上述 JSON 复制到“src/cloud-to-device-console-app/appsettings.json”文件中。
接下来,浏览到 src/edge 文件夹并创建一个名为 .env 的文件。 此文件包含 Visual Studio Code 用来将模块部署到边缘设备的属性。
浏览到上述设置步骤中创建的存储帐户中的文件共享,并找到“deployment-output”文件共享下的“env.txt”文件。 单击该文件,然后点击“下载”按钮。 应在新的浏览器选项卡中打开内容,如下所示:
SUBSCRIPTION_ID="<Subscription ID>" RESOURCE_GROUP="<Resource Group>" AVA_PROVISIONING_TOKEN="<Provisioning token>" VIDEO_INPUT_FOLDER_ON_DEVICE="/home/localedgeuser/samples/input" VIDEO_OUTPUT_FOLDER_ON_DEVICE="/var/media" APPDATA_FOLDER_ON_DEVICE="/var/lib/videoanalyzer" CONTAINER_REGISTRY_USERNAME_myacr="<your container registry username>" CONTAINER_REGISTRY_PASSWORD_myacr="<your container registry password>"
将 JSON 从“env.txt”文件复制到“src/edge/.env”文件中 。
连接到 IoT 中心
在 Visual Studio Code 中,通过选择左下角“Azure IoT 中心”窗格旁边的“更多操作”图标,设置 IoT 中心连接字符串 。 从 src/cloud-to-device-console-app/appsettings.json 文件复制该字符串。
注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
大约 30 秒后,在左下部分刷新 Azure IoT 中心。 你应会看到已部署以下模块的边缘设备
avasample-iot-edge-device
:- Edge 中心(模块名称为“edgeHub”)
- Edge 代理(模块名称为“edgeAgent”)
- 视频分析器(模块名称为“avaedge”)
- RTSP 模拟器(模块名称为“rtspsim”)
准备监视模块
运行本快速入门或教程时,事件将发送到 IoT 中心。 若要查看这些事件,请执行以下步骤:
在 Visual Studio Code 中打开“资源管理器”窗格,然后在左下角查找“Azure IoT 中心”。
展开“设备”节点。
右键单击
avasample-iot-edge-device
,并选择“开始监视内置事件终结点”。注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
观看示例视频
设置 Azure 资源时,一个高速公路车流量短视频被复制到 Azure 中用作 IoT Edge 设备的 Linux VM 上。 此快速入门使用视频文件来模拟实时流。
打开一个应用程序,例如 VLC 媒体播放器。 选择 Ctrl+N,然后粘贴指向高速公路交叉口示例视频的链接以开始播放。 可以看到许多车辆在高速公路上行驶的镜头。
设置 Azure 资源时,一个高速公路车流量短视频被复制到 Azure 中用作 IoT Edge 设备的 Linux VM 上。 此快速入门使用视频文件来模拟实时流。
打开一个应用程序,例如 VLC 媒体播放器。 选择 Ctrl+N,然后粘贴指向高速公路交叉口示例视频的链接以开始播放。 可以看到许多车辆在高速公路上行驶的镜头。
检查示例文件
在 Visual Studio Code 中,转到 src/edge。 你将看到 .env 文件以及一些部署模板文件。
部署模板是指边缘设备的部署清单,其中使用变量指定某些属性。 该 .env 文件包含这些变量的值。
转到 src/cloud-to-device-console-app 文件夹。 你可在此处看到 appsettings.json 文件和一些其他文件:
c2d-console-app.csproj - Visual Studio Code 的项目文件。
operations.json - 希望程序运行的操作的列表。
Program.cs - 示例程序代码。 此代码:
- 加载应用设置。
- 调用视频分析器 Edge 模块所公开的直接方法。 可以通过调用模块的直接方法来使用该模块分析实时视频流。
- 暂停以检查“终端”窗口中程序的输出,并检查“输出”窗口中模块生成的事件 。
- 调用直接方法以清理资源。
在 Visual Studio Code 中,转到 src/edge。 你将看到 .env 文件以及一些部署模板文件。
部署模板是指边缘设备的部署清单,其中使用变量指定某些属性。 该 .env 文件包含这些变量的值。
转到 src/cloud-to-device-console-app 文件夹。 你可在此处看到 appsettings.json 文件和一些其他文件:
operations.json - 希望程序运行的操作的列表。
main.py - 示例程序代码。 此代码:
- 加载应用设置。
- 调用 Azure 视频分析器模块所公开的直接方法。 可以通过调用模块的直接方法来使用该模块分析实时视频流。
- 暂停以检查“终端”窗口中程序的输出,并检查“输出”窗口中模块生成的事件 。
- 调用直接方法以清理资源。
生成并部署部署清单
部署清单定义要部署到边缘设备的模块。 它还定义了这些模块的配置设置。
请按照以下步骤从模板文件生成清单,然后将其部署到边缘设备。
打开 Visual Studio Code。
在“AZURE IOT 中心”窗格旁,选择“更多操作”图标以设置 IoT 中心连接字符串 。 可以从 src/cloud-to-device-console-app/appsettings.json 文件复制该字符串。
注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
右键单击“src/edge/deployment.template.json”并选择“生成 IoT Edge 部署清单”。
此操作应在 src/edge/config 文件夹中创建一个名为“deployment.amd64.json”的清单文件 。
右键单击“src/edge/config/deployment.amd64.json”,选择“为单个设备创建部署”,然后选择边缘设备的名称 。
如果系统提示你选择 IoT 中心设备,请从下拉菜单中选择“avasample-iot-edge-device”。
大约 30 秒后,在该窗口的左下角刷新 Azure IoT 中心。 边缘设备现在显示以下已部署的模块:
- 视频分析器 Edge 模块(模块名称为
avaedge
) - 实时流式处理协议 (RTSP) 模拟器(模块名称为
rtspsim
)
- 视频分析器 Edge 模块(模块名称为
部署清单定义要部署到边缘设备的模块。 它还定义了这些模块的配置设置。
请按照以下步骤从模板文件生成清单,然后将其部署到边缘设备。
打开 Visual Studio Code。
在“AZURE IOT 中心”窗格旁,选择“更多操作”图标以设置 IoT 中心连接字符串 。 可以从 src/cloud-to-device-console-app/appsettings.json 文件复制该字符串。
注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
右键单击“src/edge/deployment.template.json”并选择“生成 IoT Edge 部署清单”。
此操作应在 src/edge/config 文件夹中创建一个名为“deployment.amd64.json”的清单文件 。
右键单击“src/edge/config/deployment.amd64.json”,选择“为单个设备创建部署”,然后选择边缘设备的名称 。
如果系统提示你选择 IoT 中心设备,请从下拉菜单中选择“avasample-iot-edge-device”。
大约 30 秒后,在该窗口的左下角刷新 Azure IoT 中心。 边缘设备现在显示以下已部署的模块:
- Azure 视频分析器(模块名称为
avaedge
) - 实时流式处理协议 (RTSP) 模拟器(模块名称为
rtspsim
)
- Azure 视频分析器(模块名称为
准备监视事件
你将使用视频分析器 Edge 模块来检测传入的实时视频流中的运动并将事件发送到 IoT 中心。 若要查看这些事件,请执行以下步骤:
在 Visual Studio Code 中打开“资源管理器”窗格,然后在左下角查找“Azure IoT 中心”。
展开“设备”节点。
右键单击 avasample-iot-edge-device,选择“开始监视内置事件终结点” 。
注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 HAN 终结点将如下所示:
Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
你将使用 Azure 视频分析器模块来检测传入的实时视频流中的运动并将事件发送到 IoT 中心。 若要查看这些事件,请执行以下步骤:
- 在 Visual Studio Code 中打开“资源管理器”窗格,然后在左下角查找“Azure IoT 中心”。
- 展开“设备”节点。
- 右键单击 avasample-iot-edge-device,选择“开始监视内置事件终结点” 。
注意
系统可能会要求你提供 IoT 中心的内置终结点信息。 若要获取此信息,请在 Azure 门户中导航到 IoT 中心,然后在左侧导航窗格中查找“内置终结点”选项。 单击此处,在“与事件中心兼容的终结点”部分下查找“与事件中心兼容的终结点” 。 复制并使用框中的文本。 HAN 终结点将如下所示:Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>
运行示例程序
若要运行该示例代码,请按照以下步骤执行:
在 Visual Studio Code 中,打开“扩展”选项卡(或按 Ctrl+Shift+X),然后搜索“Azure IoT 中心”。
右键单击并选择“扩展设置”。
搜索并启用“显示详细消息”。
在 Visual Studio Code 中,转到 src/cloud-to-device-console-app/operations.json。
在 pipelineTopologySet 节点上,确保你看到以下值:
"pipelineTopologyUrl" : "https://raw.githubusercontent.com/Azure/video-analyzer/main/pipelines/live/topologies/motion-detection/topology.json"
在
livePipelineSet
和livePipelineDelete
节点上,确保 topologyName 的值与管道拓扑中的 name 属性的值匹配 :"topologyName" : "MotionDetection"
通过选择 F5 键启动调试会话。 “终端”窗口将显示一些消息。
operations.json 文件首先调用
pipelineTopologyList
和livePipelineList
。 如果在完成先前的快速入门后清理了资源,则该过程将返回空列表。----------------------- Request: pipelineTopologyList -------------------------------------------------- { "@apiVersion": "1.1" } --------------- Response: pipelineTopologyList - Status: 200 --------------- { "value": [] } --------------------------------------------------------------------------
“终端”窗口将显示下一组直接方法调用:
- 对
pipelineTopologySet
的调用,该调用使用前面的 pipelineTopologyUrl - 对
livePipelineSet
的调用,该调用使用以下正文:
{ "@apiVersion": "1.1", "name": "Sample-Pipeline-1", "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" } ] } }
- 对
livePipelineActivate
的调用,用于启动实时管道和视频流。 - 对
livePipelineList
的第二次调用,显示实时管道处于运行状态。
- 对
“终端”窗口中的输出会在出现
Press Enter to continue
时暂停。 暂时不要选择 Enter。 向上滚动,查看调用的直接方法的 JSON 响应有效负载。切换到 Visual Studio Code 中的“输出”窗口。 可看到视频分析器 Edge 模块正发送到 IoT 中心的消息。 本快速入门中的以下部分将讨论这些消息。
实时管道将继续运行并输出结果。 RTSP 模拟器不断循环源视频。 若要停止实时管道,请返回“终端”窗口,并选择 Enter。
接下来会执行一系列调用,以清理资源:
- 调用
livePipelineDeactivate
停用管道。 - 调用
livePipelineDelete
删除管道。 - 调用
pipelineTopologyDelete
删除拓扑。 - 对
pipelineTopologyList
的最后一次调用显示该列表为空。
- 调用
若要运行该示例代码,请按照以下步骤执行:
在 Visual Studio Code 中,打开“扩展”选项卡(或按 Ctrl+Shift+X),然后搜索“Azure IoT 中心”。
右键单击并选择“扩展设置”。
搜索并启用“显示详细消息”。
在 Visual Studio Code 中,转到 src/cloud-to-device-console-app/operations.json。
在
pipelineTopologySet
节点上,确保你看到以下值:"pipelineTopologyUrl" : "https://raw.githubusercontent.com/Azure/video-analyzer/main/pipelines/live/topologies/motion-detection/topology.json"
在
livePipelineSet
和livePipelineDelete
节点上,确保 topologyName 的值与管道拓扑中的 name 属性的值匹配 :"topologyName" : "MotionDetection"
-
- 导航到 VS Code 中的
TERMINAL
窗口 - 使用 cd 命令导航到 /video-analyzer-iot-edge-python-main/src/cloud-to-device-console-app 目录
- 运行“python main.py”,然后你会看到在
TERMINAL
窗口中输出的消息
- 导航到 VS Code 中的
operations.json 文件首先调用
pipelineTopologyList
和livePipelineList
。 如果在完成先前的快速入门后清理了资源,则该过程将返回空列表。----------------------- Request: pipelineTopologyList -------------------------------------------------- { "@apiVersion": "1.1" } --------------- Response: pipelineTopologyList - Status: 200 --------------- { "value": [] } --------------------------------------------------------------------------
“终端”窗口将显示下一组直接方法调用:
- 对
pipelineTopologySet
的调用,该调用使用前面的 pipelineTopologyUrl - 对
livePipelineSet
的调用,该调用使用以下正文:
{ "@apiVersion": "1.1", "name": "Sample-Pipeline-1", "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" } ] } }
- 对
livePipelineActivate
的调用,用于启动实时管道和视频流。 - 对
livePipelineList
的第二次调用,显示实时管道处于运行状态。
- 对
“终端”窗口中的输出会在出现
Press Enter to continue
时暂停。 暂时不要选择 Enter。 向上滚动,查看调用的直接方法的 JSON 响应有效负载。切换到 Visual Studio Code 中的“输出”窗口。 可看到 Azure 视频分析器模块正发送到 IoT 中心的消息。 本快速入门中的以下部分将讨论这些消息。
实时管道将继续运行并输出结果。 RTSP 模拟器不断循环源视频。 若要停止实时管道,请返回“终端”窗口,并选择 Enter。
接下来会执行一系列调用,以清理资源:
- 调用
livePipelineDeactivate
停用管道。 - 调用
livePipelineDelete
删除管道。 - 调用
pipelineTopologyDelete
删除拓扑。 - 对
pipelineTopologyList
的最后一次调用显示该列表为空。
- 调用
解释结果
运行实时管道时,来自运动检测器处理器节点的结果将通过 IoT 中心消息接收器节点发送到 IoT 中心。 Visual Studio Code 的“输出”窗口中显示的消息包含“body”部分和“applicationProperties”部分 。 有关详细信息,请参阅创建和读取 IoT 中心消息。
在下面的消息中,视频分析器 Edge 模块定义了应用程序属性和正文内容。
MediaSessionEstablished 事件
激活实时管道后,RTSP 源节点尝试连接到在 rtspsim-live555 容器上运行的 RTSP 服务器。 如果连接成功,则打印以下事件。
[IoTHubMonitor] [10:51:34 AM] Message received from [avasample-iot-edge-device/avaedge]:
{
"body": {
{
"sdp": "SDP:\nv=0\r\no=- 1620204694595500 1 IN IP4 xxx.xxx.xxx.xxx\r\ns=Matroska video+audio+(optional)subtitles, streamed by the LIVE555 Media Server\r\ni=media/camera-300s.mkv\r\nt=0 0\r\na=tool:LIVE555 Streaming Media v2020.08.19\r\na=type:broadcast\r\na=control:*\r\na=range:npt=0-300.000\r\na=x-qt-text-nam:Matroska video+audio+(optional)subtitles, streamed by the LIVE555 Media Server\r\na=x-qt-text-inf:media/camera-300s.mkv\r\nm=video 0 RTP/AVP 96\r\nc=IN IP4 0.0.0.0\r\nb=AS:500\r\na=rtpmap:96 H264/90000\r\na=fmtp:96 packetization-mode=1;profile-level-id=4D0029;sprop-parameter-sets=Z00AKeKQCgC3YC3AQEBpB4kRUA==,aO48gA==\r\na=control:track1\r\n"
},
"properties": {
"topic": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ava-sample-deployment/providers/Microsoft.Media/videoAnalyzers/avasample",
"subject": "/edgeModules/avaedge/livePipelines/Sample-Pipeline-1/sources/rtspSource",
"eventType": "Microsoft.VideoAnalyzer.Diagnostics.MediaSessionEstablished",
"eventTime": "2021-05-06T00:58:58.602Z",
"dataVersion": "1.0"
},
"systemProperties": {
"iothub-connection-device-id": "avasample-iot-edge-device",
"iothub-connection-module-id": "avaedge",
"iothub-message-source": "Telemetry",
"messageId": "459c3255-7c86-4ff5-a1e5-7ce3fcb07627",
"contentType": "application/json",
"contentEncoding": "utf-8"
}
}
在以上脚本中:
- 此消息是一个诊断事件 (MediaSessionEstablished)。 它指示 RTSP 源节点(使用者)与 RTSP 模拟器连接,并已开始接收(模拟的)实时馈送。
- sdp 部分包含有关诊断事件的数据。 在本例中,数据包含会话描述协议 (SDP) 详细信息。
MotionDetection 事件
当检测到运动时,视频分析器模块会发送推理事件。 将 **type 设置为 motion,指示它是运动检测处理器的结果。
以下是此消息的示例:
{
"body": {
"timestamp": 145818422564951,
"inferences": [
{
"type": "motion",
"motion": {
"box": {
"l": 0.322176,
"t": 0.574627,
"w": 0.525,
"h": 0.088889
}
}
}
]
},
"properties": { … },
"systemProperties": { … }
}
在本示例中:
body 值包含有关分析事件的数据。 在本例中,该事件是推理事件,因此正文包含 timestamp 和 inferences 数据 。
inferences 数据指示 type 为 motion 。 它包含有关该 motion 事件的其他数据。
box 部分包含移动对象周围的边界框的坐标。 值按视频的宽度和高度(以像素为单位)进行规范化。 例如,若要获得原始像素坐标,需要将水平维度乘以 1920,将垂直维度乘以 1080。
l - distance from left of image t - distance from top of image w - width of bounding box h - height of bounding box
运行实时管道时,来自运动检测器处理器节点的结果将通过 IoT 中心消息接收器节点发送到 IoT 中心。 Visual Studio Code 的“输出”窗口中显示的消息包含“body”部分和“applicationProperties”部分 。 有关详细信息,请参阅创建和读取 IoT 中心消息。
在下面的消息中,Azure 视频分析器模块定义了应用程序属性和正文内容。
MediaSessionEstablished 事件
激活实时管道后,RTSP 源节点尝试连接到在 rtspsim-live555 容器上运行的 RTSP 服务器。 如果连接成功,则打印以下事件。
[IoTHubMonitor] [10:51:34 AM] Message received from [avasample-iot-edge-device/avaedge]:
{
"body": {
{
"sdp": "SDP:\nv=0\r\no=- 1620204694595500 1 IN IP4 xxx.xxx.xxx.xxx\r\ns=Matroska video+audio+(optional)subtitles, streamed by the LIVE555 Media Server\r\ni=media/camera-300s.mkv\r\nt=0 0\r\na=tool:LIVE555 Streaming Media v2020.08.19\r\na=type:broadcast\r\na=control:*\r\na=range:npt=0-300.000\r\na=x-qt-text-nam:Matroska video+audio+(optional)subtitles, streamed by the LIVE555 Media Server\r\na=x-qt-text-inf:media/camera-300s.mkv\r\nm=video 0 RTP/AVP 96\r\nc=IN IP4 0.0.0.0\r\nb=AS:500\r\na=rtpmap:96 H264/90000\r\na=fmtp:96 packetization-mode=1;profile-level-id=4D0029;sprop-parameter-sets=Z00AKeKQCgC3YC3AQEBpB4kRUA==,aO48gA==\r\na=control:track1\r\n"
},
"properties": {
"topic": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ava-sample-deployment/providers/Microsoft.Media/videoAnalyzers/avasample",
"subject": "/edgeModules/avaedge/livePipelines/Sample-Pipeline-1/sources/rtspSource",
"eventType": "Microsoft.VideoAnalyzer.Diagnostics.MediaSessionEstablished",
"eventTime": "2021-05-06T00:58:58.602Z",
"dataVersion": "1.0"
},
"systemProperties": {
"iothub-connection-device-id": "avasample-iot-edge-device",
"iothub-connection-module-id": "avaedge",
"iothub-message-source": "Telemetry",
"messageId": "459c3255-7c86-4ff5-a1e5-7ce3fcb07627",
"contentType": "application/json",
"contentEncoding": "utf-8"
}
}
在以上脚本中:
- 此消息是一个诊断事件 (MediaSessionEstablished)。 它指示 RTSP 源节点(使用者)与 RTSP 模拟器连接,并已开始接收(模拟的)实时馈送。
- sdp 部分包含有关诊断事件的数据。 在本例中,数据包含会话描述协议 (SDP) 详细信息。
MotionDetection 事件
当检测到运动时,视频分析器模块会发送推理事件。 将 type 设置为 motion,指示它是运动检测处理器的结果 。
以下是此消息的示例:
{
"body": {
"timestamp": 145818422564951,
"inferences": [
{
"type": "motion",
"motion": {
"box": {
"l": 0.322176,
"t": 0.574627,
"w": 0.525,
"h": 0.088889
}
}
}
]
},
"properties": { … },
"systemProperties": { … }
}
在本示例中:
body 值包含有关分析事件的数据。 在本例中,该事件是推理事件,因此正文包含 timestamp 和 inferences 数据 。
inferences 数据指示 type 为 motion 。 它包含有关该 motion 事件的其他数据。
box 部分包含移动对象周围的边界框的坐标。 值按视频的宽度和高度(以像素为单位)进行规范化。 例如,若要获得原始像素坐标,需要将水平维度乘以 1920,将垂直维度乘以 1080。
l - distance from left of image t - distance from top of image w - width of bounding box h - height of bounding box
清理资源
如果想学习其他快速入门,则请保留所创建的资源。 否则,请在 Azure 门户中,转到资源组,选择运行本快速入门所用的资源组,然后删除所有资源。
后续步骤
按照快速入门:使用自己的 HTTP 模型分析来自(模拟)IP 相机的实时视频源,以将 AI 应用于实时视频源。
查看高级用户面临的其他挑战:
- 使用支持 RTSP 的 IP 相机,而不是使用 RTSP 模拟器。 可以在 ONVIF 一致性产品页上找到支持 RTSP 的 IP 相机。 查找符合配置文件 G、S 或 T 的设备。
- 使用 AMD64 或 x64 Linux 设备,而不使用 Azure 中的 Linux VM。 此设备必须与 IP 相机位于同一网络中。 按照在 Linux 上安装 Azure IoT Edge 运行时中的说明进行操作。 然后按照将首个 IoT Edge 模块部署到虚拟 Linux 设备中的说明进行操作,将设备注册到 Azure IoT 中心。