C# 4.7代码无法上传视频至Azure Media Service,求解决方案
问题分析与修复方案
你的代码存在几个关键问题,导致上传失败,逐一说明并修复:
1. C#大小写敏感错误
C#是强类型大小写敏感语言,你实例化Azure AD相关类时用了全小写(比如azureadtokencredentials应为AzureAdTokenCredentials),变量赋值也存在大小写不匹配(m_mediacontext对应静态变量m_MediaContext),这会直接引发编译或运行时错误。
2. 流位置未重置
直接使用file.InputStream上传时,若流的Position不在起始位置,会导致上传空内容,必须先重置流位置。
3. 过早获取HLS/DASH URI
刚上传完原始视频资产就调用GetHlsUri()和GetMpegDashUri()无效,这些URI是编码转码后的流媒体资产才有的,原始资产无此类格式URI,需先完成转码作业才能获取。
4. 缺少异常捕获逻辑
无异常处理无法定位具体错误(比如权限不足、网络超时、文件格式不支持等)。
修复后的完整代码
using System; using System.Web; using Microsoft.WindowsAzure.MediaServices.Client; using System.Configuration; public class MediaUploader { static CloudMediaContext m_MediaContext; static readonly string _AADTenantDomain = ConfigurationManager.AppSettings["AMSAADTenantDomain"]; static readonly string _RESTAPIEndpoint = ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"]; static readonly string _AMSClientId = ConfigurationManager.AppSettings["AMSClientId"]; static readonly string _AMSClientSecret = ConfigurationManager.AppSettings["AMSClientSecret"]; public static void InitializeMediaContext() { // 修正类名大小写 var tokenCredentials = new AzureAdTokenCredentials( _AADTenantDomain, new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret), AzureEnvironments.AzureCloudEnvironment); var tokenProvider = new AzureAdTokenProvider(tokenCredentials); // 修正变量大小写匹配 m_MediaContext = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider); } static private IAsset CreateAsset(string assetName, AssetCreationOptions creationOption) { return m_MediaContext.Assets.Create(assetName, creationOption); } static public void UploadMedia(AssetCreationOptions option, string fileName, HttpPostedFile file) { try { var dynamicAssetName = $"Asset_{DateTime.UtcNow:yyyyMMddHHmmss}"; var asset = CreateAsset(dynamicAssetName, option); // 使用正确的文件名(确保带扩展名) var assetFile = asset.AssetFiles.Create(fileName); // 创建访问策略和Locator var accessPolicy = m_MediaContext.AccessPolicies.Create( dynamicAssetName, TimeSpan.FromDays(30), AccessPermissions.Write | AccessPermissions.List); var locator = m_MediaContext.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy); // 重置流到起始位置 file.InputStream.Position = 0; assetFile.Upload(file.InputStream); // 注意:原始资产无HLS/DASH URI,如需生成需添加转码作业 // 示例转码代码(按需启用): // var encoder = m_MediaContext.MediaProcessors.GetLatestMediaProcessorByName("Media Encoder Standard"); // var job = m_MediaContext.Jobs.Create("自适应流转码", encoder, "Adaptive Streaming", asset); // job.Submit(); // job.GetExecutionProgressTask(CancellationToken.None).Wait(); // 转码完成后从输出资产获取对应URI // 清理资源 locator.Delete(); accessPolicy.Delete(); } catch (Exception ex) { // 捕获异常便于排查 throw new Exception($"上传失败:{ex.Message}", ex); } } // 调用示例 // InitializeMediaContext(); // UploadMedia(AssetCreationOptions.None, "demo.mp4", uploadedFile); }
额外注意事项
- 确保配置文件中的
AMSAADTenantDomain、AMSRESTAPIEndpoint、AMSClientId、AMSClientSecret配置正确,且对应Azure AD应用拥有Media Services读写权限。 - 若需生成HLS/DASH流媒体,必须添加转码作业,完成转码后才能从输出资产获取对应URI。
- 大文件建议用分块或异步上传,避免超时。
内容的提问来源于stack exchange,提问作者shailendra
相关产品推荐
相关产品推荐

