Azure Media Services:通过C#将Blob程序化转码为Asset
Azure Media Services Blob转码为Asset的C#实现示例
准备工作
- 安装所需NuGet包:
Azure.ResourceManager.Media(Azure媒体服务最新管理SDK)Azure.Identity(用于身份认证)
完整代码示例
using Azure; using Azure.Identity; using Azure.ResourceManager.Media; using Azure.ResourceManager.Media.Models; using System; using System.Threading.Tasks; class MediaServicesTranscoder { public async Task TranscodeBlobToAssetAsync() { // 替换为你的实际配置参数 string subscriptionId = "你的订阅ID"; string resourceGroupName = "资源组名称"; string mediaAccountName = "媒体服务账户名称"; string storageAccountName = "AMS关联的存储账户名称"; string blobContainerName = "Blob容器名"; string sourceBlobName = "已上传的MP4文件名(如video.mp4)"; string inputAssetName = "input-asset-" + Guid.NewGuid(); string outputAssetName = "output-asset-" + Guid.NewGuid(); string transformName = "h264-transcode-transform"; string jobName = "transcode-job-" + Guid.NewGuid(); // 初始化媒体服务客户端 var credential = new DefaultAzureCredential(); var mediaClient = new MediaServicesArmClient(credential, subscriptionId); var mediaAccount = mediaClient.GetMediaServicesAccount(resourceGroupName, mediaAccountName); // 1. 创建关联现有Blob的输入Asset var inputAssetData = new MediaAssetData { StorageAccountName = storageAccountName, AlternateId = $"https://{storageAccountName}.blob.core.windows.net/{blobContainerName}/{sourceBlobName}", Description = "从Blob导入的输入资源" }; var inputAsset = await mediaAccount.GetMediaAssets() .CreateOrUpdateAsync(WaitUntil.Completed, inputAssetName, inputAssetData); // 2. 创建用于存储转码结果的输出Asset var outputAssetData = new MediaAssetData { Description = "转码后的输出资源" }; var outputAsset = await mediaAccount.GetMediaAssets() .CreateOrUpdateAsync(WaitUntil.Completed, outputAssetName, outputAssetData); // 3. 创建或获取转码Transform(使用内置H264多比特率预设) var transformData = new MediaTransformData { Description = "H264多比特率转码预设", Outputs = { new MediaTransformOutput( new BuiltInStandardEncoderPreset(BuiltInStandardEncoderPresetName.H264MultipleBitrate1080p) { OnError = MediaTransformOnError.StopProcessingJob, RelativePriority = MediaTransformOutputPriority.Normal } ) } }; var transform = await mediaAccount.GetMediaTransforms() .CreateOrUpdateAsync(WaitUntil.Completed, transformName, transformData); // 4. 创建并提交转码作业 var jobInput = new JobInputAsset(inputAsset.Name); var jobOutput = new JobOutputAsset(outputAsset.Name); var jobData = new JobData { Input = jobInput, Outputs = { jobOutput } }; var job = await transform.GetJobs() .CreateOrUpdateAsync(WaitUntil.Started, jobName, jobData); // 5. 轮询监控作业状态 Job currentJob; do { await Task.Delay(TimeSpan.FromSeconds(10)); currentJob = await job.GetAsync(); Console.WriteLine($"当前作业状态: {currentJob.State}"); } while (currentJob.State is JobState.Queued or JobState.Processing); if (currentJob.State == JobState.Finished) { Console.WriteLine("转码作业已完成!输出Asset已生成。"); } else { var error = currentJob.Outputs[0].Error; Console.WriteLine($"转码作业失败,状态: {currentJob.State},错误信息: {error?.Message}"); } } }
关键说明
- 身份认证:
DefaultAzureCredential自动适配本地开发(Visual Studio/Azure CLI登录)和生产环境(托管标识),若需使用服务主体认证,可替换为ClientSecretCredential。 - 输入Asset关联Blob:通过
AlternateId指定Blob的完整URL,AMS会直接关联该Blob,无需重复上传。注意Blob必须存储在AMS关联的存储账户中。 - 转码预设:示例使用内置的
H264MultipleBitrate1080p预设,可根据需求替换为其他内置预设(如H264SingleBitrate720p),或自定义StandardEncoderPreset实现特定编码需求。 - 作业监控:示例采用轮询方式跟踪状态,生产环境建议使用Azure Event Grid接收作业状态变更通知,避免频繁轮询。
权限要求
确保执行代码的身份(本地用户/托管标识)拥有以下权限:
- 媒体服务账户的
Media Services Contributor角色 - 关联存储账户的
Storage Blob Data Contributor角色
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

