如何从Azure媒体服务获取视频的持续时间?

c# .net azure sdk azure-media-services

1846 观看

3回复

11 作者的声誉

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

作者: Wouter Eekhout 的来源 发布者: 2015 年 3 月 27 日

回应 (3)


0

665 作者的声誉

在Azure Media Services SDK中,我们仅通过contentFileSize(https://msdn.microsoft.com/en-us/library/azure/hh974275.aspx)提供资产的大小。但是,我们不提供视频元数据(例如持续时间)。当您获得流媒体定位器时,该播放将告诉您视频资产的持续时间。

干杯,明飞燕

作者: Mingfei Yan 发布者: 27.03.2015 05:12

4

56 作者的声誉

决定

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;
作者: David Kristensen 发布者: 30.03.2015 02:00

0

5462 作者的声誉

如果您使用的是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();
}
作者: gldraphael 发布者: 10.05.2019 05:20
32x32