Java 实现录音并写出到文件
Java 实现录音
package cn.zzzykj.demo;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.file.PathUtil;
import cn.hutool.core.util.RandomUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.concurrent.*;
/**
* @author TheEnd
*/
@Slf4j
public class AudioHelper {
private static final TargetDataLine MICROPHONE;
private static final ExecutorService executorService = Executors.newSingleThreadExecutor();
private static Future<AudioTaskInfo> future;
static {
try {
MICROPHONE = AudioSystem.getTargetDataLine(new AudioFormat(44100.0F, 16, 2, true, false));
} catch (LineUnavailableException e) {
log.error("Audio Init: ", e);
throw new RuntimeException(e);
}
}
public static void open() {
try {
log.info("Audio Open...");
MICROPHONE.open(new AudioFormat(44100.0F, 16, 2, true, false));
} catch (LineUnavailableException e) {
log.error("Audio Open: ", e);
}
}
public static synchronized void start() {
if (future == null) {
future = executorService.submit(new AudioTask());
}
}
public static synchronized String stop() {
if (future == null) {
throw new RuntimeException();
}
log.info("Audio Stop...");
MICROPHONE.stop();
try {
AudioTaskInfo info = future.get();
return info.getFile().getAbsoluteFile().getAbsolutePath();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
}
public static void close() {
MICROPHONE.close();
}
@Data
@Getter
public static class AudioTask implements Callable<AudioTaskInfo> {
private AudioTaskInfo info;
private static File newWav() {
Path audioTmpDir = Paths.get("tmp", "audio", "wav");
PathUtil.mkdir(audioTmpDir);
String audioTmpName = DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomNumbers(3) + ".wav";
Path audioTmpPath = Paths.get(audioTmpDir.toString(), audioTmpName);
return audioTmpPath.toFile();
}
private static File saveWav() {
File outputFile = newWav();
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
try {
log.info("Write Wav File: {}", outputFile.getPath());
AudioSystem.write(new AudioInputStream(AudioHelper.MICROPHONE), fileType, outputFile);
log.info("Write Wav File Success: {}", outputFile.getPath());
} catch (IOException e) {
log.info("Write Wav File Fail: {}", outputFile.getPath());
log.error(e.getMessage(), e);
throw new RuntimeException(e);
}
return outputFile;
}
@Override
public AudioTaskInfo call() throws Exception {
log.info("Audio Start...");
MICROPHONE.start();
File file = saveWav();
return new AudioTaskInfo(file);
}
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class AudioTaskInfo {
private File file;
}
}
评论已关闭