【问题标题】:Azure Media Services v3 create asset filter returns BadRequestAzure 媒体服务 v3 创建资产筛选器返回 BadRequest
【发布时间】:2019-04-10 01:51:30
【问题描述】:

Azure 媒体服务 v3 创建资产过滤器返回 BadRequest。

代码和清单都包含在下面。资产持续时间为 00:00:26.4330000

试过调整音轨,没有音轨。 已尝试调整时间参数。

  • 有什么想法吗?

  • API 是否可以报告有关问题的更多信息?

  • 是否可以创建一个示例来说明如何使用带有和不带有跟踪过滤器的 AssetFilters.CreateOrUpdate?

代码

var timingData = GetManifestTimingData(new Uri(asset.ManifestUrl));
Log.Info($"Timescale: {timingData.TimeScale} Offset: {timingData.TimestampOffset} clip: ( {TimeSpan.FromSeconds(startTimeSec)} - {TimeSpan.FromSeconds(endTimeSec)} ) as ( {TimeSpan.FromSeconds(startTimeSec)} to {TimeSpan.FromSeconds(endTimeSec)} ) {name} ----- {asset.ToAssetInfo()?.hashKey} {asset.Name} -- Manifest: {asset.PlaybackUrl}");

if (startTimeSec >= timingData.AssetDuration.TotalSeconds)
{
    Log.Error($"Invalid start time: {startTimeSec} > {timingData.AssetDuration}");
    return null;
}

if (endTimeSec >= timingData.AssetDuration.TotalSeconds)
{
    endTimeSec = (int)Math.Floor(timingData.AssetDuration.TotalSeconds);
}

var startTimeSpan = timingData.OffSetAsTimeSpan + TimeSpan.FromSeconds(startTimeSec);
var endTimeSpan = timingData.OffSetAsTimeSpan + TimeSpan.FromSeconds(endTimeSec);

double timeScale = timingData.TimeScale ?? TimeSpan.TicksPerSecond;

var scaledStartTime = Convert.ToInt64(Math.Truncate(startTimeSpan.Ticks * (timeScale / TimeSpan.TicksPerSecond)));
var scaledEndTime = Convert.ToInt64(Math.Truncate(endTimeSpan.Ticks * (timeScale / TimeSpan.TicksPerSecond)));

var range = new PresentationTimeRange(scaledStartTime, scaledEndTime, 9223372036854775807, 0, (long)timeScale, false);

var tracks = new List<FilterTrackSelection>
    {
        new FilterTrackSelection(new List<FilterTrackPropertyCondition>
        {
            new FilterTrackPropertyCondition(FilterTrackPropertyType.Type, "Audio", FilterTrackPropertyCompareOperation.Equal),
        }),
        new FilterTrackSelection(new List<FilterTrackPropertyCondition>
        {
            new FilterTrackPropertyCondition(FilterTrackPropertyType.Type, "Video", FilterTrackPropertyCompareOperation.Equal),
        }),
    };

var firstQuality = new FirstQuality(128000);

var filterParams = new AssetFilter(null, name, FilterType, range, firstQuality, tracks);

var filter = _client.AssetFilters.CreateOrUpdate(ResourceGroup, AccountName, asset.Id, name, filterParams);
if (filter == null)
{
    Log.Warn($"Failed to create filter {name} in {asset}");
    return null;
}

return filter;

清单

<SmoothStreamingMedia MajorVersion="2" MinorVersion="2" Duration="264333333" TimeScale="10000000">
<StreamIndex Chunks="13" Type="video" Url="QualityLevels({bitrate})/Fragments(video={start time})" QualityLevels="1">
    <QualityLevel Index="0" Bitrate="770760" FourCC="H264" MaxWidth="1280" MaxHeight="720" CodecPrivateData="000000016764001FACD9405005BA10000003001000000303C0F18319600000000168EBECB22C" />
    <c t="0" d="20333333" r="2" />
    <c d="20333334" />
    <c d="20333333" r="2" />
    <c d="20333334" />
    <c d="20333333" r="2" />
    <c d="20333334" />
    <c d="20333333" r="2" />
    <c d="20333334" />
    <c d="20333333" />
</StreamIndex>
<StreamIndex Chunks="14" Type="audio" Url="QualityLevels({bitrate})/Fragments(aac_UND_2_127999={start time})" QualityLevels="1" Name="aac_UND_2_127999">
    <QualityLevel AudioTag="255" Index="0" BitsPerSample="16" Bitrate="127999" FourCC="AACL" CodecPrivateData="1190" Channels="2" PacketSize="4" SamplingRate="48000" />
    <c t="0" d="20053333" r="2" />
    <c d="20053334" />
    <c d="20053333" r="2" />
    <c d="20053334" />
    <c d="20053333" r="2" />
    <c d="20053334" />
    <c d="20053333" r="2" />
    <c d="20053334" />
    <c d="20053333" />
    <c d="3626667" />
