line.open(audioFormat);
// 数据线与音频数据的IO建立联系
line.start();
// 每次取得的原始数据大小
final int audioBufferSize = SAMPLE_RATE * CHANNEL_NUM;
// 初始化数组,用于暂存原始音频采样数据
audioBytes = new byte[audioBufferSize];
// 创建一个定时任务,任务的内容是定时做音频采样,再把采样数据交给帧录制器处理
sampleTask = new ScheduledThreadPoolExecutor(1);
}
/**
- 程序结束前,释放音频相关的资源
*/
public void releaseOutputResource() {
// 结束的标志,避免采样的代码在whlie循环中不退出
isFinish = true;
// 结束定时任务
sampleTask.shutdown();
// 停止数据线
line.stop();
// 关闭数据线
line.close();
}
/**
-
启动定时任务,每秒执行一次,采集音频数据给帧录制器
-
@param frameRate
*/
public void startSample(double frameRate) {
// 启动定时任务,每秒执行一次,采集音频数据给帧录制器
sampleTask.scheduleAtFixedRate((Runnable) new Runnable() {
@Override
public void run() {
try
{
int nBytesRead = 0;
while (nBytesRead == 0 && !isFinish) {
// 音频数据是从数据线中取得的
nBytesRead = line.read(audioBytes, 0, line.available());
}
// 如果nBytesRead<1,表示isFinish标志被设置true,此时该结束了
if (nBytesRead<1) {
return;
}
// 采样数据是16比特,也就是2字节,对应的数据类型就是short,
// 所以准备一个sh