java 音频电台_Java-通过Java套接字广播语音

本文描述了作者在创建一个Java音频电台应用时遇到的问题,该应用从客户端捕获声音并经由服务器广播。在测试中,声音播放出现卡顿。作者怀疑可能是由于缓冲区大小或音频流处理不当导致。代码示例展示了客户端发送音频和服务器接收播放的实现细节,涉及到AudioSystem、TargetDataLine和SourceDataLine等Java音频API的使用。
摘要由CSDN通过智能技术生成

我创建了一个服务器应用程序,该应用程序从客户端接收声音,然后广播此声音,该声音以字节存储,然后将字节发送回连接到服务器的客户端。现在,我目前仅使用一个客户端进行测试,客户端正在接收语音,但是声音一直在卡顿。有人可以告诉我我做错了吗?

我想我理解为什么声音播放不流畅但不了解如何解决问题的部分原因。

代码是波纹管的。

客户端:

将声音发送到服务器的部分

public void captureAudio()

{

Runnable runnable = new Runnable(){

public void run()

{

first=true;

try {

final AudioFileFormat.Type fileType = AudioFileFormat.Type.AU;

final AudioFormat format = getFormat();

DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

line = (TargetDataLine)AudioSystem.getLine(info);

line.open(format);

line.start();

int bufferSize = (int) format.getSampleRate()* format.getFrameSize();

byte buffer[] = new byte[bufferSize];

out = new ByteArrayOutputStream();

objectOutputStream = new BufferedOutputStream(socket.getOutputStream());

running = true;

try {

while (running) {

int count = line.read(buffer, 0, buffer.length);

if (count > 0) {

objectOutputStream.write(buffer, 0, count);

out.write(buffer, 0, count);

InputStream input = new ByteArrayInputStream(buffer);

final AudioInputStream ais = new AudioInputStream(input, format, buffer.length /format.getFrameSize());

}

}

out.close();

objectOutputStream.close();

}

catch (IOException e) {

System.exit(-1);

System.out.println("exit");

}

}

catch(LineUnavailableException e) {

System.err.println("Line Unavailable:"+ e);

e.printStackTrace();

System.exit(-2);

}

catch (Exception e) {

System.out.println("Direct Upload Error");

e.printStackTrace();

}

}

};

Thread t = new Thread(runnable);

t.start();

}

从服务器接收数据字节的部分

private void playAudio() {

//try{

Runnable runner = new Runnable() {

public void run() {

try {

InputStream in = socket.getInputStream();

Thread playTread = new Thread();

int count;

byte[] buffer = new byte[100000];

while((count = in.read(buffer, 0, buffer.length)) != -1) {

PlaySentSound(buffer,playTread);

}

}

catch(IOException e) {

System.err.println("I/O problems:" + e);

System.exit(-3);

}

}

};

Thread playThread = new Thread(runner);

playThread.start();

//}

//catch(LineUnavailableException e) {

//System.exit(-4);

//}

}//End of PlayAudio method

private void PlaySentSound(final byte buffer[], Thread playThread)

{

synchronized(playThread)

{

Runnable runnable = new Runnable(){

public void run(){

try

{

InputStream input = new ByteArrayInputStream(buffer);

final AudioFormat format = getFormat();

final AudioInputStream ais = new AudioInputStream(input, format, buffer.length /format.getFrameSize());

DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

sline = (SourceDataLine)AudioSystem.getLine(info);

sline.open(format);

sline.start();

Float audioLen = (buffer.length / format.getFrameSize()) * format.getFrameRate();

int bufferSize = (int) format.getSampleRate() * format.getFrameSize();

byte buffer2[] = new byte[bufferSize];

int count2;

ais.read( buffer2, 0, buffer2.length);

sline.write(buffer2, 0, buffer2.length);

sline.flush();

sline.drain();

sline.stop();

sline.close();

buffer2 = null;

}

catch(IOException e)

{

}

catch(LineUnavailableException e)

{

}

}

};

playThread = new Thread(runnable);

playThread.start();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值