Как правильно транслировать видео, используя частичные диапазоны содержимого из Azure хранилища больших двоичных объектов? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть видео mp4, которое я загрузил в Azure Хранилище BLOB-объектов (блоки, хранилище v2). Я не могу обработать видео с помощью тега <video> без задержки воспроизведения, поскольку видео полностью загружено с сервера (с кодом состояния ответа 200).

(Что еще хуже, и хотя это не совсем актуально для моего вопроса, потому что я думаю, что это больше проблема браузера, видео установлено на l oop, и оно перезагружается с каждым l oop) атрибут * tag src; и я также попытался передать видео с помощью ASP. NET метода контроллера Core 3.1, вернув FileStreamResult и установив для параметра enableRangeProcessing значение true. Вот этот код:

public async Task<IActionResult> GetVideo(string videoUrl)
{
    var httpClient = new HttpClient();
    var stream = await httpClient.GetStreamAsync(videoUrl);
    return File(stream, new MediaTypeHeaderValue("video/mp4").MediaType, true);
}

Кажется, независимо от того, что я пытаюсь, я не могу получить ответ диапазона с кодом состояния 206. Я видел предложения по использованию Azure Media Services, но это кажется излишним, и это должно быть чем-то, что просто поддерживается без добавления еще одной службы.

Любая помощь / предложения будут с благодарностью - спасибо!

1 Ответ

1 голос
/ 09 апреля 2020

Согласно моим исследованиям, если вы установите для параметра enableRangeProcessing значение true, мы получим отклик диапазона.。 Для получения более подробной информации см. выпуск .

Мой тест код

public async Task<IActionResult> Video() {
            var s = Request.Headers;
            var memory = new MemoryStream();

            BlobServiceClient blobServiceClient = new BlobServiceClient("DefaultEndpointsProtocol=https;AccountName=blobstorage0516;AccountKey=eGier5YJBzr5z3xgOJUb+snTGDKhwPBJRFqb2nL5lcacmKZXHgY+LjmYapIHL7Csvgx75NwiOZE7kYLJfLqWBg==;EndpointSuffix=core.windows.net");
            BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("test");
            var blob =containerClient.GetBlobClient("test.mp4");
            StorageTransferOptions options = new StorageTransferOptions();
            options.InitialTransferLength = 1024 * 1024;
            options.MaximumConcurrency = 20;
            options.MaximumTransferLength = 4 * 1024 * 1024;
            await blob.DownloadToAsync(memory,null, options);
            memory.Position = 0;
            return File(memory, new MediaTypeHeaderValue("video/mp4").MediaType, true); //enableRangeProcessing = true



        }

enter image description here

...