4

C# でオーディオ ストリームを録音したい

私は次の行に沿って何かをしています:

HttpWebRequest req;
req = (HttpWebRequest)WebRequest.Create("http://url.com/stream");

Webresponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();

fs = File.Exists(fileName)
    ? new FileStream(fileName, FileMode.Append)
    : new FileStream(fileName, FileMode.Create);

byte[] buffer = new byte[4096];

while (s.CanRead)
{
    Array.Clear(buffer, 0, buffer.Length);
    total += s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, buffer.Length);
}

ファイルサイズは大きくなりますが、 VLCやその他のプログラムでは再生できません。

これは私の正確なコードではなく、多くのエラーチェックなどを行っていますが、これは一般的な考え方を示しています。

4

3 に答える 3

4
    Array.Clear(buffer, 0, buffer.Length);
    total += s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, buffer.Length);

読み取る前に配列全体をクリアする必要はありません。これを行う意味はありません。ただし、実際に読み取ったバイト数を確認する必要があります。毎回配列全体が満たされるという保証はありません (おそらく満たされないでしょう)。

    int bytesRead = s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, bytesRead);
    total+=bytesRead;

また、ファイルが再生されるかどうか (ファイルの書き込みコードを修正すると、ファイルが破損していない場合でも) は、ダウンロードしている形式によって異なります - どのコーデック / ファイルの種類ですか?

于 2011-05-06T17:42:16.867 に答える
2

問題は、ストリーミングされたビットにコンテキストがないことです。アプリケーションにストリーミングする場合、ファイル タイプ X を扱っているという暗黙の合意があり、ストリーミング プログラムはそのビットを再生しようとします。

ファイルにストリーミングするときは、コンテキストを追加する必要があります。最も重要なビットの 1 つは、ファイルの種類とその他の情報を識別するヘッダーです。

ヘッダーを追加できれば、ファイル システムからファイルを再生できます。サーバーとクライアントは、それがすでにどのタイプのファイルであるかについて合意しているため、ヘッダーはストリームの一部にはなりません。

ストリーミング プレーヤーを作成すると、タイプをネゴシエートするときに、保存したビットを再生できる可能性があります。しかし、ファイルから自動的に機能させるには、ヘッダーを追加する必要があります。

于 2011-05-06T17:44:43.500 に答える
0

ストリーミングされた MP3 オーディオをディスクに保存しようとすることは、MP3 のストリーム形式とファイル形式の両方を詳細に理解していなければ、基本的に不可能です。ストリームから得られるのは、周波数ドメインに変換された一連の「ウィンドウ処理された」オーディオ チャンクです。ストリームを受信したプレーヤーは、チャンクをオンザフライで時間領域のオーディオに変換し、次々と再生します。

MP3ファイルを作成するには、最初にフォーマット情報を含むヘッダーを書き出してから、データの各チャンクを書き出す必要があります。しかし、ほとんどの場合、これらのチャンクをファイルに格納するための形式は、ストリームに圧縮する方法とは異なります。

申し訳ありませんが、これをあきらめることを強くお勧めします。音楽サービスがファイルのダウンロードではなくストリーミングを提供する主な理由の 1 つは、特に MP3 タイプのストリームをディスクに保存するのが非常に難しいためです (圧縮されていないオーディオ ストリームを WAV ファイルに保存するのは簡単なことです)。

于 2011-05-06T17:56:27.207 に答える