Android 录音/切换麦克风

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

netkiller-BG7NYT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值