2

C (C++ ではない) で記述され、Fedora 15 で実行されているイーサネット経由で G.711 オーディオを送信するプロジェクトに取り組み始めています。スマートなことをして RTP を使用するのではなく、UDP を使用してオーディオデータを転送しています。パケットの並べ替えの問題をある程度克服するために、各パケットの本体で次のような構造体を使用することにしました。

struct payload {
  char cc;
  char audio_data[160];
};

変数 "cc" は 0 ~ 15 で実行される継続カウンターで、パケットが受信者に到着すると、cc の値に基づいてこれらの構造体の配列に入れられます。オーディオ出力ルーチンは、この配列をループしてデータを再生します。

私の質問は、これがオーディオをパッケージ化する最良の方法ですか? 出力配列は最終的に2次元になり、各メンバーの読み取りと出力への書き込みが遅くなりますか? 反対側のオーディオ インターフェイスに書き込むことができる 160 バイト幅の型を定義する方法はありますか?

ALSA に関する役立つリソースへのリンクと同様に、任意の提案をいただければ幸いです (これは非常にまれなようです!)。

ジョシュ

4

1 に答える 1

1

キャッシュの最適化について心配していますか? 複雑化する前に、この単純なアプローチの概要を説明していただければ幸いです。キャッシュ ミスが実際の問題である場合は、リング (循環) バッファーを使用することをお勧めします。それはあなたのジッターバッファーにもなります。これにより、固定メモリ フットプリントと連続メモリが提供され、より高速なアクセスが可能になります。

G.711 は固定ビットレート コーデックであるため、バッファ サイズを時間単位 (会話の場合は 200 ミリ秒) で選択できます。常にバッファ内の最後のパケットを再生します。たとえば、受信した最後のパケットにはcc=nがあり、次にcc= m(> n) を受信します。nしたがって、との間のすべてのパケットmを欠落としてマークし、後で受信した場合はそれらを置き換えます。

于 2011-12-10T22:29:05.490 に答える