【问题标题】:java byte array play soundjava字节数组播放声音
【发布时间】:2012-09-25 18:41:47
【问题描述】:

我有一个从数据线麦克风读取到字节数组的小程序 我不是 100% 确定它可以工作,但只是通过打印阵列的一部分,当我在麦克风旁边发出声音时,它似乎会改变:)

我喜欢播放声音我如何播放缓冲区中的数据(字节数组到声音)??

 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");
        }

    }
}

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

【问题讨论】:

  • 创建/选择具有相同AudioFormatSourceDataLine 并在其中写入您的字节。或者将您的数据包装在 AudioInputStream 中并使用 WaveFileWriter 将其作为 .WAV 文件存储到磁盘。
  • 这里有很多例子:jsresources.org

标签: java audio


【解决方案1】:

基于this

// 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);

【讨论】:

  • 使用 AudioPlayer 需要导入什么
  • @Sachin-Setiya: import java.io.InputStream
  • AudioDataAudioDataStream 需要 sun.* 包,这是WAY OUT OF DATE(大约 20 年前)并且它们有很多错误。请尽量避免使用它[Reference]。 (而this 可能是更好的方法。)
【解决方案2】:

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

【讨论】:

  • 必须有一种方法可以直接从字节数组播放它或将其转换为其他东西(留在内存中)然后播放它,我想避免高清
  • 是的,但是你需要调试你的记录和播放代码,这样更容易测试
猜你喜欢
  • 1970-01-01
  • 2014-11-06
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多