gpt4 book ai didi

java - 音频延迟-Java程序到Android程序

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:57 25 4
gpt4 key购买 nike

我有两个 Java 线程,一个是我的计算机,另一个是 Android 手机上的。我想通过 UDP 数据包(点对点连接)将从计算机上的音频线路获取的音频流式传输到 Android 手机。

一切工作正常,除了有时音频滞后和我遇到的主要问题是延迟。我尝试了不同的采样频率和不同的缓冲区大小,但两个设备之间仍然存在延迟(1-2 秒)。

这是我的代码。

Java 音频发送器

(new Thread(() -> {

while (true) {
System.out.println(">>"+status);
while (status) {

try {

int size = tdl.read(buffer, 0, buffer.length);
if(size>0){
DatagramPacket sendPacket
= new DatagramPacket(buffer, size, hostAddress, port);
socket.send(sendPacket);
}
} catch (IOException ex) {
Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
} catch (java.lang.NullPointerException ne) {

}
}
}

})).start();

public static void setUpAudioDriverInput() throws LineUnavailableException {
if (tdl != null) {
tdl.close();
}

int channels = 1;
int sampleSize = 16;
boolean bigEndian = false;

format = new AudioFormat(rate, sampleSize, channels, true, bigEndian);

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

Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();

Mixer mixer = AudioSystem.getMixer(mixerInfoFinal.get(lineIndex));

tdl = (TargetDataLine) mixer.getLine(info);
tdl.open(format);
tdl.start();

}

Java Android 音频接收器

  public void getStreaming(){


getThread = new Thread(new Runnable() {
@Override
public void run() {

try {

System.out.println("Thread Streamer is Starting.. status2"+ status2);

int rate = Integer.parseInt(((Spinner) findViewById(R.id.rateSpinner)).getSelectedItem().toString());
int bufferSize = Integer.parseInt(((Spinner) findViewById(R.id.bufferSizeSpinner)).getSelectedItem().toString());

String payload = ((EditText) findViewById(R.id.nameEditText)).getText().toString();
payload += "#" + rate;
payload += "#" + bufferSize;
payload += "#";

System.out.println(">>>"+payload);

InetAddress address = InetAddress.getByName(((EditText) findViewById(R.id.ipAddressEditText)).getText().toString());
DatagramPacket dp = new DatagramPacket(payload.getBytes(),payload.length(),address,8088);
socket.send(dp);

byte[] buffer = new byte[bufferSize];

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, rate, channelConfigOUT, audioFormat, buffer.length, AudioTrack.MODE_STREAM);
audioTrack.play();


DatagramPacket receivedPacket = new DatagramPacket(buffer,buffer.length);

System.out.println("BufferSize "+ bufferSize);




boolean skip=false;

while(status2 && !Thread.currentThread().isInterrupted()){
try {
socket.receive(receivedPacket);
}catch(SocketTimeoutException ste){
skip=true;
Thread.currentThread().interrupt();
stopStreaming();

}
if(!skip) {
buffer = receivedPacket.getData();
audioTrack.write(buffer, 0, buffer.length);
System.out.println("aaa" + Thread.currentThread().getName());

}
}

} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}



}
});

getThread.start();

}

谢谢。

更新我发现这是我尝试 super 转发数据包的网络。使用另一个网络时,延迟确实减少到不到半秒。昨天我可以用它看电影,而且延迟已经到了极限。如果我会改进系统,我会通知您。

最佳答案

您不应使用 TargetDataLine 读取大小来创建 DatagramPacket。创建了太多数据包。

最好的方法是读取几千字节的数据(即多次 tdl 读取),然后将它们发送到一个“大”DatagramPacket 中。

关于java - 音频延迟-Java程序到Android程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51180897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com