Как я могу принудительно отправить поток ответа?

1

Я отправляю звук потока ответа, а иногда файлы размером до 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();
        }
    };
}
  • 0
    Не имеет ли это больше общего с клиентом-потребителем, а не с потоковым сервером? Что вы используете для «воспроизведения» аудио?
  • 0
    @Sean Просто обычный игрок HTML5
Теги:
html5-audio
audio-streaming
nancy

1 ответ

0
Лучший ответ
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);
    }
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню