android mic切换_android 实时麦克风变化 | 学步园

该博客介绍了如何在Android中使用MediaRecorder类进行实时麦克风控制,包括设置麦克风源、输出格式、音频编码,以及开始和停止录音。同时,还展示了如何通过获取最大振幅更新话筒状态,并根据分贝值改变UI反馈。
摘要由CSDN通过智能技术生成



package com.coolsoft.app.oklight;

import java.io.File;

import java.io.IOException;

import android.media.MediaRecorder;

import android.os.Handler;

import android.util.Log;

import android.widget.ImageView;

/**

* amr音频处理

*

* @author hongfa.yy

* @version 创建时间2012-11-21 下午4:33:28

*/

public class RecordManager {

private final String TAG = "RecordManager";

private MediaRecorder mMediaRecorder;

public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;

private File file;

public RecordManager(File file,ImageView view) {

this.file = file;

this.view=view;

}

public RecordManager(File file) {

this.file = file;

}

private long startTime;

private long endTime;

/**

* 开始录音 使用amr格式

*

* @param mRecAudioFile

* 录音文件

* @return

*/

public void startRecord() {

// 开始录音

/* ①Initial:实例化MediaRecorder对象 */

if (mMediaRecorder == null)

mMediaRecorder = new MediaRecorder();

try {

/* ②setAudioSource/setVedioSource */

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风

/*

* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式

* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)

*/

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);

/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

/* ③准备 */

mMediaRecorder.setOutputFile(file.getAbsolutePath());

mMediaRecorder.setMaxDuration(MAX_LENGTH);

mMediaRecorder.prepare();

/* ④开始 */

mMediaRecorder.start();

// AudioRecord audioRecord.

/* 获取开始时间* */

startTime = System.currentTimeMillis();

// pre=mMediaRecorder.getMaxAmplitude();

updateMicStatus();

Log.i("ACTION_START", "startTime" + startTime);

} catch (IllegalStateException e) {

Log.i(TAG,

"call startAmr(File mRecAudioFile) failed!"

+ e.getMessage());

} catch (IOException e) {

Log.i(TAG,

"call startAmr(File mRecAudioFile) failed!"

+ e.getMessage());

}

}

/**

* 停止录音

*

* @param mMediaRecorder

*/

public long stopRecord() {

if (mMediaRecorder == null)

return 0L;

endTime = System.currentTimeMillis();

Log.i("ACTION_END", "endTime" + endTime);

mMediaRecorder.stop();

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder = null;

Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));

return endTime - startTime;

}

private final Handler mHandler = new Handler();

private Runnable mUpdateMicStatusTimer = new Runnable() {

public void run() {

updateMicStatus();

}

};

/**

* 更新话筒状态 分贝是也就是相对响度 分贝的计算公式K=20lg(Vo/Vi) Vo当前振幅值 Vi基准值为600:我是怎么制定基准值的呢? 当20

* * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的时候vi就是我所需要的基准值

* 当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。

* Log.i("mic_", "麦克风的基准值:" + mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话

*/

private int BASE = 600;

private int SPACE = 200;// 间隔取样时间

private ImageView view;

private void updateMicStatus() {

if (mMediaRecorder != null && view != null) {

// int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768;

int ratio = mMediaRecorder.getMaxAmplitude() / BASE;

int db = 0;// 分贝

if (ratio > 1)

db = (int) (20 * Math.log10(ratio));

System.out.println("分贝值:"+db+" "+Math.log10(ratio));

switch (db / 4) {

case 0:

view.setImageBitmap(null);

break;

case 1:

view.setImageResource(R.drawable.logo64);

break;

case 2:

view.setImageResource(R.drawable.logo96);

break;

case 3:

view.setImageResource(R.drawable.logo124);

break;

case 4:

view.setImageResource(R.drawable.logo135);

break;

case 5:

view.setImageResource(R.drawable.logo512);

break;

default:

view.setImageResource(R.drawable.ic_launcher);

break;

}

mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);

/*

* if (db > 1) { vuSize = (int) (20 * Math.log10(db)); Log.i("mic_",

* "麦克风的音量的大小:" + vuSize); } else Log.i("mic_", "麦克风的音量的大小:" + 0);

*/

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 上,要切换使用主麦克风(Primary Mic)或副麦克风(Secondary Mic)进行录音,你需要使用 AudioRecord 类和 AudioManager 类来实现。下面是一些示例代码片段,展示如何切换使用不同的麦克风进行录音: 1. 使用主麦克风录音: ```java int audioSource = MediaRecorder.AudioSource.MIC; // 使用主麦克风 int sampleRate = 44100; // 采样率(可以根据需要进行调整) int channelConfig = AudioFormat.CHANNEL_IN_MONO; // 单声道录音 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 16位PCM编码 int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); AudioRecord audioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize); ``` 2. 使用副麦克风录音: ```java AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); audioManager.setMicrophoneDirection(AudioDeviceInfo.MIC_DIRECTION_SECONDARY); // 设置录音为副麦克风 int audioSource = MediaRecorder.AudioSource.UNPROCESSED; // 使用未处理的音频源,以便支持副麦克风 int sampleRate = 44100; // 采样率(可以根据需要进行调整) int channelConfig = AudioFormat.CHANNEL_IN_MONO; // 单声道录音 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 16位PCM编码 int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); AudioRecord audioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize); ``` 在上述示例中,我们使用 `MediaRecorder.AudioSource.MIC` 和 `MediaRecorder.AudioSource.UNPROCESSED` 来分别选择主麦克风和副麦克风作为音频源。同时,我们还使用了 `AudioManager` 类的 `setMicrophoneDirection()` 方法来设置录音为副麦克风。 请注意,具体可用的麦克风和设置可能因设备的硬件和驱动程序而有所不同。因此,在实际应用中,你可能需要进行适配和测试以确保兼容性和正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值