电子麦克风实现——Audio系统的使用

这里直接使用的是android自身的东西,我只是拿来用的,大家要是有兴趣的话可以搜搜“Audio系统”,网上有好多文章都写的很好,可以参考,这里我写的是一个麦克风,我记得有个应用好像就是拿手机当麦克唱歌的,应用忘了叫什么了,现在我就实现一下麦克这个功能吧,废话不多说了,直接上代码。

这里我用线程来管理这个麦克,线程还用单例来实现,全局使用一个麦克,省得你弄很多个,弄出异常来不说,还弄出好几个声音来。

public class MicrophoneThread extends Thread {
	// 麦克风的开关标记
	private boolean isMicrophoneRecording = false;
	// 需要用到的参数
	static final int frequency = 44100;
	// channelConfiguration = AudioFormat.CHANNEL_IN_MONO
	static final int channelConfiguration = 0x00000002;
	static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
	// 定义录放音缓冲区大小
	private int recBufSize, playBufSize;
	// 实例化录音对象
	private AudioRecord audioRecord;
	// 实例化播放对象
	private AudioTrack audioTrack;
	// MicrophoneThread实例对象
	private static MicrophoneThread microphoneThread = null;

	private MicrophoneThread() {
		// 调用getMinBufferSize方法获得录音的最小缓冲空间
		recBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
		// 调用getMinBufferSize方法获得放音最小的缓冲区大小
		playBufSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
		// 调用构造函数实例化录音对象
		audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, recBufSize);
		// 调用构造函数实例化放音对象
		audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, playBufSize, AudioTrack.MODE_STREAM);
	}

	public static MicrophoneThread getInstance() {
		if (null == microphoneThread) {
			microphoneThread = new MicrophoneThread();
		}
		return microphoneThread;
	}

	// 线程体实现麦克风的主要代码
	public void run() {
		try {
			byte[] buffer = new byte[recBufSize];
			audioRecord.startRecording();// 开始录制
			audioTrack.play();// 开始播放
			this.isMicrophoneRecording = true;
			while (isMicrophoneRecording) {
				// 从MIC保存数据到缓冲区
				int bufferReadResult = audioRecord.read(buffer, 0, recBufSize);
				byte[] tmpBuf = new byte[bufferReadResult];
				System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult);
				// 写入数据就播放
				audioTrack.write(tmpBuf, 0, tmpBuf.length);
			}
			audioTrack.stop();
			audioRecord.stop();
		} catch (Throwable t) {
		}
	}

	// 停止麦克风的方法
	public void stopMicrophone() {
		this.isMicrophoneRecording = false;
		MicrophoneThread.microphoneThread = null;
	}

	// 开启麦克风的方法,如果麦克已经开启则不处理
	public void startMicrophone() {
		if (!isMicrophoneRecording) {
			this.start();
		}
	}
}

这样在每次使用之前先获取实例,建议使用自己的启动和停止麦克的方法来设置麦克风,最后的运行效果我就不上图了,其实也没有什么,两个按钮来控制开关,挺丑的,主代码也全在上边了,要是大家想支持我一下就下载一下文件,还是0分共享,谢谢!

发布了才想起来,还有很很重要的一个,要使用权限:

   <uses-permission android:name="android.permission.RECORD_AUDIO" />

OK,这次真心没有了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值