Android可以通过MediaRecorder和AudioRecord这两个工具来实现录音,MediaRecorder直接把麦克风的数据存到文件,并且能够直接进行编码(如AMR,MP3等),而AudioRecord则是读取麦克风的音频流。本文使用AudioRecord读取音频流,使用AudioTrack播放音频流,通过“边读边播放”以及增大音量的方式来实现一个简单的助听器程序。
PS:由于目前的Android模拟器还不支持AudioRecord,因此本程序需要编译之后放到真机运行。
先贴出本文程序运行截图:
PS:程序音量调节只是程序内部调节音量而已,要调到最大音量还需要手动设置系统音量。
使用AudioRecord必须要申请许可,在AndroidManifest.xml里面添加这句:
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
main.xml的源码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:layout_height="wrap_content" android:id="@+id/btnRecord" android:layout_width="fill_parent" android:text="开始边录边放"></Button> <Button android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="停止" android:id="@+id/btnStop"></Button> <Button android:layout_height="wrap_content" android:id="@+id/btnExit" android:layout_width="fill_parent" android:text="退出"></Button> <TextView android:id="@+id/TextView01" android:layout_height="wrap_content" android:text="程序音量调节" android:layout_width="fill_parent"></TextView> <SeekBar android:layout_height="wrap_content" android:id="@+id/skbVolume" android:layout_width="fill_parent"></SeekBar> </LinearLayout>
testRecord.java的源码如下:
package com.testRecord; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaRecorder; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.SeekBar; import android.widget.Toast; public class testRecord extends Activity { /** Called when the activity is first created. */ Button btnRecord, btnStop, btnExit; SeekBar skbVolume;//调节音量 boolean isRecording = false;//是否录放的标记 static final int frequency = 44100; static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; int recBufSize,playBufSize; AudioRecord audioRecord; AudioTrack audioTrack; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setTitle("助听器"); recBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); 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); //------------------------------------------ btnRecord = (Button) this.findViewById(R.id.btnRecord); btnRecord.setOnClickListener(new ClickEvent()); btnStop = (Button) this.findViewById(R.id.btnStop); btnStop.setOnClickListener(new ClickEvent()); btnExit = (Button) this.findViewById(R.id.btnExit); btnExit.setOnClickListener(new ClickEvent()); skbVolume=(SeekBar)this.findViewById(R.id.skbVolume); skbVolume.setMax(100);//音量调节的极限 skbVolume.setProgress(70);//设置seekbar的位置值 audioTrack.setStereoVolume(0.7f, 0.7f);//设置当前音量大小 skbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax()); audioTrack.setStereoVolume(vol, vol);//设置音量 } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub } }); } @Override protected void onDestroy() { super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); } class ClickEvent implements View.OnClickListener { @Override public void onClick(View v) { if (v == btnRecord) { isRecording = true; new RecordPlayThread().start();// 开一条线程边录边放 } else if (v == btnStop) { isRecording = false; } else if (v == btnExit) { isRecording = false; testRecord.this.finish(); } } } class RecordPlayThread extends Thread { public void run() { try { byte[] buffer = new byte[recBufSize]; audioRecord.startRecording();//开始录制 audioTrack.play();//开始播放 while (isRecording) { //从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) { Toast.makeText(testRecord.this, t.getMessage(), 1000); } } }; }
相关推荐
Android提高第十篇之AudioRecord实现助听器
Android提高第十篇之AudioRecord实现
本文使用AudioRecord读取音频流,使用AudioTrack播放音频流,通过“边读边播放”以及增大音量的方式来实现一个简单的助听器程序。 此处需要注意:由于目前的Android模拟器还不支持AudioRecord,因此本程序需要编译...
Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小 看代码就知道了
Android应用源码之AudioRecord_Android
android使用audioRecord和audioTrack实现语音录音播放与即时播放
本 demo主要音频的录制和播放分别使用两个AsyncTask来完成,时时录制并外放声音实现助听,时时录制存储成pcm文件,另外更复杂的一个项目实现了时时录制、时时存储pcm裸文件、时时外放声音、时时绘制曲线图,提供调节...
实现wav格式的音频录制: 开始录制: AudioUtil audio = AudioUtil.getInstance() audio.startRecord(name , int) audio.recordData(); 结束录制: audio.stoprecord(); audio.converWaveFile(name);
网上的通话录音大多数都是基于mediarecoder开发的,我最后反编译了一款apk,发现里面用的是audiorecord开发的,下面是我的核心代码展示,良心开发,不要差评谢谢
使用audioRecord实现暂停录音功能,代码耦合较低,注释全面,并使用线程池管理对性能进行优化。
Android AudioRecord Demo.zip
使用Android audioRecord录音完整Demo,最终生成wav文件。
使用AndroidRecord实现暂停录音功能,有较强的灵活性和拓展性,这是项目源码,简单明了
android audiorecord录音并绘图
Android下录音及播放录音(AudioRecord),经过测试可以运行,欢迎下载
Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。 封装好的Java代码,可同时录制PCM和WAV文件。自己定义存储位置。 Android提供了AudioRecord和MediaRecord。MediaRecord...
android AudioRecord AudioTrack实现录音并播放 并支持参数选择(频率、编码格式、声道) 更多信息可参考http://blog.sina.com.cn/u/1788464665
用AudioRecord获取音频源数据流存储后,再用AudioTrack读取存储文件,播放录音。能够录音后,即时播放。
Android应用源码之AudioRecord