进来这家公司给了一个很坑的需求(明明有专业厂家不找,要自己做混音,做完还得用别人的设备)--自己做录音跟后面的混音。吐槽说完,讲一下大概的思路,首先保存背景音乐跟麦克风的声音,分别存储为pcm文件之后再进行混合。废话不多说,贴代码。
首先贴入保存麦克风声音的类(注意定做的麦克风用厂家的方法获取,这个只是适合安卓能获取到录音权限的电视机)
package com.loostone.Recording;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by kkk on 2018/12/19.
* 录音的工具类
*/
public class AudioRecorder {
private static AudioRecorder audioRecorder;
// 音频源:音频输入-麦克风
private final static int AUDIO_INPUT = MediaRecorder.AudioSource.MIC;
// 采样率
// 44100是目前的标准,但是某些设备仍然支持22050,16000,11025
// 采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级
private final static int AUDIO_SAMPLE_RATE = 96000;
// 音频通道 单声道
private final static int AUDIO_CHANNEL = AudioFormat.CHANNEL_IN_MONO;
// 音频格式:PCM编码
private final static int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区大小:缓冲区字节大小
private int bufferSizeInBytes = 48000;
// 录音对象
private AudioRecord audioRecord;
// 录音状态
private Status status = Status.STATUS_NO_READY;
// 文件名
private String fileName;
// 录音文件集合
private List<String> filesName = new ArrayList<>();
private AudioRecorder() {
}
//单例模式
public static AudioRecorder getInstance() {
if (audioRecorder == null) {
audioRecorder = new AudioRecorder();
}
return audioRecorder;
}
/**
* 创建录音对象
*/
public void createAudio(String fileName, int audioSource, int sampleRateInHz, int channelConfig, int audioFormat) {
// 获得缓冲区字节大小
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);
this.fileName = fileName;
}
/**
* 创建默认的录音对象
* @param fileName 文件名
*/
public void createDefaultAudio(String fileName) {
// 获得缓冲区字节大小
bufferSizeInBytes = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_RATE,
AUDIO_CHANNEL, AUDIO_ENCODING);
audioRecord = new AudioRecord(AUDIO_INPUT, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL, AUDIO_ENCODING, bufferSizeInBytes);
this.fileName = fileName;
status = Status.STATUS_READY;