Java字节数组播放声音

4
我有一个小程序,可以从数据行麦克风读取字节数组。我不确定它是否有效,但通过打印数组的一部分,当我在麦克风旁边发出声音时,它似乎会改变 :)。
我想播放声音,如何从缓冲区(字节数组到声音)播放数据?
 package mic; 
import javax.sound.sampled.*;

public class Mic extends Thread{
    boolean flag;
    TargetDataLine mic;
    byte[] buffer;
    AudioFormat format;

    public static void main(String[] args) {
       Mic a=new Mic();
       a.start();
    }
    @Override
    public void run()
    {
        flag=true;
        startMic();
        while(flag)
        {
            send();
        }
    }
    public void send()
    {
        try{
            mic.read(buffer,0,512);
            System.out.println("1. "+buffer[0]);
        }catch(Exception ex)
        {

        }
    }
    public void startMic()
    {
        try{
            format=new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,8000.0F,16,2,4,8000.0F,true);
            DataLine.Info info=new DataLine.Info(TargetDataLine.class,format);
            mic=(TargetDataLine)AudioSystem.getLine(info);
            mic.open();
            mic.start();
            buffer=new byte[512];
        }catch(Exception exx)
        {
            System.out.println("exx");
        }

    }
}

编辑:
我最终想要做的是将字节数组发送到其他应用程序并立即播放
就像收音机的实时流一样


创建/选择一个具有相同音频格式的“SourceDataLine”,并在其中写入字节。或者将您的数据包装在“AudioInputStream”中,并使用“WaveFileWriter”将其存储为.WAV文件到磁盘。 - mihi
这里有很多例子:http://www.jsresources.org/ - Bjorn Roche
2个回答

8

根据这里的内容:

// Create the AudioData object from the byte array
AudioData audiodata = new AudioData(byteArray);
// Create an AudioDataStream to play back
AudioDataStream audioStream = new AudioDataStream(audioData);
// Play the sound
AudioPlayer.player.start(audioStream);

2
我需要导入什么才能使用AudioPlayer? - Sachin Setiya
@Sachin-Setiya: import java.io.InputStream @Sachin-Setiya:导入java.io.InputStream - CFSO6459
5
AudioDataAudioDataStream需要使用sun.*包,这个包已经过时20年并且存在很多bug。请尽量避免使用它。参考。(而这里可能是一个更好的方式。) - CFSO6459

2

一种简单的测试捕获数据的方法是将其保存到文件中,并使用Audacity通过RAW文件导入加载它们。只需指定您的原始文件格式: 采样率8KHz 格式PCM大端 立体声16位


1
一定有一种方法可以直接从字节数组中播放或将其转换为其他东西(保留在内存中)然后播放,我想避免使用硬盘。 - user1246950
是的,但您需要调试记录和播放代码,这样测试会更容易。 - Julien Vermillard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接