Android 录音/切换麦克风
private AudioRecord getAudioRecord() {
final int SAMPLE_RATE = 16000;
final int WAVE_FRAM_SIZE = 20 * 2 * 16000 / 1000; //20ms audio for 16k/16bit/mono
try {
int bufferSize = AudioRecord.getMinBufferSize(16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
// AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, WAVE_FRAM_SIZE * 4);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
return recorder;
}
} catch (Exception e) {
Log.e(TAG, "Error in Audio Record");
}
return null;
}
切换麦克风
当设备中有多个麦克风时,我们希望切换到另一个麦克风,可以采用此方法。
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 16000 * 4);
AudioManager audioManager = (AudioManager) MainApplication.getContext().getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] audioDeviceInfos = new AudioDeviceInfo[]{};
audioDeviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
for (AudioDeviceInfo device : audioDeviceInfos) {
if (device.getType() == AudioDeviceInfo.TYPE_USB_DEVICE && device.getProductName().equals("USB-Audio - USB PnP Sound Device")) {
audioRecord.setPreferredDevice(device);
Log.d(TAG, "Set microphone: " + device.getProductName());
}
Log.d(TAG, device.getId() + " | " + device.getProductName() + " | " + device.getType());
}
audioRecord.startRecording();
Log.d(TAG, "AudioRecord state: " + audioRecord.getState());
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
Log.e(TAG, "audio recorder not init");
} else {
byte[] audioData = new byte[1024];
for (int i = 0; i < 100; i++) {
int ret = audioRecord.read(audioData, 0, 1024);
Log.d(TAG, String.valueOf(audioData));
}
}
声卡
rk3288:/ $ cd /dev/snd/ rk3288:/dev/snd $ ls controlC0 pcmC0D0c pcmC0D0p pcmC0D1p timer
3.5.1. 播放
播放测试
aiv8167sm3_bsp:/storage/emulated/0 # tinyplay zai.wav Playing sample: 1 ch, 16000 hz, 16 bit
tinyplay netkiller.wav -D 0 -d 0 -r 48000 -c 2 aiv8167sm3_bsp:/storage/emulated/0 # tinyplay zai.wav -D 0 -d 0 -r 48000 Playing sample: 1 ch, 16000 hz, 16 bit
neo@MacBook-Pro-M2 tmp % adb shell tinyplay /sdcard/zai.wav Playing sample: 1 ch, 16000 hz, 16 bit
3.5.2. 录音
录音测试
tinycap netkiller.wav -D 0 -d 0 -c 1 -r 48000
-D card 声卡 -d device 设备 -c channels 通道 -r rate 采样率 -b bits pcm 位宽 -p period_size 一次中断的帧数 -n n_periods 周期数 例子: tinycap /sdcard/test.pcm -D 0 -d 0 -c 4 -r 48000 -b 32 -p 768 -n 10 声卡0;设备0;四通道;48K采样率;32位位宽;一帧数据存储大小;采样n次
查看录音设备
neo@MacBook-Pro-M2 tmp % adb shell ls "/dev/snd/pcmC*c" /dev/snd/pcmC0D10c /dev/snd/pcmC0D1c /dev/snd/pcmC0D2c /dev/snd/pcmC0D4c /dev/snd/pcmC0D6c /dev/snd/pcmC0D8c /dev/snd/pcmC0D9c
默认录音参数 Capturing sample: 2 ch, 44100 hz, 16 bit
neo@MacBook-Pro-M2 tmp % adb shell tinycap /sdcard/file.pcm -D 0 -d 2 -T 5 Capturing sample: 2 ch, 44100 hz, 16 bit Captured 0 frames
指定参数
neo@MacBook-Pro-M2 tmp % adb pull /sdcard/file.pcm /sdcard/file.wav: 1 file pulled, 0 skipped. 14.6 MB/s