Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 播放UDP数据包中接收到的原始PCM音频_Java_Sockets_Audio_Udp_Pcm - Fatal编程技术网

Java 播放UDP数据包中接收到的原始PCM音频

Java 播放UDP数据包中接收到的原始PCM音频,java,sockets,audio,udp,pcm,Java,Sockets,Audio,Udp,Pcm,远程设备正在发送UDP数据包中的实时原始PCM音频(不包括报头),我需要用java实现一个程序来接收这些数据包并在PC上实时播放。 正如我所知,原始PCM的属性是16位,单声道,采样率24KHz,所以我尝试添加一个wav头到这个原始PCM音频和播放,但问题是我没有音频的文件大小 我还实现了一个程序的基础上,但它只给噪音的输出 我必须使用UDP,并且我只能从远程设备获取原始PCM,因此他们的任何库或API都可以在PC上播放此原始音频?下面是一个获取输出线并在其上播放PCM的简单示例。运行时,它会播

远程设备正在发送UDP数据包中的实时原始PCM音频(不包括报头),我需要用java实现一个程序来接收这些数据包并在PC上实时播放。 正如我所知,原始PCM的属性是16位,单声道,采样率24KHz,所以我尝试添加一个wav头到这个原始PCM音频和播放,但问题是我没有音频的文件大小

我还实现了一个程序的基础上,但它只给噪音的输出


我必须使用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);
        }
    }

}
导入javax.sound.sampled.AudioFormat;
导入javax.sound.sampled.AudioSystem;
导入javax.sound.sampled.DataLine;
导入javax.sound.sampled.SourceDataLine;
公演{
公共静态void main(字符串[]args){
试一试{
//选择音频格式参数
AudioFormat af=新的AudioFormat(24000,16,1,真,假);
DataLine.Info=newdataline.Info(SourceDataLine.class,af);
SourceDataLine=(SourceDataLine)AudioSystem.getLine(info);
//生成一些PCM数据(为简单起见,为正弦波)
字节[]缓冲区=新字节[64];
双步长=Math.PI/buffer.length;
双角度=Math.PI*2;
int i=缓冲区长度;
而(i>0){
双正弦=数学正弦(角度);
int sample=(int)数学四舍五入(sine*32767);
缓冲区[--i]=(字节)(示例>>8);
缓冲区[--i]=(字节)样本;
角度-=步长;
}
//准备音频输出
行。打开(af,4096);
line.start();
//重复输出波形

for(int n=0;这应该非常简单(使用javax.sound),创建一个与参数匹配的音频格式,打开该音频格式的源线并编写示例。直接在线路接口上播放时,您不需要事先知道音频的长度。感谢您的回答,我尝试过了,但当我通过原始PCM的字节数组(无标头)时,输出中只会出现噪音当我经过一系列音频(带标题)时,它会正确播放。我正在执行上面提到的所有步骤。然后,要么你在音频格式中混合了大/小endian,它不是PCM,要么你的接收代码没有获得正确的数据…要么你接收数据的速度不够快,而且数据块太少,所以播放时听起来像噪音?你使用两个线程,一个用于接收,一个用于播放,对吗?我会发布给你这是一个简单的同步播放示例。非常感谢@Durandal,我没有收到正确的PCM样本。现在工作正常。非常感谢您的帮助。:@Durandal没有生成PCM数据,有没有办法为来自远程服务器的PCM数据提供数据?