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

}

评论已关闭