【问题标题】:How to get the duration of a video from the Azure media services?如何从 Azure 媒体服务获取视频的时长?
【发布时间】:2015-03-27 08:26:18
【问题描述】:

我正在使用 Windows Azure Media Services .NET SDK 3 来利用流媒体服务。我想检索视频的持续时间。如何使用 Windows Azure Media Services .NET SDK 3 检索视频的时长?

【问题讨论】:

    标签: c# .net azure sdk azure-media-services


    【解决方案1】:

    Azure 会创建一些元数据文件 (xml),这些文件可以在持续时间内进行查询。这些文件可以使用媒体服务扩展访问

    https://github.com/Azure/azure-sdk-for-media-services-extensions

    在获取资产元数据下:

    // The asset encoded with the Windows Media Services Encoder. Get a reference to it from the context.
    IAsset asset = null;
    
    // Get a SAS locator for the asset (make sure to create one first).
    ILocator sasLocator = asset.Locators.Where(l => l.Type == LocatorType.Sas).First();
    
    // Get one of the asset files.
    IAssetFile assetFile = asset.AssetFiles.ToList().Where(af => af.Name.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase)).First();
    
    // Get the metadata for the asset file.
    AssetFileMetadata manifestAssetFile = assetFile.GetMetadata(sasLocator);
    
    TimeSpan videoDuration = manifestAssetFile.Duration;
    

    【讨论】:

    • 这似乎不再适用于最新的 api,我无法再弄清楚如何获取元数据。有什么想法吗?
    • 感谢这段代码,但是assetFile.GetMetadata() 返回一个IEnumerable<AssetFileMetadata>(至少在 v4.2.0 中),应该这样对待。
    【解决方案2】:

    如果您使用的是 AMSv3,则 AdaptiveStreaming 作业会在输出资产中生成一个 video_manifest.json 文件。您可以解析它以获取持续时间。这是一个例子:

    public async Task<TimeSpan> GetVideoDurationAsync(string encodedAssetName)
    {
        var encodedAsset = await ams.Assets.GetAsync(config.ResourceGroup, config.AccountName, encodedAssetName);
        if(encodedAsset is null) throw new ArgumentException("An asset with that name doesn't exist.", nameof(encodedAssetName));
        var sas = GetSasForAssetFile("video_manifest.json", encodedAsset, DateTime.Now.AddMinutes(2));
        var responseMessage = await http.GetAsync(sas);
        var manifest = JsonConvert.DeserializeObject<Amsv3Manifest>(await responseMessage.Content.ReadAsStringAsync());
        var duration = manifest.AssetFile.First().Duration;
        return XmlConvert.ToTimeSpan(duration);
    }
    

    对于Amsv3Manifest 模型和示例video_manifest.json 文件,请参阅:https://app.quicktype.io/?share=pAhTMFSa3HVzInAET5k4

    您可以使用GetSasForAssetFile() 的以下定义开始:

    private string GetSasForAssetFile(string filename, Asset asset, DateTime expiry)
    {
        var client = GetCloudBlobClient();
        var container = client.GetContainerReference(asset.Container);
        var blob = container.GetBlobReference(filename);
    
        var offset = TimeSpan.FromMinutes(10);
        var policy = new SharedAccessBlobPolicy
        {
            SharedAccessStartTime = DateTime.UtcNow.Subtract(offset),
            SharedAccessExpiryTime = expiry.Add(offset),
            Permissions = SharedAccessBlobPermissions.Read
        };
        var sas = blob.GetSharedAccessSignature(policy);
        return $"{blob.Uri.AbsoluteUri}{sas}";
    }
    
    private CloudBlobClient GetCloudBlobClient()
    {
        if(CloudStorageAccount.TryParse(storageConfig.ConnectionString, out var storageAccount) is false)
        {
            throw new ArgumentException(message: "The storage configuration has an invalid connection string.", paramName: nameof(config));
        }
    
        return storageAccount.CreateCloudBlobClient();
    }
    

    【讨论】:

      【解决方案3】:

      在 Azure 媒体服务 SDK 中,我们仅通过 contentFileSize (https://msdn.microsoft.com/en-us/library/azure/hh974275.aspx) 提供资产的大小。但是,我们不提供视频的元数据(例如时长)。当你得到一个流式定位器时,播放会告诉你视频资产会有多长时间。

      干杯, 严明飞

      【讨论】:

      • 您曾经提供到最近一次更新 a​​pi 的持续时间。这个去哪儿了?
      猜你喜欢
      • 2021-04-27
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多