0

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

4

5 回答 5

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

于 2013-10-23T11:15:02.847 回答
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 页面,我将使用通用处理程序 (.ashx) 或自定义处理程序并为此设置一个 .mp3 扩展名,以避免不必要的网页开销。

我希望这有帮助。

于 2013-10-25T14:54:16.533 回答
0

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

于 2013-10-25T09:36:18.927 回答
0

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

于 2013-10-18T23:02:27.817 回答
0

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

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

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

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

于 2015-08-24T12:25:01.467 回答