你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 .NET IoT Edge 客户端库的 Azure 实时视频分析 - 版本 1.0.0-beta.1

IoT Edge 上的实时视频分析提供了一个平台,可用于构建跨越边缘和云的智能视频应用程序。 该平台提供捕获、录制和分析实时视频的功能,以及将结果、视频和视频分析发布到云或边缘中的 Azure 服务。 它旨在成为一个可扩展的平台,使你能够连接不同的视频分析边缘模块 (例如认知服务容器、使用开源机器学习模型构建的自定义边缘模块,或使用自己的数据) 训练的自定义模型,并使用它们分析实时视频,而无需担心生成和运行实时视频管道的复杂性。

在 IoT Edge 上使用用于实时视频分析的客户端库可以:

产品文档 | 直接方法 | 媒体图 | 源代码 | 样品

入门

这是仅限模型的 SDK。 所有客户端操作都是使用 Microsoft Azure IoT SDK 完成的。 此 sdk 提供可用于与 Azure Iot SDK 交互的模型。

验证客户端

如上所述,客户端来自 Azure IoT SDK。 需要获取 IoT 设备连接字符串 才能对 Azure IoT SDK 进行身份验证。 有关详细信息,请访问: https://github.com/Azure/azure-iot-sdk-csharp

var connectionString = "connectionString";
this._serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

安装包

使用 NuGet 安装适用于 .NET 的 实时视频分析 客户端库:

dotnet add package Azure.Media.Analytics.Edge --version 1.0.0-beta.1

使用 NuGet 安装适用于 .Net 的 Azure IoT 中心 SDK:

dotnet add package Microsoft.Azure.Devices --version 1.28.1

先决条件

  • 使用此包需要 C# 。

  • 需要一个有效的 Azure 订阅和一个 IoT 设备连接字符串 才能使用此包。

  • 需要使用与正在使用的 LVA Edge 模块版本相对应的 SDK 版本。

    SDK 中 IsInRole 中的声明 LVA Edge 模块
    1.0.0b1 2.0

创建图形拓扑并发出请求

请访问入门代码的示例

关键概念

MediaGraph 拓扑与 MediaGraph 实例

图形拓扑是图形的蓝图或模板。 它使用占位符作为其值来定义图形的参数。 图形实例引用图形拓扑并指定参数。 这样,就可以有多个图形实例引用同一拓扑,但参数值不同。 有关详细信息,请访问 媒体图拓扑和实例

CloudToDeviceMethod

CloudToDeviceMethodazure-iot-hub SDK 的一部分。 此方法允许将单向通知传达给 IoT 中心内的设备。 在本例中,我们想要传达各种图形方法,例如 MediaGraphTopologySetRequestMediaGraphTopologyGetRequest。 若要使用 CloudToDeviceMethod ,需要传入一个参数: method_name ,然后设置该方法的 Json 有效负载。

参数 method_name 是要发送的媒体图请求的名称。 请确保使用每个方法的预定义 method_name 属性。 例如,MediaGraphTopologySetRequest.method_name

若要设置云方法的 Json 有效负载,请使用媒体图请求方法的 GetPayloadAsJson() 函数。 例如: directCloudMethod.SetPayloadJson(MediaGraphTopologySetRequest.GetPayloadAsJson())

示例

创建图形拓扑

若要创建图形拓扑,需要定义参数、源和接收器。

