远程设备正在 UDP 数据包中发送实时原始 PCM 音频(不包含标头),我需要在 java 中实现一个程序来接收这些数据包并在 PC 上实时播放它们。
据我所知,原始 PCM 的属性是 16 位、单声道、采样率 24KHz,因此我尝试向该原始 PCM 音频添加 wav 标头并播放,但问题是我没有音频的文件大小。
我还实现了一个基于这个链接 http://www.wikijava.org/wiki/Play_a_wave_sound_in_Java但它只会在输出中产生噪音。
我必须使用 UDP,并且只能从远程设备获取原始 PCM,那么他们有任何库或 API 可以让我在 PC 上播放此原始音频吗?
这是一个获取输出线并在其上播放 PCM 的简单示例。运行时,它会发出大约第二声长而烦人的蜂鸣声。
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
public class RawAudioPlay {
public static void main(String[] args) {
try {
// select audio format parameters
AudioFormat af = new AudioFormat(24000, 16, 1, true, false);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
// generate some PCM data (a sine wave for simplicity)
byte[] buffer = new byte[64];
double step = Math.PI / buffer.length;
double angle = Math.PI * 2;
int i = buffer.length;
while (i > 0) {
double sine = Math.sin(angle);
int sample = (int) Math.round(sine * 32767);
buffer[--i] = (byte) (sample >> 8);
buffer[--i] = (byte) sample;
angle -= step;
}
// prepare audio output
line.open(af, 4096);
line.start();
// output wave form repeatedly
for (int n=0; n<500; ++n) {
line.write(buffer, 0, buffer.length);
}
// shut down audio
line.drain();
line.stop();
line.close();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
你看,它大约有十行用于处理该行,一半的代码是“生成PCM”部分,如果你从其他地方获取PCM,你可以忽略它。您需要注意创建正确的音频格式,搞乱有符号和/或字节序的布尔值,PCM 听起来会非常乱码,甚至可能无法识别。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)