- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经成功地通过 TCP 套接字发送和读取文本和图像数据。但是我无法发送和读取音频流数据。
服务器端示例代码:
public class ServerAudio {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket serverSocker = new ServerSocket();
Socket client = null;
serverSocker.bind(new InetSocketAddress(6666));
if (serverSocker.isBound()) {
client = serverSocker.accept();
OutputStream out = client.getOutputStream();
while (true) {
AudioInputStream ain = testPlay("C:/Users/Public/Music/Sample Music/adios.wav");
if (ain != null) {
AudioSystem.write(ain, AudioFileFormat.Type.WAVE, out);
}
}
}
serverSocker.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static AudioInputStream testPlay(String filename) {
AudioInputStream din = null;
try {
File file = new File(filename);
AudioInputStream in = AudioSystem.getAudioInputStream(file);
System.out.println("Before :: " + in.available());
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat =
new AudioFormat(AudioFormat.Encoding.PCM_UNSIGNED, baseFormat.getSampleRate(),
8, baseFormat.getChannels(), baseFormat.getChannels(),
baseFormat.getSampleRate(), false);
din = AudioSystem.getAudioInputStream(decodedFormat, in);
System.out.println("After :: " + din.available());
return din;
} catch (Exception e) {
// Handle exception.
e.printStackTrace();
}
return din;
}
}
客户端示例代码:
public class RDPPlayAudioBytes {
private static Socket socket;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// SocketAddress socketAddress = new InetSocketAddress("172.19.1.50", 4444);
try {
Socket socket = new Socket("172.19.0.109", 6666);
// socket.connect(socketAddress, 10000);
if (socket != null && socket.isConnected()) {
InputStream inputStream = socket.getInputStream();
// DataInputStream din=new DataInputStream(inputStream);
while (inputStream != null) {
if (inputStream.available() > 0) {
System.out.println(inputStream.available());
InputStream bufferedIn = new BufferedInputStream(inputStream);
System.out.println("********** Buffred *********" + bufferedIn.available());
AudioInputStream ais = AudioSystem.getAudioInputStream(bufferedIn);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} /*
* catch (LineUnavailableException e) { // TODO Auto-generated catch block
* e.printStackTrace(); }
*/catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我在哪里得到异常
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
我观察到服务器向客户端发送 35394 字节的数据,但在客户端我们收到 8192 字节的数据。我无法理解为什么客户端缺少字节。
请帮助我如何通过 TCP 套接字发送音频流。
最佳答案
服务器:服务器只是流式传输声音文件的字节。不涉及 AudioSytem。将声音文件作为参数传递:
java AudioServer "C:/Users/Public/Music/Sample Music/adios.wav"
AudioServer 类的代码:
import java.io.*;
import java.net.*;
public class AudioServer {
public static void main(String[] args) throws IOException {
if (args.length == 0)
throw new IllegalArgumentException("expected sound file arg");
File soundFile = AudioUtil.getSoundFile(args[0]);
System.out.println("server: " + soundFile);
try (ServerSocket serverSocker = new ServerSocket(6666);
FileInputStream in = new FileInputStream(soundFile)) {
if (serverSocker.isBound()) {
Socket client = serverSocker.accept();
OutputStream out = client.getOutputStream();
byte buffer[] = new byte[2048];
int count;
while ((count = in.read(buffer)) != -1)
out.write(buffer, 0, count);
}
}
System.out.println("server: shutdown");
}
}
客户端客户端可以播放通过命令行传递的声音文件以测试它是否有效:
java AudioClient "C:/Users/Public/Music/Sample Music/adios.wav"
不带任何参数调用它连接到服务器并播放通过套接字接收的文件:
java AudioClient
代码:
import java.io.*;
import java.net.*;
import javax.sound.sampled.*;
public class AudioClient {
public static void main(String[] args) throws Exception {
if (args.length > 0) {
// play a file passed via the command line
File soundFile = AudioUtil.getSoundFile(args[0]);
System.out.println("Client: " + soundFile);
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(soundFile))) {
play(in);
}
}
else {
// play soundfile from server
System.out.println("Client: reading from 127.0.0.1:6666");
try (Socket socket = new Socket("127.0.0.1", 6666)) {
if (socket.isConnected()) {
InputStream in = new BufferedInputStream(socket.getInputStream());
play(in);
}
}
}
System.out.println("Client: end");
}
private static synchronized void play(final InputStream in) throws Exception {
AudioInputStream ais = AudioSystem.getAudioInputStream(in);
try (Clip clip = AudioSystem.getClip()) {
clip.open(ais);
clip.start();
Thread.sleep(100); // given clip.drain a chance to start
clip.drain();
}
}
}
AudioServer 和 AudioClient 使用的实用类:
import java.io.File;
public class AudioUtil {
public static File getSoundFile(String fileName) {
File soundFile = new File(fileName);
if (!soundFile.exists() || !soundFile.isFile())
throw new IllegalArgumentException("not a file: " + soundFile);
return soundFile;
}
}
关于java - 通过 TCP 发送音频流,UnsupportedAudioFileException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17044644/
我正在使用 AudioInputStream 在 Java 中进行一些基本的音频处理。我的程序可以正确加载用两个轨道编码的 16 位整数 PCM 音频,但不能用立体声编码。当呈现一个文件时(根据 ff
我正处于用 Java 编写小型音乐/节奏游戏的早期阶段(通过 Slick 框架,它又使用 OpenAL,但这可能与此无关)。游戏需要读取(和播放)多个 WAV 格式的声音文件,但一些文件抛出 [jav
这是我在这里的第一篇文章。我目前正在 Apache-Karaf 3.0.0 上的 Scala 中开发一个简单的 http 音频 servlet。我将它部署为一些 bundle 中的功能,这些 bund
我看到了多个关于流 MP3 流(如 Icecast)的 Stack Overflow 问题。他们都说使用 MP3SPI 库,我就是这样。 MP3SPI 用于支持音频/mpeg mime 类型。这就是我
我在尝试使用 Java 播放声音时遇到问题;如果我使用 AudioInputStream soundIn = AudioSystem.getAudioInputStream(new File("./s
我已经研究了好几天来弄清楚如何解决这个问题,但没有运气。 PlayN JavaSound类使用javax.sound.sampled.AudioSystem类来播放声音,并且似乎不支持mp3格式。 j
我已经成功地通过 TCP 套接字发送和读取文本和图像数据。但是我无法发送和读取音频流数据。 服务器端示例代码: public class ServerAudio { /** * @p
我正在尝试使用我在这里找到的代码在我的 java 程序中加载 wav 文件: How do I get a sound file's total time in Java? 但是,在第 14 行: A
我正在尝试使用此处另一个问题的答案来播放 OGG 音频文件:Playing ogg files in eclipse 使用javazoom library我为我的项目成功下载并配置了该文件,我正在尝试
我的 Java 项目中有两个类,一个是 反弹 import java.awt.*; import java.awt.event.*; import javax.swing.*; public clas
我正在使用 java 6 ,我正在尝试加载 wav 文件,以获取其持续时间如下: public static double getAudioFileDuration(File file) {
我是一名优秀的程序员,十分优秀!