</StreamIndex>
<Protection>
    <ProtectionHeader SystemID="B47B251A-2409-4B42-958E-08DBAE7B4EE9">
    <ContentProtection schemeIdUri="urn:mpeg:dash:sea:2012" xmlns:sea="urn:mpeg:dash:schema:sea:2012">
        <sea:SegmentEncryption schemeIdUri="urn:mpeg:dash:sea:aes128-cbc:2013" />
        <sea:KeySystem keySystemUri="urn:mpeg:dash:sea:keysys:http:2013" />
        <sea:CryptoPeriod IV="0xF6BCAD06C97D0FEC81B702C86183355B" keyUriTemplate="https://testurstream.keydelivery.westus.media.azure.net?kid=d6c1f008-d43f-4c60-926f-76ba613b7b4b" />
    </ContentProtection>
    </ProtectionHeader>
</Protection>
</SmoothStreamingMedia>

【问题讨论】:

    标签: azure-media-services


    【解决方案1】:

    我们在使用资产过滤器时遇到了一个已知错误,该错误已修复并现已投入生产。看起来你可能遇到了同样的错误。该团队正在努力解决 .NET SDK 中的这个问题并将其推出。

    现在,您可以先删除在 v3 API 中创建的所有旧过滤器吗?要解决此问题,您需要首先从此帐户中删除所有旧资产和全局过滤器。当我们从预览版迁移到 GA 版时,我们的过滤器版本不匹配导致不匹配(以及您所看到的错误消息。)如果您查看堆栈跟踪,您应该能够获得更详细的错误消息.它通常会显示版本冲突问题。让我们知道您在错误的详细信息中看到的内容。

    【讨论】:

    • 仍然失败。删除了所有资产。从 AMS Explorer 中查看时没有全局过滤器。
    • 是否需要 PresentationTimeRange 的所有成员?现在尝试不同的变化。是否有一个工作样本我可以检查是否健全? 缩小堆栈跟踪 HResult=0x80131500 Message=Operation 在 Microsoft.Azure.Management.Media.AssetFiltersOperations 返回了无效状态代码“BadRequest”。d__7.MoveNext() 在 Microsoft.Azure.Management。 Media.AssetFiltersOperationsExtensions.d__5.MoveNext() at Microsoft.Azure.Management.Media.AssetFiltersOperationsExtensions.CreateOrUpdate(...)
    • BadRequest 上可能有一条内部消息。当我提交将presentationWindowDuration 和liveBackoffDuration 设置为0 的创建时,我在Postman 中看到以下内容。 { "error": { "code": "BadRequest", "message": "过滤器中的演示窗口必须大于或等于 60 秒。" } }
    【解决方案2】:

    卡洛斯, 今天就为你看这个。不好意思推迟了。

    我使用 Postman 集合只是为了准确了解 .NET SDK 的情况。 看起来以下文件管理器工作正常。我认为您遇到的问题与创建新 PresentationTimeRange 的代码行有关。 VOD 过滤器不需要 presentaitonWindowDuration 和 liveBackoffDuration 的值。它们仅用于实时过滤器。尝试使用以下内容。

    new PresentationTimeRange(scaledStartTime, scaledEndTime, null, null, (long)timeScale, null);
    

    {
      "properties": {
        "presentationTimeRange": {
          "startTimestamp": 0,
          "endTimestamp": 264333333,
          "presentationWindowDuration": null,
          "liveBackoffDuration": null,
          "timescale": 10000000,
          "forceEndTimestamp": null
        },
        "tracks": [{
          "trackSelections": [{
              "property": "Type",
              "operation": "Equal",
              "value": "Video"
            },
            {
              "property": "Type",
              "operation": "Equal",
              "value": "Audio"
            }
          ]
        }]
      }
    }

    当我通过 .NET SDK 运行它时,我会仔细检查这是否是一个问题。 我认为我们这里的问题可能是presentationTimeRange的值在当前的Swagger文件中都被标记为“REQUIRED”:

    https://github.com/Azure/azure-rest-api-specs/blob/dec75495352902ebb6393d42c50465b6195f239d/specification/mediaservices/resource-manager/Microsoft.Media/stable/2018-07-01/AccountFilters.json#L63

    【讨论】:

    • 感谢它以 Postman 为例。问题是轨道过滤器 - 需要分成 2 个过滤器,一个用于视频,一个用于音频。
    • 太棒了。很高兴听到卡洛斯!
    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多