2

Cのソケットからファイル(オーディオ、.CAF)を受信しようとしています(C ++ソリューションでも問題ありません)。文字列でテストして、ソケット通信を機能させています。私の問題は、recv(socket、buffer、buffer_size、0)の2番目の引数に何を提供するかわからないことです。どのタイプの「バッファ」を作成する必要がありますか?基本的にオーディオファイルを受け取り、再生します。しかし、オーディオファイル自体を受信する方法がわかりません。

何かご意見は?

ありがとう、

ロビン

4

2 に答える 2

4

通常、オーディオは何らかの形式でエンコードされます。簡単にするために、Wave形式であると仮定しましょう。

物事を行う1つの方法は、ネットワーク経由で送信するためにオーディオのチャンク(たとえば、50ミリ秒のチャンク)をカプセル化することです。

ただし、ネットワークを介して盲目的にデータを送信し、それが機能することを期待することはできません。お使いのコンピューターでは、データは一方の方法(リトルエンディアンまたはビッグエンディアン)で整理されている場合があり、もう一方のコンピューターでは反対の方法で整理されている場合があります。

その場合、クライアントは、意図したものとは完全に異なると解釈したデータを取得します。したがって、何らかの方法で適切にシリアル化する必要があります。

ただし、データを適切にシリアル化したら(または、両方のコンピューターが同じエンディアンを使用している場合はそうではありません!)、データをsend()してrcev()し、デコーダーに渡して処理することができます。

もっと情報を提供したいのですが、それはこのテーマに関する私の知識の範囲についてです。それは本当にあなたが何をしているかに依存するので、あなたが何をしているかについてのいくつかの詳細なしにこれ以上の情報を与えることは難しいです(例えば、オーディオフォーマットに関して)。

いくつかの詳細情報:

http://en.wikipedia.org/wiki/Serialization

http://en.wikipedia.org/wiki/Endianness

編集:この回答のコメントで指摘されているように、標準形式を使用している場合は、シリアル化についてまったく心配する必要はありません。デコーダーで使用できるチャンクでネットワークを通過させ(たとえば、一度に1つのフレームを送信)、クライアント側でそれらの個々のフレーム(または場合によっては複数のフレーム)をデコードします。

于 2011-04-03T23:35:24.517 に答える
2

bufferは、ネットワークを介して送信されるデータを格納するために割り当てた配列へのポインタになります。

使用しているソケットライブラリによって異なりますが、通常は期待されますvoid*(これは単なる一般的なポインタ型です)。

あなたはこのようなことをするかもしれません:

uint8[1000] myBuffer;
recv(sock,myBuffer,1000,0);

これは8,000バイトに十分なスペースしか与えられないため、注意が必要です。これは、オーディオファイルを保持するのに十分ではない可能性があります。したがって、オーディオファイル全体を取得するまで、複数のrecv()呼び出しを処理する必要があります。

于 2011-04-03T23:41:25.920 に答える