C# 如何强制发送响应流?

C# 如何强制发送响应流?,c#,html5-audio,audio-streaming,nancy,C#,Html5 Audio,Audio Streaming,Nancy,我正在发送响应流音频,有时文件大到2gb,因此无法发送整个文件。我发送1mb的数据块 问题 当音频播放到已播放1mb的位置时,它会寻找下一个1mb,从而在播放过程中产生微延迟,因为它正在等待下一个MB的加载 因此,我的问题是如何在请求下一个兆字节之前强制发送它?有可能吗 密码 使用(var fs=new FileStream(filePath,FileMode.Open,FileAccess.Read)) { //默认位置 var startPosition=0; var endPosition

我正在发送响应流音频,有时文件大到2gb,因此无法发送整个文件。我发送1mb的数据块

问题 当音频播放到已播放1mb的位置时,它会寻找下一个1mb,从而在播放过程中产生微延迟,因为它正在等待下一个MB的加载

因此,我的问题是如何在请求下一个兆字节之前强制发送它?有可能吗

密码
使用(var fs=new FileStream(filePath,FileMode.Open,FileAccess.Read))
{
//默认位置
var startPosition=0;
var endPosition=1048576;//1mb
var rangeString=Request.Headers[“Range”].FirstOrDefault();
var totalLength=fs.长度;
//获得职位
if(rangeString!=null)
{
var rangeHeaders=rangeString.Split(新[]{'=','-'});
startPosition=Convert.ToInt32(rangeHeaders[1]);
if(rangeHeaders.Length>2&&!string.IsNullOrEmpty(rangeHeaders[2]))
{
endPosition=Convert.ToInt32(rangeHeaders[2]);
}
其他的
{
endPosition=startPosition+1048576;
}
}
//读取字节和片1mb
var TakeHowmole=结束位置-开始位置;
var outputBytes=新字节[takehowley];
使用(变量读取器=新二进制读取器(fs))
{
reader.BaseStream.Seek(startPosition,SeekOrigin.Begin);
reader.Read(outputBytes,0,endPosition-startPosition);
}
返回新的响应
{
StatusCode=HttpStatusCode.PartialContent,
ContentType=“音频/mp3”,
标题=
{
新的KeyValuePair(“接受范围”、“字节”),
新的KeyValuePair(“内容范围”,string.Format(“字节{0}-{1}/{2}”,起始位置,结束位置,总长度)),
新的KeyValuePair(“内容长度”,outputBytes.Length.ToString(CultureInfo.InvariantCulture))
},
Contents=s=>
{
s、 写入(outputBytes,0,TakeHowley);
s、 冲洗();
}
};
}
返回新的响应
{
StatusCode=HttpStatusCode.PartialContent,
ContentType=“音频/mp3”,
标题=
{
新的KeyValuePair(“接受范围”、“字节”),
新的KeyValuePair(“内容范围”,string.Format(“字节{0}-{1}/{2}”,起始位置,结束位置,总长度)),
新的KeyValuePair(“内容长度”,outputBytes.Length.ToString(CultureInfo.InvariantCulture))
},
Contents=s=>
{
//我可以在这里写多次,从而发送多个块
s、 写入(outputBytes,0,TakeHowley);
s、 写入(其他输出字节,0,取多少);
}
};

这与消费客户机而不是流媒体服务器有更多关系吗?你用什么来“播放”音频?@Sean只是一个普通的html5播放器
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);
    }
};