如何通过Azure Media Services为现有资产添加音轨?
为Azure Media Services现有资产添加多语言音轨的正确方案
你遇到的问题核心是未触发流媒体Manifest文件的重新生成——调用Tracks API仅更新了资产的.ism元数据文件,但客户端播放依赖的.ismc、HLS/DASH Manifest文件不会自动更新,必须手动触发刷新操作。
完整实现步骤
无论使用REST API还是.NET SDK,都需要完成以下流程:
- 将音频文件上传至目标资产的存储容器
- 调用Tracks接口注册音轨(你已完成此步骤)
- 刷新流媒体定位符对应的Manifest文件(关键遗漏步骤)
- 若使用CDN,清除对应缓存
REST API方案
步骤3:刷新Manifest文件
调用Streaming Locators - Refresh Manifest接口,重新生成客户端播放所需的Manifest文件:
POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Media/mediaServices/{accountName}/streamingLocators/{streamingLocatorName}/refreshManifest?api-version=2023-01-01
请求无需额外Body,成功响应后,资产的.ismc、_manifest.json文件会被更新。
验证播放
重新获取流媒体定位符的播放路径,或刷新客户端播放地址的缓存,即可看到新增的音轨选项。
.NET SDK方案(使用Azure.ResourceManager.Media)
1. 上传音频文件到资产
// 获取目标资产 var asset = await mediaServicesClient.Assets.GetAsync(resourceGroupName, accountName, assetName); // 获取资产容器的SAS链接 var containerSas = await mediaServicesClient.Assets.ListContainerSasAsync( resourceGroupName, accountName, assetName, permissions: AssetContainerPermission.ReadWrite, expiryTime: DateTime.UtcNow.AddHours(1)); // 上传音频文件 var blobContainerClient = new BlobContainerClient(new Uri(containerSas.Value.AssetContainerSasUrls.First())); await using var fileStream = File.OpenRead("audio4.mp4"); await blobContainerClient.UploadBlobAsync("audio4.mp4", fileStream);
2. 注册音频轨道
// 创建音频轨道数据 var audioTrack = new AudioTrackData { FileName = "audio4.mp4", LanguageCode = "eng", Mpeg4TrackId = 4 // 确保与现有轨道ID不冲突 }; // 注册轨道到资产 await asset.GetTracks().CreateOrUpdateAsync( WaitUntil.Completed, "english-audio-track", // 轨道唯一名称 new TrackData(audioTrack) );
3. 刷新Manifest文件
// 获取目标流媒体定位符 var streamingLocator = await mediaServicesClient.StreamingLocators.GetAsync( resourceGroupName, accountName, streamingLocatorName); // 刷新Manifest await streamingLocator.RefreshManifestAsync(WaitUntil.Completed);
4. 获取更新后的播放地址
var paths = await streamingLocator.ListPathsAsync(); var hlsPlaybackUrl = paths.Value.StreamingPaths .First(p => p.StreamingProtocol == StreamingPolicyStreamingProtocol.Hls) .Paths.First();
额外注意事项
- 音频文件需与原视频兼容:建议使用MP4封装、AAC编码,确保轨道参数(如采样率、声道数)与原视频匹配
Mpeg4TrackId需唯一,避免与资产中现有轨道ID冲突- 若配置了CDN,需清除对应播放路径的CDN缓存,否则客户端会继续加载旧的Manifest文件
内容的提问来源于stack exchange,提问作者Just Shadow
相关产品推荐
相关产品推荐

