Web API - чтение асинхронного видео из Amazon S3 Bucket

У меня следующий рабочий процесс - загрузка видео в Amazon S3 Bucket. Затем с помощью C# SDK я хочу отправить это клиенту (в <video> - тег). Но видеофайлы огромны, и я не хочу хранить их на сервере. Что я делаю: из корзины S3 я получаю поток файла с Amazon.S3.Transfer.TransferUtility метод OpenStream(), Мой HTML прост:

<video width="480" height="320" controls="controls">
    <source src="@Url.Content("~/api/videos/mp4/154fe04f-85ba-4eb2-97ff-6a6ff6ba9485")" type="video/mp4">
</video>

Мой метод API:

public HttpResponseMessage Get(string key, string ext)
    {
        HttpResponseMessage response = Request.CreateResponse();

        using (S3Manager manager = new S3Manager())
        {
            var inStr = manager.OpenObjectStream(key); //this calls Amazon.S3.Transfer.TransferUtility.OpenStream() method
            response.Headers.AcceptRanges.Add("bytes");
            response.StatusCode = HttpStatusCode.OK;
            response.Content = new StreamContent(inStr);
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render");
            response.Content.Headers.ContentDisposition.FileName = $"{key}.{ext}";
            response.Content.Headers.ContentType = new MediaTypeHeaderValue($"video/{ext}");
            response.Content.Headers.ContentLength = inStr.Length;
        }
        return response;
    }

Но проблема в том, что перед воспроизведением в браузере необходимо загрузить все видео: Загрузка видео

Я также пытался с помощью следующего Get() метод, но результат был тот же...

public HttpResponseMessage Get(string key, string ext)
    {
        using (S3Manager manager = new S3Manager())
        {
            var inStr = manager.OpenObjectStream(key);
            var response = Request.CreateResponse();
            response.Content = new PushStreamContent(new Action<Stream, HttpContent, TransportContext>((outStr, cont, ctx) => WriteToStream(inStr , outStr, cont, ctx)),
                new MediaTypeHeaderValue("video/" + ext));

            return response;

        }
    }

public async void WriteToStream(Stream inputStream, Stream outputStream, HttpContent content, TransportContext context)
    {
        try
        {
            var buffer = new byte[65536];

            var length = (int)inputStream.Length;
            var bytesRead = 1;

            while (length > 0 && bytesRead > 0)
            {
                bytesRead = inputStream.Read(buffer, 0, Math.Min(length, buffer.Length));
                await outputStream.WriteAsync(buffer, 0, bytesRead);
                length -= bytesRead;
            }
        }
        catch (HttpException ex)
        {
            return;
        }
        finally
        {
            outputStream.Close();
        }
    }

Я просматриваю следующую статью в c-sharpcorner и пробую код в ней, но опять же - все видео загружается на клиент. Вы можете видеть, что Статус - 200 ОК, а не ожидаемый 206 Частичный контент.

Можете ли вы сказать мне, что не так с этим? Также при звонках Amazon.S3.Transfer.TransferUtility.OpenStream() метод, загружен ли контент в память сервера или нет?

Спасибо!

0 ответов

Другие вопросы по тегам