如何通过JobId或SmoothStreamingUrl获取Azure Media Services的输入/输出资产
借助JobId或SmoothStreamingUrl获取Azure Media Services资产名称及存储位置
一、通过JobId获取输入/输出资产信息
你可以通过JobId直接查询对应的Job资源,从Job的输入和输出属性中关联到对应资产,进而获取资产名称和存储位置。以下是使用Azure.ResourceManager.Media包的实现代码:
using Azure; using Azure.ResourceManager; using Azure.ResourceManager.Media; using Azure.ResourceManager.Media.Models; // 初始化ArmClient var armClient = new ArmClient(new DefaultAzureCredential()); // 替换为你的Azure订阅ID、资源组名称、媒体服务账户名称 var subscriptionId = "your-subscription-id"; var resourceGroupName = "your-resource-group-name"; var mediaAccountName = "your-media-account-name"; // 替换为目标JobId var jobId = "nb:jid:UUID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // 获取媒体服务账户资源 var mediaAccountResourceId = MediaServicesAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, mediaAccountName); var mediaAccount = armClient.GetMediaServicesAccountResource(mediaAccountResourceId); // 获取Job资源 JobResource job = await mediaAccount.GetJobAsync(jobId); // 获取输入资产信息 if (job.Data.Input is JobInputAsset inputAsset) { string inputAssetName = inputAsset.AssetName; Console.WriteLine($"输入资产名称: {inputAssetName}"); // 获取输入资产的存储容器信息 AssetResource inputAssetResource = await mediaAccount.GetAssetAsync(inputAssetName); string storageContainer = inputAssetResource.Data.Container; Console.WriteLine($"输入资产存储容器: {storageContainer}"); } // 获取输出资产信息 foreach (JobOutput output in job.Data.Outputs) { if (output is JobOutputAsset outputAsset) { string outputAssetName = outputAsset.AssetName; Console.WriteLine($"输出资产名称: {outputAssetName}"); // 获取输出资产的存储容器信息 AssetResource outputAssetResource = await mediaAccount.GetAssetAsync(outputAssetName); string storageContainer = outputAssetResource.Data.Container; Console.WriteLine($"输出资产存储容器: {storageContainer}"); } }
关键说明:
- 确保已通过
DefaultAzureCredential完成身份验证(本地开发可通过Azure CLI、Visual Studio等方式登录) - Job的输入类型可能为
JobInputAsset、JobInputHttp等,需根据实际场景判断类型,这里仅处理JobInputAsset的情况 - 从Asset资源的
Container属性可直接得到存储账户中的容器名称,结合存储账户信息即可定位文件存储位置
二、通过SmoothStreamingUrl获取资产信息
SmoothStreamingUrl中包含了Streaming Locator的ID,你可以通过该ID查询到对应的Locator资源,进而关联到目标资产:
using Azure; using Azure.ResourceManager; using Azure.ResourceManager.Media; using System; // 初始化ArmClient var armClient = new ArmClient(new DefaultAzureCredential()); var subscriptionId = "your-subscription-id"; var resourceGroupName = "your-resource-group-name"; var mediaAccountName = "your-media-account-name"; // 替换为目标SmoothStreamingUrl var smoothStreamingUrl = "http://testvideo-euno.streaming.media.azure.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxx.ism/manifest|"; // 从URL中提取Streaming Locator ID(域名后的第一个UUID部分) Uri uri = new Uri(smoothStreamingUrl); string locatorId = uri.AbsolutePath.Split('/')[1]; // 获取媒体服务账户资源 var mediaAccountResourceId = MediaServicesAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, mediaAccountName); var mediaAccount = armClient.GetMediaServicesAccountResource(mediaAccountResourceId); // 获取Streaming Locator资源 StreamingLocatorResource locator = await mediaAccount.GetStreamingLocatorAsync(locatorId); // 获取关联的资产信息 string assetName = locator.Data.AssetName; Console.WriteLine($"关联资产名称: {assetName}"); // 获取资产的存储容器信息 AssetResource assetResource = await mediaAccount.GetAssetAsync(assetName); string storageContainer = assetResource.Data.Container; Console.WriteLine($"资产存储容器: {storageContainer}");
关键说明:
- SmoothStreamingUrl的格式为
{streaming-endpoint}/{locator-id}/{asset-name}.ism/manifest,因此可通过路径分割提取Locator ID - 一个Streaming Locator仅关联一个资产,因此可直接从Locator资源中获取资产名称
- 若URL中存在额外参数(如示例中的
|),需先清理再解析
常见问题排查
- 若出现权限错误:确保当前身份拥有
Media Services Contributor或对应资源的读取权限 - 若Job或Locator不存在:确认资源未被删除,且媒体服务账户、资源组信息填写正确
- 若Asset的
Container属性为空:部分旧资产可能未记录容器信息,可通过媒体服务账户关联的存储账户,根据资产名称匹配容器(通常容器名称与资产名称一致)
内容的提问来源于stack exchange,提问作者Frank-Medium
相关产品推荐
相关产品推荐

