使用V3 .NET SDK及Azure Function跨AMS账户复制资产的技术咨询
跨Azure Media Services账户复制资产(V3 .NET SDK + Azure Function实现)
具体操作方法
前置条件
- 已创建源和目标两个Azure Media Services(AMS)账户
- Azure Function项目(推荐使用.NET 6+版本,支持隔离进程或In-Process模式)
- 为Azure Function分配权限:通过系统托管标识,为其添加两个AMS账户的
Media Services Contributor角色,以及对应存储账户的Storage Blob Data Contributor角色
操作步骤
安装依赖包
在Azure Function项目中安装Azure.ResourceManager.MediaNuGet包,用于调用AMS V3 SDK接口。初始化AMS客户端
创建分别对应源、目标AMS账户的客户端实例,使用托管标识完成认证。获取源资产信息
通过源AMS客户端定位到要复制的资产,获取其关联的存储容器及内部Blob列表。创建目标资产
在目标AMS账户中创建新资产,系统会自动关联对应的存储容器(也可指定现有容器)。复制Blob到目标存储
遍历源资产的所有媒体Blob,将其异步复制到目标资产的存储容器中。注册目标资产文件
将复制完成的Blob注册到目标资产中,确保AMS能识别并管理这些媒体文件。
代码示例(Http触发的Azure Function)
using Azure; using Azure.ResourceManager.Media; using Azure.ResourceManager.Media.Models; using Azure.Storage.Blobs; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; public class CopyAmsAssetFunction { private readonly ILogger<CopyAmsAssetFunction> _logger; public CopyAmsAssetFunction(ILogger<CopyAmsAssetFunction> logger) { _logger = logger; } [Function("CopyAmsAsset")] public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req) { _logger.LogInformation("启动跨AMS账户资产复制任务"); // 从环境变量读取配置(避免硬编码) string sourceAmsAccount = Environment.GetEnvironmentVariable("SourceAmsAccountName"); string sourceRg = Environment.GetEnvironmentVariable("SourceResourceGroupName"); string targetAmsAccount = Environment.GetEnvironmentVariable("TargetAmsAccountName"); string targetRg = Environment.GetEnvironmentVariable("TargetResourceGroupName"); string sourceAssetName = "待复制的源资产名称"; string targetAssetName = "目标资产名称"; // 初始化AMS客户端(托管标识认证) var armClient = new ArmClient(); var sourceAms = await armClient.GetMediaServicesAccountAsync(sourceRg, sourceAmsAccount); var targetAms = await armClient.GetMediaServicesAccountAsync(targetRg, targetAmsAccount); // 获取源资产 var sourceAsset = await sourceAms.Value.GetMediaAssetAsync(sourceAssetName); if (sourceAsset == null) { return req.CreateResponse(System.Net.HttpStatusCode.NotFound, "源资产不存在"); } // 创建目标资产 var targetAssetData = new MediaAssetData(); var targetAsset = await targetAms.Value.GetMediaAssets().CreateOrUpdateAsync(WaitUntil.Completed, targetAssetName, targetAssetData); // 获取源、目标存储容器的Blob客户端 var sourceContainerUri = new Uri(sourceAsset.Value.Data.ContainerUri); var sourceBlobClient = new BlobContainerClient(sourceContainerUri); var targetContainerUri = new Uri(targetAsset.Value.Data.ContainerUri); var targetBlobClient = new BlobContainerClient(targetContainerUri); // 批量复制Blob await foreach (var sourceBlob in sourceBlobClient.GetBlobsAsync()) { var srcBlob = sourceBlobClient.GetBlobClient(sourceBlob.Name); var destBlob = targetBlobClient.GetBlobClient(sourceBlob.Name); await destBlob.StartCopyFromUriAsync(srcBlob.Uri); _logger.LogInformation("开始复制Blob:{BlobName}", sourceBlob.Name); } // 注册目标资产文件 var assetFileData = new MediaAssetFileData(); await foreach (var sourceBlob in sourceBlobClient.GetBlobsAsync()) { await targetAsset.Value.GetMediaAssetFiles().CreateOrUpdateAsync(WaitUntil.Completed, sourceBlob.Name, assetFileData); } return req.CreateResponse(System.Net.HttpStatusCode.OK, "资产复制任务已启动"); } }
复制后是否需要重新编码?
不需要重新编码。你复制的是已经完成编码的标准媒体文件(如H.264编码的MP4、自适应比特率流媒体文件等),这些文件完全符合AMS的流式处理、下载要求。复制完成后,只需在目标AMS账户中创建流式定位器或下载定位器,即可直接使用媒体内容。只有当你需要将媒体转换为其他编码格式、分辨率或比特率时,才需要重新提交编码作业。
内容的提问来源于stack exchange,提问作者hemant dutt
相关产品推荐
相关产品推荐

