在 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 立即开始播放,即使整个文件可能尚未传输?
你应该能够通过写入响应的外流来做你想做的事情,即:
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