Я отправляю звук потока ответа, а иногда файлы размером до 2 ГБ, поэтому я не могу отправить весь файл. Я посылаю куски 1mb.
Когда звук воспроизводится, и он достигает точки, в которой он сыграл 1 мб, он ищет следующий 1mb, тем самым создавая микролагер в воспроизведении, так как он ждет следующего мегабайта для загрузки.
Поэтому мой вопрос: как я могу отправить следующий мегабайт еще до его запроса? Возможно ли это?
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// Default positions
var startPosition = 0;
var endPosition = 1048576; // 1mb
var rangeString = Request.Headers["Range"].FirstOrDefault();
var totalLength = fs.Length;
// Get positions
if (rangeString != null)
{
var rangeHeaders = rangeString.Split(new[] { '=', '-' });
startPosition = Convert.ToInt32(rangeHeaders[1]);
if (rangeHeaders.Length > 2 && !string.IsNullOrEmpty(rangeHeaders[2]))
{
endPosition = Convert.ToInt32(rangeHeaders[2]);
}
else
{
endPosition = startPosition + 1048576;
}
}
// Read bytes and slice 1mb
var takeHowMuch = endPosition - startPosition;
var outputBytes = new byte[takeHowMuch];
using (var reader = new BinaryReader(fs))
{
reader.BaseStream.Seek(startPosition, SeekOrigin.Begin);
reader.Read(outputBytes, 0, endPosition - startPosition);
}
return new Response
{
StatusCode = HttpStatusCode.PartialContent,
ContentType = "audio/mp3",
Headers =
{
new KeyValuePair<string, string>("Accept-Ranges", "bytes"),
new KeyValuePair<string, string>("Content-Range", string.Format("bytes {0}-{1}/{2}", startPosition, endPosition , totalLength)),
new KeyValuePair<string, string>("Content-Length", outputBytes.Length.ToString(CultureInfo.InvariantCulture))
},
Contents = s =>
{
s.Write(outputBytes, 0, takeHowMuch);
s.Flush();
}
};
}
return new Response
{
StatusCode = HttpStatusCode.PartialContent,
ContentType = "audio/mp3",
Headers =
{
new KeyValuePair<string, string>("Accept-Ranges", "bytes"),
new KeyValuePair<string, string>("Content-Range", string.Format("bytes {0}-{1}/{2}", startPosition, endPosition , totalLength)),
new KeyValuePair<string, string>("Content-Length", outputBytes.Length.ToString(CultureInfo.InvariantCulture))
},
Contents = s =>
{
// I can write here multiple times thus sending multiple chunks
s.Write(outputBytes, 0, takeHowMuch);
s.Write(otherOutputBytes, 0, takeHowMuch);
}
};