在 ASP.NET 上流式传输 MP3 块

本文关键字:传输 MP3 ASP NET | 更新日期: 2023-09-27 18:35:32

目前,我在 ASP.NET 网站上有一个功能,用户可以在其中播放MP3文件。 代码如下所示:

Response.Clear();
Response.ContentType = "audio/mpeg";
foreach (DataChunk leChunk in db.Mp3Files.First(mp3 => mp3.Mp3ResourceId.Equals(id)).Data.Chunks.OrderBy(chunk => chunk.ChunkOrder))
{
    Response.BinaryWrite(leChunk.Data);
}

不幸的是,如果选择了较大的 MP3 文件,则在整个文件下载之前音频不会开始播放,这可能会导致明显的延迟。 有没有办法让 MP3 立即开始播放,即使整个文件可能尚未传输?

在 ASP.NET 上流式传输 MP3 块

你应该能够通过写入响应的外流来做你想做的事情,即:

Response.OutputStream.Write

之前检查 Response.IsClientConnected 是否可能也是一个好主意,如果没有,则放弃。

我找到了一个演示,允许从 asp.net Web 应用程序播放 mp3 文件:http://aspsnippets.com/Articles/Save-MP3-Audio-Files-to-database-and-display-in-ASPNet-GridView-with-Play-and-Download-option.aspx

试试这个:

    Response.BufferOutput = false; //sets chunked encoding
    Response.ContentType = "audio/mpeg";
    using (var bw = new BinaryWriter(Response.OutputStream))
    {
        foreach (DataChunk leChunk in db.Mp3Files.First(mp3 => mp3.Mp3ResourceId.Equals(id)).Data.Chunks.OrderBy(chunk => chunk.ChunkOrder))
        {
            if (Response.IsClientConnected) //avoids the host closed the connection exception
            {
                bw.Write(leChunk.Data); 
            }
        }
    }

另外,如果你仍然有分块编码问题,请转到你的 web.config 文件并执行此操作:

<system.webServer>
  <asp enableChunkedEncoding="true" />
</system.webServer>

您上面报告的关于主机正在关闭连接的错误可能发生,因为您使用浏览器打开页面,当浏览器读取内容类型时,它会打开媒体播放器并关闭自己,该连接随后被关闭,导致该错误,因此为了避免这种情况, 您需要定期检查客户端是否仍处于连接状态。

最后,如果您使用的是 aspx 页,我将使用泛型处理程序 (.ashx) 或自定义处理程序,并为此设置.mp3扩展名,以避免网页不必要的开销。

我希望这有所帮助。

在流式传输响应之前尝试设置 Response.BufferOutput = false。

如果 MP3 文件的位置对您的用户公开可用,那么另一种方法可能是只返回 MP3 的 URL 并使用标记中的 HTML 5 音频标签来流式传输音乐。我很确定音频标签的默认行为是流式传输文件,而不是等到整个文件下载完毕。

支持此功能的一种方法是实现HTTP字节范围请求。

默认情况下,我不相信 ASP.NET 这样做,如果使用问题或答案中的任何代码,绝对不会这样做。

不过,您可以通过一些工作手动实现这一点。另一种选择是让 IIS 提供静态文件,这将大大减少开发工作。我认为这不是一种选择。

下面是一个示例实现:http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-Video