import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
-
@author willzhao
-
@version 1.0
-
@description 音频相关的服务
-
@date 2021/12/3 8:09
*/
@Slf4j
public class AudioService {
// 采样率
private final static int SAMPLE_RATE = 44100;
// 音频通道数,2表示立体声
private final static int CHANNEL_NUM = 2;
// 帧录制器
private FFmpegFrameRecorder recorder;
// 定时器
private ScheduledThreadPoolExecutor sampleTask;
// 目标数据线,音频数据从这里获取
private TargetDataLine line;
// 该数组用于保存从数据线中取得的音频数据
byte[] audioBytes;
// 定时任务的线程中会读此变量,而改变此变量的值是在主线程中,因此要用volatile保持可见性
private volatile boolean isFinish = false;
/**
-
帧录制器的音频参数设置
-
@param recorder
-
@throws Exception
*/
public void setRecorderParams(FrameRecorder recorder) throws Exception {
this.recorder = (FFmpegFrameRecorder)recorder;
// 码率恒定
recorder.setAudioOption(“crf”, “0”);
// 最高音质
recorder.setAudioQuality(0);
// 192 Kbps
recorder.setAudioBitrate(192000);
// 采样率
recorder.setSampleRate(SAMPLE_RATE);
// 立体声
recorder.setAudioChannels