Потоковое видео из Azure хранилища BLOB-объектов и ASP. NET Core 3 - PullRequest
1 голос
/ 01 мая 2020

Я использую последний и рекомендуемый Azure.Storage.Blobs пакет. Я загружаю видеофайл в виде фрагментов, который работает нормально. Теперь проблема заключается в возврате видео обратно в веб-клиент, который является videojs. Игрок использует Range запрос.

Моя конечная точка:

[HttpGet]
[Route("video/{id}")]
[AllowAnonymous]
public async Task<IActionResult> GetVideoStreamAsync(string id)
{
   var stream = await GetVideoFile(id);

   return File(stream, "video/mp4", true); // true is for enableRangeProcessing
}

И мой GetVideoFile метод

var ms = new MemoryStream();
await blobClient.DownloadToAsync(ms, null, new StorageTransferOptions
{
    InitialTransferLength = 1024 * 1024,
    MaximumConcurrency = 20,
    MaximumTransferLength = 4 * 1024 * 1024
});

ms.Position = 0;

return ms;

Видео загружается и транслируется просто отлично. Но он загружает все видео и вообще не уважает Range. Я также пытался с DownloadTo(HttpRange)

var ms = new MemoryStream();

// parse range header... 
var range = new HttpRange(from, to);
BlobDownloadInfo info = await blobClient.DownloadAsync(range);
await info.Content.CopyToAsync(ms);
return ms;

Но в браузере ничего не отображается. Каков наилучший способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я считаю, что достичь этого невозможно только с помощью Azure Blob. Более подробная информация здесь: { ссылка }

, но в итоге вы можете использовать CDN, который предлагает позицию начала / конца поиска: https://docs.vdms.com/cdn/re3/Content/Streaming/HPD/Seeking_Within_a_Video.htm

Другая возможность - использовать Azure Media Services, поддерживающие потоковую передачу. Ваш подход на самом деле является прогрессивной загрузкой, которая не совсем та же идея, и вы, вероятно, потратили бы много денег на выход в сеть. (при условии, что у вас много доступа к одному и тому же файлу)

0 голосов
/ 01 мая 2020

Пожалуйста, попробуйте сбросить позицию потока памяти в 0 перед возвратом:

var ms = new MemoryStream();

// parse range header... 
var range = new HttpRange(from, to);
BlobDownloadInfo info = await blobClient.DownloadAsync(range);
await info.Content.CopyToAsync(ms);
ms.Position = 0;//ms is positioned at the end of the stream so we need to reset that.
return ms;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...