在ASP.NET上流式传输MP3块

时间:2013-10-16 12:36:11

标签: c# asp.net-mvc streaming mp3

目前,我在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立即开始播放,即使整个文件可能尚未转移?

5 个答案:

答案 0 :(得分:1)

你应该能够通过写入回复的输出来做你想做的事,即:

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

答案 1 :(得分:1)

试试这个:

    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页面,我会使用Generic Handler(.ashx)或自定义处理程序并为此设置.mp3扩展名,以避免不必要的网页开销。

我希望这会有所帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

您可以通过一些工作手动实现此功能。另一个选项,即开发工作要少得多,就是让IIS提供静态文件。我认为这不是一个选择。

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