私は、後で教育目的で作成する VoIP アプリケーションに JSpeex を使用する方法を学んでいます。JSpeex の使用方法を理解するために、簡単なエコー アプリケーションを作成することにしました。基本的に、オーディオ入力ラインから入力を読み取り、(Speex を使用して) データをエンコードし、データをデコードして、オーディオ出力ラインに書き込みます。ただし、アプリケーションを実行すると、聞こえるのは静的で、声はまったく聞こえません。オーディオ形式、デコーダー、エンコーダーの初期化方法をいじってみましたが、すべてうまくいきませんでした。おそらく誰かがコードを調べて、私が間違っていることを指摘しようとすることはできますか? ありがとう。
コード:
(コードを貼り付けるより良い方法はありますか? 貼り付けてすべてを強調表示し、[コード] ボタンを押すと、インデントがめちゃくちゃになるためです。)
import java.util.Arrays;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
import org.xiph.speex.SpeexDecoder;
import org.xiph.speex.SpeexEncoder;
public class SpeexTest {
public static void main(String[] args) throws Exception {
int sample_rate = 8000;
int sample_size = 16;
int channels = 1;
AudioFormat format = new AudioFormat(sample_rate, sample_size,
channels, true, true);
TargetDataLine line_in;
DataLine.Info info_in = new DataLine.Info(TargetDataLine.class, format);
try {
line_in = (TargetDataLine) AudioSystem.getLine(info_in);
line_in.open(format);
} catch (LineUnavailableException ex) {
ex.printStackTrace();
return;
}
DataLine.Info info_out = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine line_out;
try {
line_out = (SourceDataLine) AudioSystem.getLine(info_out);
line_out.open(format);
} catch (LineUnavailableException ex) {
ex.printStackTrace();
return;
}
SpeexEncoder encoder = new SpeexEncoder();
SpeexDecoder decoder = new SpeexDecoder();
encoder.init(1, 1, sample_rate, channels);
decoder.init(1, sample_rate, channels, false);
int raw_block_size = encoder.getFrameSize() * channels
* (sample_size / 8);
byte[] buffer = new byte[raw_block_size * 2];
line_in.start();
line_out.start();
while (true) {
int read = line_in.read(buffer, 0, raw_block_size);
if (!encoder.processData(buffer, 0, raw_block_size)) {
System.err.println("Could not encode data!");
break;
}
int encoded = encoder.getProcessedData(buffer, 0);
System.out.println(encoded
+ " bytes resulted as a result of encoding " + read
+ " raw bytes.");
byte[] encoded_data = new byte[encoded];
System.arraycopy(buffer, 0, encoded_data, 0, encoded);
decoder.processData(encoded_data, 0, encoded);
byte[] decoded_data = new byte[decoder.getProcessedDataByteSize()];
int decoded = decoder.getProcessedData(decoded_data, 0);
System.out.println(decoded
+ " bytes resulted as a result of decoding " + encoded
+ " encoded bytes.");
line_out.write(decoded_data, 0, decoded);
}
}
}
そして、ここにいくつかの出力があります(同じことが常に繰り返されます):
15 bytes resulted as a result of encoding 640 raw bytes.
640 bytes resulted as a result of decoding 15 encoded bytes.