基本思路就是用 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

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;@Overrideprotected 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() {@Overridepublic void run() {try {mm = new mAudio(MainActivity.this, in);mm.StartAudioData();} catch (IOException e) {e.printStackTrace();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {byte[] buffer = new byte[1024];PipedOutputStream pout = new PipedOutputStream();m = new mAudioPlayer();try {m.setOutputStream(pout);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubm.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"
   />

android 使用 audiorecord 和 audiotrack 实现实时录音播放相关推荐

  1. android 实时录音播放,android 使用 audiorecord 和 audiotrack 实现实时录音播放

    基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放 //得到音频 package com.ysg.audiotest; import java.io.IOExc ...

  2. android audiotrack权限,android 使用 audiorecord 和 audiotrack 实现实时录音播放

    基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放 //得到音频 package com.ysg.audiotest; import java.io.IOExc ...

  3. android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意

    AudioRecord需要至少 这项录音权限.有时候在AndroidManifest.xml中加进去后,有些手机系统仍然没有授予该权限.需要到手机的设置中的权限管理,把这项权限打开.没权限就会闪退.如 ...

  4. Android录音AudioRecord,AudioTrack学习

    音频相关知识讲解了音频相关的基础知识,然后说明了Android中对音频的处理用到的类,接下来将开始讲解利用AudioRecord进行音频录制,和利用AudioTrack对录制的PCM格式文件进行播放. ...

  5. Android开发之PCM录音实时播放的实现方法 | 边录音边播放 |PCM录音播放无延迟 | 录音无杂音 | 录音无噪音

    先说下录音得开启录音权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 然后录音 ...

  6. Android 实时录音和回放,边录音边播放 (KTV回音效果)

    原文地址为: Android 实时录音和回放,边录音边播放 (KTV回音效果) 上一篇介绍了如何使用Mediarecorder来录音,以及播放录音.不过并没有达到我的目的,一边录音一边播放.今天就讲解 ...

  7. Android 使用AudioRecord录音相关和音频文件的封装

    在Android中录音可以用MediaRecord录音,操作比较简单.但是不够专业,就是不能对音频进行处理.如果要进行音频的实时的处理或者音频的一些封装 就可以用AudioRecord来进行录音了. ...

  8. Android功能记录(三) ------ 使用AudioRecord和AudioTrack边录边播(降噪)

    2018.8.30补充请求录音权限参考:https://blog.csdn.net/jdfkldjlkjdl/article/details/54618739 参考: http://www.cnblo ...

  9. [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

    参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...

最新文章

  1. 传智播客java基础的习题_传智播客java基础班(集合与IO)阶段测试题
  2. 中电信抢滩云计算 在上海开建“信息银行”
  3. python项目NoReverseMatch: Reverse for ‘topic‘ with arguments ‘(‘‘,)‘ not found解决方法
  4. 从内存中加载并启动一个exe
  5. Asp.Net Mvc表单提交之List集合
  6. 2019C语言程序设计大赛,2019年全国高校计算机能力挑战赛 C语言程序设计决赛
  7. 图表graph之增加曲线
  8. Go语言反射之反射调用
  9. gson 不忽略空_仅在不为null或不为空的情况下,Gson序列化字段
  10. Docker使用小结(四)发布镜像
  11. 易飞ERP系统平台故障
  12. 计算机课堂小游戏活跃气氛,活跃气氛的70个小游戏 比较嗨的暖场游戏
  13. Supercell:靠两款手游如何做到30亿美金市值?
  14. 读取Java源文件中字段的注释当做Swagger的字段描述
  15. html仿360首页动画效果图,仿360影视网站模板html源码
  16. 基于奇异值分解的图像压缩和信息隐藏
  17. 用Python分析了5万条相亲网站数据,看相亲男女画像
  18. 数仓 即席查询 之 Persto
  19. python读取.data文件总结
  20. 浏览器配置异常_IE浏览器常见故障及问题解决方法大全

热门文章

  1. vns可变领域_技师可变工程师!
  2. android build.time,Android SDK中的恒定Build.TIME
  3. delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用
  4. 推荐一款高引超6000次的全基因组/全外显子组变异注释工具
  5. 机器学习第18篇 - Boruta特征变量筛选(2)
  6. 实际返回的行数超出请求的行数怎么解决_count(*)这么慢,我该怎么办?
  7. 少儿编程:C++绘图相关书籍篇
  8. 1360:奇怪的电梯(lift) 《信息学奥赛一本通》
  9. mysql 安装gbk字符_mysql安装后添加gbk字符集的方法
  10. php图片上传不现实路径指向错误,上传图片提示这个错误怎么办?