簡體   English   中英

在ASP.NET上流式傳輸MP3塊

[英]Streaming MP3 Chunks on ASP.NET

目前,我在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-與賞玩和下載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頁面以避免網頁的不必要開銷,我會使用Generic Handler(.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM