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

Play raw PCM audio received in UDP packets

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

我也实现了一个基于 this link 的程序,但它只会在输出中产生噪音。

我一定要使用 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);
        }
    }

}

你看,它大约有十行用于处理行,一半代码是 "generate PCM" 部分,如果你从其他地方获得 PCM,你可以忽略它。您需要注意创建正确的 AudioFormat,搞砸签名 and/or 字节序的布尔值,PCM 听起来会很乱码,甚至可能无法识别。