- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个 Java 桌面应用程序,我在其中录制来自麦克风的语音,并在 LAN 中实时将此语音数据发送到另一个计算机系统,反之亦然。
我可以通过麦克风录制声音并输出到系统中的扬声器。现在使用 UDP 数据报套接字想要做同样的事情,但是 UDP 服务器没有接收到数据流(字节 [])。
这里是代码:VUClient.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.sound.sampled.*;
public class VUClient extends JFrame {
boolean stopaudioCapture = false;
ByteArrayOutputStream byteOutputStream;
AudioFormat adFormat;
TargetDataLine targetDataLine;
AudioInputStream InputStream;
SourceDataLine sourceLine;
Graphics g;
public static void main(String args[]) {
new VUClient();
}
public VUClient() {
final JButton capture =
new JButton("Capture");
final JButton stop =
new JButton("Stop");
final JButton play =
new JButton("Playback");
capture.setEnabled(true);
stop.setEnabled(false);
play.setEnabled(false);
capture.addActionListener(
new ActionListener() {
public void actionPerformed(
ActionEvent e) {
capture.setEnabled(false);
stop.setEnabled(true);
play.setEnabled(false);
captureAudio();
}
});
getContentPane().add(capture);
stop.addActionListener(
new ActionListener() {
public void actionPerformed(
ActionEvent e) {
capture.setEnabled(true);
stop.setEnabled(false);
play.setEnabled(true);
stopaudioCapture = true;
targetDataLine.close();
}
});
getContentPane().add(stop);
play.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(
ActionEvent e) {
playAudio();
}
});
getContentPane().add(play);
getContentPane().setLayout(new FlowLayout());
setTitle("Capture/Playback Demo");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 100);
getContentPane().setBackground(Color.white);
setVisible(true);
g = (Graphics) this.getGraphics();
}
private void captureAudio() {
try {
adFormat = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, adFormat);
targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
targetDataLine.open(adFormat);
targetDataLine.start();
Thread captureThread = new Thread(new CaptureThread());
captureThread.start();
} catch (Exception e) {
StackTraceElement stackEle[] = e.getStackTrace();
for (StackTraceElement val : stackEle) {
System.out.println(val);
}
System.exit(0);
}
}
private void playAudio() {
try {
byte audioData[] = byteOutputStream.toByteArray();
// System.out.println("byte auto "+byteOutputStream.toString());
InputStream byteInputStream = new ByteArrayInputStream(audioData);
AudioFormat adFormat = getAudioFormat();
InputStream = new AudioInputStream(byteInputStream, adFormat, audioData.length / adFormat.getFrameSize());
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, adFormat);
sourceLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceLine.open(adFormat);
sourceLine.start();
Thread playThread = new Thread(new PlayThread());
playThread.start();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;
int sampleInbits = 16;
int channels = 1;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(sampleRate, sampleInbits, channels, signed, bigEndian);
}
class CaptureThread extends Thread {
byte tempBuffer[] = new byte[10000];
public void run() {
byteOutputStream = new ByteArrayOutputStream();
stopaudioCapture = false;
try {
DatagramSocket clientSocket = new DatagramSocket();
// InetAddress IPAddress = InetAddress.getByName("192.168.64.142");
InetAddress IPAddress = InetAddress.getByName("localhost");
while (!stopaudioCapture) {
int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
if (cnt > 0) {
DatagramPacket sendPacket = new DatagramPacket(tempBuffer, tempBuffer.length, IPAddress, 9876);
clientSocket.send(sendPacket);
byteOutputStream.write(tempBuffer, 0, cnt);
// System.out.print(cnt);
}
// DatagramPacket sendPacket = new DatagramPacket(byteOutputStream, 10000, IPAddress, 9876);
// clientSocket.send(sendPacket);
}
byteOutputStream.close();
} catch (Exception e) {
System.out.println("CaptureThread::run()" + e);
System.exit(0);
}
}
}
class PlayThread extends Thread {
byte tempBuffer[] = new byte[10000];
public void run() {
try {
// DatagramSocket clientSocket = new DatagramSocket();
// InetAddress IPAddress = InetAddress.getByName("192.168.64.142");
// InetAddress IPAddress = InetAddress.getByName("localhost");
int cnt;
while ((cnt = InputStream.read(tempBuffer, 0,tempBuffer.length)) != -1) {
if (cnt > 0) {
// DatagramPacket sendPacket = new DatagramPacket(tempBuffer, tempBuffer.length, IPAddress, 9876);
// clientSocket.send(sendPacket);
// sourceLine.write(tempBuffer, 0, cnt);
}
}
// sourceLine.drain();
// sourceLine.close();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
}
}// Class End
VUServer.java
import java.io.*;
import java.net.*;
import javax.sound.sampled.*;
public class VUServer {
ByteArrayOutputStream byteOutputStream;
AudioFormat adFormat;
TargetDataLine targetDataLine;
AudioInputStream InputStream;
SourceDataLine sourceLine;
private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;
int sampleInbits = 16;
int channels = 1;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(sampleRate, sampleInbits, channels, signed, bigEndian);
}
public static void main(String args[]) {
new VUServer().runVOIP();
}
public void runVOIP() {
try {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[10000];
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
// String sentence = new String(receivePacket.getData());
System.out.println("RECEIVED: ");// + sentence);
try {
byte audioData[] = receivePacket.getData();//byteOutputStream.toByteArray();
// System.out.println("byte auto "+byteOutputStream.toString());
InputStream byteInputStream = new ByteArrayInputStream(audioData);
AudioFormat adFormat = getAudioFormat();
InputStream = new AudioInputStream(byteInputStream, adFormat, audioData.length / adFormat.getFrameSize());
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, adFormat);
sourceLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceLine.open(adFormat);
sourceLine.start();
Thread playThread = new Thread(new PlayThread());
playThread.start();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
class PlayThread extends Thread {
byte tempBuffer[] = new byte[10000];
public void run() {
try {
int cnt;
while ((cnt = InputStream.read(tempBuffer, 0,tempBuffer.length)) != -1) {
if (cnt > 0) {
sourceLine.write(tempBuffer, 0, cnt);
}
}
sourceLine.drain();
sourceLine.close();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
}
}
最佳答案
你这行有问题(
byte[] receiveData = new byte[10000];
)
使尺寸比这大...我成功了
byte[] receiveData = new byte[90000];
效果很好....
关于java - 将连续字节[]数据发送到Java中的DatagramSocket,DatagramPacket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17174202/
我正在使用 UDP 传输实现客户端/服务器应用程序。这是我的代码的一部分: 客户端: InetAddress serverAddress = ... int serverPort = ... Data
我需要从 DatagramPacket 2 原始数据类型和字节数组中恢复; 我需要获得一个 unsigned long long 和一个 int 作为原始数据类型...当我尝试使用 System.ar
这是在回答 BufferedWriter only works the first time 时出现的 据我对 Java Doc 的理解(网上的许多帖子都证实了这一点)DatagramPacket 不
尝试将接收到的 DatagramPacket 转换为字符串,但我遇到了一个小问题。不确定最好的方法是什么。 我将要接收的数据大部分长度未知,因此我在接收端设置了一些缓冲区[1024]。问题是,假设我发
以下代码产生“找不到合适的构造函数”错误。我无法找出原因。 try { Sock = new DatagramSocket(); Inet
因此,在寻找合适的库后,我决定创建自己的库,这是其中的一部分。 try { DatagramSocket serverSocket = new DatagramSocket(client_po
在我的 Java 应用程序中,我通过 DatagramSocket 接收 DatagramPacket。我知道数据包可以包含的最大字节数,但实际上每个数据包长度都不同(不超过最大长度)。 假设 MAX
这个问题已经有答案了: Can not access object's properties(methods) from within the run method! Java Multithread
我正在创建一个 java 多人游戏,它解决了 LAN 上客户端和服务器之间不断发送 DatagramPackets 的问题。 客户端的 DatagramSocket 将随机停止从服务器接收数据包,因此
我编写了一个 Java 线程(可运行)来基本上存储 DatagramPackets 列表,如果列表的大小 > 0,它将发送列表中的第一项。 看来,除非我在 run 方法中放置大量 sleep ,否则线
我正在编写战舰游戏,以便使用 UDP 在同一网络中的两台计算机之间进行游戏。当我做出连接时,它不会引发期望,但信息只会朝着一个方向发展。我的意思是,计算机 A 正确地将坐标发送到计算机 B,但计算机
我正在使用 DatagramPacket 和 DatagramSocket 来创建客户端/服务器情况。我有一个带有简单客户端和服务器的工作项目。客户端将向服务器发送一个序列化对象,仅此而已。 下面显示
在java库中,http://download.java.net/jdk7/archive/b123/docs/api/java/net/DatagramPacket.html 我想使用此构造函数构造
这个问题在这里已经有了答案: DatagramPacket to string (6 个答案) 关闭 6 年前。 下面的代码打印 [B@40545a60,[B@40545a60abc exp 但我想
我正在构建一个基于 UDP 的应用程序来接收和发送多个数据包。 我可以为每次发送构建一个新的 DatagramPacket,或者在我的应用程序的生命周期中回收一个实例。 重用 DatagramPack
我正在实现一个客户端-服务器程序,并希望我的客户端在等待 5 秒后没有来自服务器的 ACK-Answer,发回相同的数据包... 我是这样弄的,如果可以的话请告诉我.. dp = new Datagr
问题: 假设您的传输速度高达 10 MB/s,那么回收 DatagramPacket 对象(而不是每次发送数据包时创建一个新对象)是否是一个好主意? 故事: 我正在创建一个 LAN 文件同步应用程序,
我正在制作一个 Java 桌面应用程序,我在其中录制来自麦克风的语音,并在 LAN 中实时将此语音数据发送到另一个计算机系统,反之亦然。 我可以通过麦克风录制声音并输出到系统中的扬声器。现在使用 UD
我正在使用 Datagramsocket 和 DatagramPacket 制作一个简单的 server_client 应用程序。我想做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个
我是整个 UDP 的新手(因为每个人都喜欢 TCP),需要问几个关于 Java 实现的问题。 我需要有人告诉我是否: Java发送的DatagramPackets由于以下原因自动分片网络配置和数据大小
我是一名优秀的程序员,十分优秀!