0

現在、ASP.NET Web サイトに、ユーザーが 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.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>

ホストが接続を閉じていることについて上記で報告したエラーは、おそらくブラウザーを使用してページを開いており、ブラウザーがコンテンツ タイプを読み取るときに、メディア プレーヤーを開き、開かれた接続を持っていたユーザー自身を閉じてから閉じたことが原因で発生しています。 、そのエラーの原因となるため、これを回避するには、クライアントがまだ接続されているかどうかを定期的に確認する必要があります。

最後に、Web ページの不要なオーバーヘッドを回避するために aspx ページを使用している場合は、ジェネリック ハンドラー (.ashx) またはカスタム ハンドラーを使用し、これに .mp3 拡張子を設定します。

これが役立つことを願っています。

于 2013-10-25T14:54:16.533 に答える
0

MP3 ファイルの場所がユーザーに公開されている場合、別の方法として、MP3 の URL を返し、マークアップで HTML 5 オーディオ タグを使用して音楽をストリーミングすることもできます。audio タグのデフォルトの動作は、ファイル全体がダウンロードされるまで待つのではなく、ファイルをストリーミングすることであると確信しています。

于 2013-10-25T09:36:18.927 に答える
0

これをサポートする方法の 1 つは、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 に答える
0

応答をストリーミングする前に、Response.BufferOutput = false を設定してみてください。

于 2013-10-18T23:02:27.817 に答える