2017-12-06 24 views
1

私はVoIPで新しいです。私はRTPを使用してクライアント/サーバーアーキテクチャを使用してオーディオをストリームするアプリケーションを作成することを考えていました。異なるAPIが利用可能ですしかし私はコアレベルで理解を得る必要があります。私はRFCを学んだ。誰も私にどのようにオーディオRTPパケットを作成し、パケットの開梱と一緒にそれをJAVAに送信する方法を提案することができます。 ありがとうございます。RTPパケットの送信とアンパックと同時にAPIを使用せずに音声RTPパケットを作成する方法

+0

私はそれをうまく実装しました。誰かが私のコードを望むなら、私に電子メールで連絡するのをためらってはいけません。 [email protected] –

答えて

0

空のJavaクラスを作成します。

RTPヘッダーのすべてのフィールドにメンバーを追加します。単一ビットフィールドにはboolを使用します。数値フィールドの場合、SSRCにはint、タイムスタンプ、シーケンスのshort、ペイロードタイプのバイトなど、必要なビット数に注意する必要があります。CSRCはintの配列(またはarrayListなど)でなければなりません。オーディオペイロードはバイト配列でなければなりません。

パケットは単なるバイト配列なので、パケットバイト[]を出力するToBytes()メソッドと、パラメータとしてbyte []をとるコンストラクタが必要です。パケットを送信するには、ToBytes()を呼び出してその結果をUDPパケットに入れます。

ToBytes()メソッドでは、12バイトのバイト配列に加えて、CSRCごとに4バイト追加しますが、オーディオペイロードには多くのバイトが含まれます。

ビット単位のOR演算子を使用して設定する必要がある単一のビット値。例えば、マーカービットが第二のバイトの最初のビットがあるので、それを設定します

if(marker) 
{ 
    bytes[1] = bytes[1] | 0x80; //0x80 is 1000 0000 
} 

はint型やショートパンツである値を設定するには、ネットワークの順に値を変換する必要があります( bigendian)バイト配列を作成し、arraycopyを使用してバッファに設定します。ネットワークオーダーのバイト配列を作成する方法については、あなたにお伝えします。

バイト[]を受け取るコンストラクタでは、上記の処理を逆に行う必要があります。単一ビットの値を確認するには、AND演算子を使用する例:

このクラスか、パケット数とサンプリングレートに基づいたタイムスタンプを設定するのに役立つ方法を必要とするだろうよヘルパークラスで
marker = bytes[1] & 0x80 == 1; 

どちらか。たとえば、ペイロードがG.711の場合、8000サンプル/秒です。つまり、パケットが160バイトのペイロードで20ミリ秒ごとに送信されるため、タイムスタンプはパケットごとに160ずつ増加します。

関連する問題