java byte 异常 录音_java实现动态录音,声卡有声音进来就自动录音 | 学步园

TargetDataLine是声音的输入(麦克风),而SourceDataLine是输出(音响,耳机).

整个过程,请参见下面的程序.(运行后,实时地从麦克风录音,实时输出).

import java.io.*;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioFormat;

import javax.sound.sampled.SourceDataLine;

import javax.sound.sampled.DataLine;

import javax.sound.sampled.FloatControl;

import javax.sound.sampled.TargetDataLine;

public class RecordAndPlay {

static volatile boolean stop=false;

public static void main(String[] args) {

Play();

}

//播放音频文件

public static void Play() {

try {

AudioFormat audioFormat =

// new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100F,

// 8, 1, 1, 44100F, false);

new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F, 16, 2, 4,

44100F, true);

DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);

targetDataLine.open(audioFormat);

final SourceDataLine sourceDataLine;

info = new DataLine.Info(SourceDataLine.class, audioFormat);

sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);

sourceDataLine.open(audioFormat);

targetDataLine.start();

sourceDataLine.start();

FloatControl fc=(FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);

double value=2;

float dB = (float)

(Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0);

fc.setValue(dB);

int nByte = 0;

final int bufSize=4*100;

byte[] buffer = new byte[bufSize];

while (nByte != -1) {

//System.in.read();

nByte = targetDataLine.read(buffer, 0, bufSize);

sourceDataLine.write(buffer, 0, nByte);

}

sourceDataLine.stop();

} catch (Exception e) {

e.printStackTrace();

}

}

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部