android 使用 audiorecord 和 audiotrack 实现实时录音播放
2016-10-27 10:14
603 查看
基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放
//得到音频
package com.ysg.audiotest;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
/*
* To getaudio or play audio
* */
public class mAudio {
private AudioRecord audioRecord;
private Context context;
private boolean isRecording = false ;
private PipedOutputStream outstream ;//利用管道传输数据
public mAudio(Context context , PipedInputStream instream) throws IOException {
this.context = context;
//初始化管道流 用于向外传输数据
outstream = new PipedOutputStream();
outstream.connect(instream);
}
public void StartAudioData(){//得到录音数据
int frequency = 11025;
@SuppressWarnings("deprecation")
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int buffersize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding, buffersize);
byte[]buffer = new byte[buffersize];
audioRecord.startRecording();//开始录音
isRecording = true;
int bufferReadSize = 1024;
while (isRecording){
audioRecord.read(buffer, 0, bufferReadSize);
try {
outstream.write(buffer, 0, bufferReadSize);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stopRecord(){//停止录音
isRecording = false;
audioRecord.stop();
try {
outstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
播放音频
package com.ysg.audiotest;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
public class mAudioPlayer {
private PipedInputStream instream;
private boolean isPlaying ;
private AudioTrack audioplayer;
private byte[] buffer;
public mAudioPlayer() {
isPlaying = false;
instream = null;
//初始化播音类
@SuppressWarnings("deprecation")
int bufsize = AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
audioplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufsize,AudioTrack.MODE_STREAM);
}
//设置管道流,用于接受音频数据
public void setOutputStream(PipedOutputStream out) throws IOException{
instream = new PipedInputStream(out);
}
public void startPlayAudio(){ //调用之前先调用setOutputStream 函数
isPlaying = true;
audioplayer.play();//开始接受数据流播放
buffer = new byte[1024];
while (instream!=null&&isPlaying){
try {
while (instream.available()>0){
int size = instream.read(buffer);
audioplayer.write(buffer, 0
, size);//不断播放数据
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stopPlay(){//停止播放
isPlaying = false ;
try {
instream.close();
} catch (IOException e) {
e.printStackTrace();
}
audioplayer.stop();
}
}
activity
再者注意添加权限:
<uses-permission
android:name="android.permission.RECORD_AUDIO"
/>
//得到音频
package com.ysg.audiotest;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
/*
* To getaudio or play audio
* */
public class mAudio {
private AudioRecord audioRecord;
private Context context;
private boolean isRecording = false ;
private PipedOutputStream outstream ;//利用管道传输数据
public mAudio(Context context , PipedInputStream instream) throws IOException {
this.context = context;
//初始化管道流 用于向外传输数据
outstream = new PipedOutputStream();
outstream.connect(instream);
}
public void StartAudioData(){//得到录音数据
int frequency = 11025;
@SuppressWarnings("deprecation")
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int buffersize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding, buffersize);
byte[]buffer = new byte[buffersize];
audioRecord.startRecording();//开始录音
isRecording = true;
int bufferReadSize = 1024;
while (isRecording){
audioRecord.read(buffer, 0, bufferReadSize);
try {
outstream.write(buffer, 0, bufferReadSize);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stopRecord(){//停止录音
isRecording = false;
audioRecord.stop();
try {
outstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
播放音频
package com.ysg.audiotest;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
public class mAudioPlayer {
private PipedInputStream instream;
private boolean isPlaying ;
private AudioTrack audioplayer;
private byte[] buffer;
public mAudioPlayer() {
isPlaying = false;
instream = null;
//初始化播音类
@SuppressWarnings("deprecation")
int bufsize = AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
audioplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufsize,AudioTrack.MODE_STREAM);
}
//设置管道流,用于接受音频数据
public void setOutputStream(PipedOutputStream out) throws IOException{
instream = new PipedInputStream(out);
}
public void startPlayAudio(){ //调用之前先调用setOutputStream 函数
isPlaying = true;
audioplayer.play();//开始接受数据流播放
buffer = new byte[1024];
while (instream!=null&&isPlaying){
try {
while (instream.available()>0){
int size = instream.read(buffer);
audioplayer.write(buffer, 0
, size);//不断播放数据
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stopPlay(){//停止播放
isPlaying = false ;
try {
instream.close();
} catch (IOException e) {
e.printStackTrace();
}
audioplayer.stop();
}
}
activity
package com.ysg.audiotest; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import android.app.Activity; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { PipedInputStream in; boolean isRrcord; mAudio mm ; mAudioPlayer m; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); isRrcord = false; } public void btnclick(View v){ if (isRrcord){ isRrcord = false; mm.stopRecord(); m.stopPlay(); }else{ isRrcord = true; startRecord(); } } private void startRecord(){ in = new PipedInputStream(); new Thread(new Runnable() { @Override public void run() { try { mm = new mAudio(MainActivity.this, in); mm.StartAudioData(); } catch (IOException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { byte[] buffer = new byte[1024]; PipedOutputStream pout = new PipedOutputStream(); m = new mAudioPlayer(); try { m.setOutputStream(pout); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub m.startPlayAudio(); } }).start(); } catch (IOException e1) { e1.printStackTrace(); } int size = 0 ; try { while (true){ while (in.available()>0){ size = in.read(buffer); pout.write(buffer, 0, size); } } } catch (IOException e) { e.printStackTrace(); } } }).start(); } }
再者注意添加权限:
<uses-permission
android:name="android.permission.RECORD_AUDIO"
/>
相关文章推荐
- 使用AudioRecord和 AudioTrack实现录音并播放
- Android两种录音方式MediaRecorder和AudioRecord实现了实时获取音量大小
- JNI在Android开发中的应用之--用AudioRecord录音,用AudioTrack播放声音.
- Android使用MediaRecorder实现录音及播放
- [置顶] Android使用MediaRecorder实现录音及播放
- Android使用AudioRecord实现暂停录音功能实例代码
- JNI在Android开发中的应用之--用AudioRecord录音,用AudioTrack播放声音.
- Android 实时录音和回放,边录音边播放 (KTV回音效果)
- [置顶] Android--实现自制录音/播放录音程序
- Android 实时录音和回放,边录音边播放 (KTV回音效果)
- vlc-android 中调用用libvlcjni.so实现流媒体播放,自己使用libvlcjni.so
- Android录音及播放功能实现
- android:使用audiotrack 类播放wav文件
- 使用AudioRecord和AudioTrack来录制和播放音频
- Android 实时录音和回放,边录音边播放 (KTV回音效果)
- Android运用AIDL技术实现实时更新MP3播放器的播放进度
- Android开发学习之录音同步播放的实现
- Android下使用SoundTouch实现变声并转为wav格式播放(山寨汤姆猫)
- Qt + SDL实现的实时录音并播放的程序,类似KTV唱歌
- Android 使用AudioRecord 录音只有噪音