// Add parameters to Topology
private void SetParameters(MediaGraphTopologyProperties graphProperties)
{
    graphProperties.Parameters.Add(new MediaGraphParameterDeclaration("rtspUserName", MediaGraphParameterType.String)
    {
        Description = "rtsp source user name.",
        Default = "dummyUserName"
    });
    graphProperties.Parameters.Add(new MediaGraphParameterDeclaration("rtspPassword", MediaGraphParameterType.SecretString)
    {
        Description = "rtsp source password.",
        Default = "dummyPassword"
    });
    graphProperties.Parameters.Add(new MediaGraphParameterDeclaration("rtspUrl", MediaGraphParameterType.String)
    {
        Description = "rtsp Url"
    });
}
// Add sources to Topology
private void SetSources(MediaGraphTopologyProperties graphProperties)
{
    graphProperties.Sources.Add(new MediaGraphRtspSource("rtspSource", new MediaGraphUnsecuredEndpoint("${rtspUrl}")
        {
            Credentials = new MediaGraphUsernamePasswordCredentials("${rtspUserName}", "${rtspPassword}")
        })
    );
}

// Add sinks to Topology
private void SetSinks(MediaGraphTopologyProperties graphProperties)
{
    var graphNodeInput = new List<MediaGraphNodeInput>
    {
        new MediaGraphNodeInput("rtspSource")
    };
    var cachePath = "/var/lib/azuremediaservices/tmp/";
    var cacheMaxSize = "2048";
    graphProperties.Sinks.Add(new MediaGraphAssetSink("assetSink", graphNodeInput, "sampleAsset-${System.GraphTopologyName}-${System.GraphInstanceName}", cachePath, cacheMaxSize)
    {
        SegmentLength = System.Xml.XmlConvert.ToString(TimeSpan.FromSeconds(30)),
    });
}
private MediaGraphTopology BuildGraphTopology()
{
    var graphProperties = new MediaGraphTopologyProperties
    {
        Description = "Continuous video recording to an Azure Media Services Asset",
    };
    SetParameters(graphProperties);
    SetSources(graphProperties);
    SetSinks(graphProperties);
    return new MediaGraphTopology("ContinuousRecording")
    {
        Properties = graphProperties
    };
}

创建图形实例

若要创建图形实例,需要具有现有的图形拓扑。

private MediaGraphInstance BuildGraphInstance(string graphTopologyName)
{
    var graphInstanceProperties = new MediaGraphInstanceProperties
    {
        Description = "Sample graph description",
        TopologyName = graphTopologyName,
    };

    graphInstanceProperties.Parameters.Add(new MediaGraphParameterDefinition("rtspUrl", "rtsp://sample.com"));

    return new MediaGraphInstance("graphInstance")
    {
        Properties = graphInstanceProperties
    };
}

调用图形方法请求

若要在设备上调用图形方法,需要首先使用 lva sdk 定义请求。 然后使用 iot sdk 的 发送该方法请求 CloudToDeviceMethod

var setGraphRequest = new MediaGraphTopologySetRequest(graphTopology);

var directMethod = new CloudToDeviceMethod(setGraphRequest.MethodName);
directMethod.SetPayloadJson(setGraphRequest.GetPayloadAsJson());

var setGraphResponse = await _serviceClient.InvokeDeviceMethodAsync(_deviceId, _moduleId, directMethod);

若要使用 SDK 尝试不同的媒体图拓扑,请参阅官方 示例

疑难解答

  • 使用 IoT 中心 CloudToDeviceMethod 发送方法请求时,请记住不要直接键入方法请求名称。 需改用 [MethodRequestName.method_name]
  • 确保先序列化整个方法请求,然后再将其传递到 CloudToDeviceMethod

后续步骤

贡献

本项目欢迎贡献和建议。 大多数贡献要求你同意贡献者许可协议 (CLA),并声明你有权(并且确实有权)授予我们使用你的贡献的权利。 有关详细信息,请访问 https://cla.microsoft.com

如果遇到任何问题,请在 Github 上提出问题。

提交拉取请求时,CLA 机器人将自动确定你是否需要提供 CLA,并相应地修饰 PR(例如标签、注释)。 直接按机器人提供的说明操作。 只需使用 CLA 对所有存储库执行一次这样的操作。

本项目采用 Microsoft 开源行为准则。 有关详细信息,请参阅“行为准则常见问题解答”,如有其他任何问题或意见,请联系 opencode@microsoft.com。