Android音频录制与播放
2015-04-11 23:57
381 查看
下面的例子演示了用AudioRecord录音和AudioTrack播放的原理
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
public class MainActivity extends Activity { private final static String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v){ switch(v.getId()){ case R.id.btn_startRecord: isRecording = true; new Thread(){ public void run() { testAudioRecord(); }; }.start(); break; case R.id.btn_stopRecord: isRecording = false; break; case R.id.btn_play: new Thread(){ public void run() { testAudioTrack(); }; }.start(); } } //给主线程发消息用 private Handler mHandler = new Handler(); private boolean isRecording = false; //用AudioRecord来录音 private void testAudioRecord(){ int frequency = 11025; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm"); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } OutputStream os; try { os = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(os); DataOutputStream dos = new DataOutputStream(bos); int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); short[] buffer = new short[bufferSize]; AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize); audioRecord.startRecording(); mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "开始录音", Toast.LENGTH_SHORT).show(); } }); int len = -1; while(isRecording){ len = audioRecord.read(buffer, 0, bufferSize); Log.d(TAG, "read-"+bufferSize+"-"+len); for(int i=0;i<len;i++){ dos.writeShort(buffer[i]); } } audioRecord.stop(); mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "停止录音", Toast.LENGTH_SHORT).show(); } }); dos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //用AudioTrack来播放音频文件 private void testAudioTrack(){ int frequency = 11025; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm"); int audioLength = (int) (file.length()/2); short[] audio = new short[audioLength]; try { InputStream is = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(is); DataInputStream dis = new DataInputStream(bis); int i = 0; while(dis.available()>0){ audio[i] = dis.readShort(); i++; } dis.close(); AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, audioLength, AudioTrack.MODE_STREAM); audioTrack.play(); mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "开始播放", Toast.LENGTH_SHORT).show(); } }); audioTrack.write(audio, 0, audioLength); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:id="@+id/btn_startRecord" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="开始录音"/> <Button android:id="@+id/btn_stopRecord" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="停止录音"/> <Button android:id="@+id/btn_play" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="play"/> </LinearLayout>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
相关文章推荐
- iOS AVAudioPlayer播放不了android录制的音频
- Android播放器MediaPlayer与MediaRecorder:录制音频并播放
- Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
- Android播放器MediaPlayer与MediaRecorder:录制音频并播放
- 木瓜妮子多媒体开发教程---第五天---Android下音频录制和播放
- Android录制声音文件(音频)并播放
- 简单MVP实现Android录制/播放.pcm音频
- android 如何播放IOS设备录制的AAC音频文件
- Android 多媒体——音频播放录制、视频播放、相机
- Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
- Android的音频录制与播放
- Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放
- android如何播放和录制音频
- Android多媒体——(MidiaRecorder音频录制/视频播放surface/Soundpool提示音/调用系统摄像头camera)
- Android开发 音频的录制(MediaRecorder)与播放(MediaPlayer)踩坑记录
- Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
- Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
- Android MP3录制,波形显示,音频权限兼容与播放
- Android 音频录制和播放问题
- Android MP3录制,波形显示,音频权限兼容与播放