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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:00:51