You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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角色

操作步骤

  1. 安装依赖包
    在Azure Function项目中安装Azure.ResourceManager.Media NuGet包,用于调用AMS V3 SDK接口。

  2. 初始化AMS客户端
    创建分别对应源、目标AMS账户的客户端实例,使用托管标识完成认证。

  3. 获取源资产信息
    通过源AMS客户端定位到要复制的资产,获取其关联的存储容器及内部Blob列表。

  4. 创建目标资产
    在目标AMS账户中创建新资产,系统会自动关联对应的存储容器(也可指定现有容器)。

  5. 复制Blob到目标存储
    遍历源资产的所有媒体Blob,将其异步复制到目标资产的存储容器中。

  6. 注册目标资产文件
    将复制完成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:50:15