来自 TargetDataLine 的声波

Posted

技术标签:

【中文标题】来自 TargetDataLine 的声波【英文标题】:Sound wave from TargetDataLine 【发布时间】:2013-01-26 23:08:37 【问题描述】:

目前我正在尝试从麦克风录制声波并在 Java 中实时显示振幅值。我遇到了 Targetdataline,但我在理解我从中获取数据时遇到了一些麻烦。

来自 Oracle 的示例代码:

line = (TargetDataLine) Audiosystem.getLine(info);
line.open(format, line.getBufferSize());
ByteArrayOutputStream out  = new ByteArrayOutputStream();
int numBytesRead;
byte[] data = new byte[line.getBufferSize() / 5];

// Begin audio capture.
line.start();

// Here, stopped is a global boolean set by another thread.
while (!stopped) 
// Read the next chunk of data from the TargetDataLine.
numBytesRead =  line.read(data, 0, data.length);

****ADDED CODE HERE*****

// Save this chunk of data.
out.write(data, 0, numBytesRead);
    

所以我目前正在尝试添加代码以获取幅度值的输入流,但是当我在添加的代码行打印变量数据时,我得到了大量的字节。

for (int j=0; j<data.length; j++) 
   System.out.format("%02X ", data[j]);

以前用过 TargetDataLine 的人知道我怎么用吗?

【问题讨论】:

如需尽快获得更好的帮助,请发帖SSCCE。 【参考方案1】:

对于将来在使用 TargetDataLine 进行声音提取时遇到问题的任何人,Ganesh Tiwari 的 WaveData 类包含一个非常有用的方法,可以将字节转换为浮点数组 (http://code.google.com/p/speech-recognition-java-hidden-markov-model-vq-mfcc/source/browse/trunk/SpeechRecognitionHMM/src/org/ioe/tprsa/audio/WaveData.java):

public float[] extractFloatDataFromAudioInputStream(AudioInputStream audioInputStream) 
    format = audioInputStream.getFormat();
    audioBytes = new byte[(int) (audioInputStream.getFrameLength() * format.getFrameSize())];
    // calculate durationSec
    float milliseconds = (long) ((audioInputStream.getFrameLength() * 1000) / audioInputStream.getFormat().getFrameRate());
    durationSec = milliseconds / 1000.0;
    // System.out.println("The current signal has duration "+durationSec+" Sec");
    try 
        audioInputStream.read(audioBytes);
     catch (IOException e) 
        System.out.println("IOException during reading audioBytes");
        e.printStackTrace();
    
    return extractFloatDataFromAmplitudeByteArray(format, audioBytes);

使用这个我可以得到声音幅度数据。

【讨论】:

以上是关于来自 TargetDataLine 的声波的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中同步 TargetDataLine 和 SourceDataLine(同步音频录制和播放)

linux上的java声音:如何足够快地从TargetDataLine捕获以跟上?

显示用于录音的声波

树莓派通过C语言和python操作超声波测距模块

基于超声波的四轴定高控制简析

超声波雷达的特点