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()
метод, загружен ли контент в память сервера или нет?
Спасибо!