最近看到一篇关于音频的文章,忽然想起以前有个中国传媒大学的一位朋友,要我帮她设计一个可以实时播放输入音频的程序,我当时想到了要用DirectSound,可是对于这种从来没有碰过的东西,我内心是多少有些恐惧的,而且是用C#这样的语言来写这种相对来说比较底层的东西,所以这件事情最后就不了了之了,好在后来这位朋友顺利地完成了毕设。此时此刻,在Android上再次碰到这个问题,我就抱着试试看的决心,来学一学吧。主要代码如下:

package com.android.record2play;import java.util.LinkedList;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.app.Activity;
import android.view.Menu;
import android.widget.Toast;public class MainActivity extends Activity {//写入缓冲区大小private int m_Record_Size;//音频录制对象private AudioRecord mAudioRecord;//音频写入存储字节数组private byte[] m_Input_Bytes;//播放缓冲区大小private int m_Play_Size;//音频播放对象private AudioTrack mAudioTrack;//主线程private Thread Record2Play_Thread;//标志变量private boolean IsRecording=true;@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取用于录制的最小写入缓存区大小m_Record_Size=AudioRecord.getMinBufferSize(44100,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT);//获取音频录制对象mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT, m_Record_Size);//获取用于播放的最小播放缓冲区大小m_Play_Size = AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT);// 实例化播放音频对象mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT, m_Play_Size,AudioTrack.MODE_STREAM);//初始化数组m_Input_Bytes = new byte[m_Record_Size];Record2Play_Thread=new Thread(new Record2Play());Record2Play_Thread.start();}class Record2Play implements Runnable{@Overridepublic void run() {try{byte[] mBytes;// 开始录音mAudioRecord.startRecording();mAudioTrack.play();while (IsRecording){int BytesSize=mAudioRecord.read(m_Input_Bytes, 0, m_Record_Size);mBytes=new byte[BytesSize];mBytes=m_Input_Bytes.clone();mAudioTrack.write(mBytes, 0, mBytes.length);}mAudioRecord.stop();mAudioTrack.stop();}catch(Exception e){Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();}}}}

这个和以前的基本思路是一样的,首先通过录音我们获取一个音频流写入缓冲区,然后再从缓冲区里取出来,交给播放设备去播放,可是我怎么感觉在Android这么简单呢?这个程序要想真正投入使用,需要解决的问题有:

1、录音降噪的问题

2、回音消除的问题

3、系统执行的问题

Android开发学习之录音同步播放的实现相关推荐

  1. 一个基于Android开发的简单的音乐播放器

    一个基于Android开发的简单的音乐播放器 记得当时老师让我们写因为播放器时,脑子一头雾水,网上杂七杂八的资料也很少有用,因此索性就自己写一篇,希望对有缘人有用. 因为有好多人问我要源码,所以附上g ...

  2. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  3. 《Android Studio应用开发实战详解》——第1章,第1.5节Android开发学习路线图

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.5节Android开发学习路线图,作者 王翠萍,更多章节内容可以访问云栖社区"异步社区& ...

  4. Android开发----lrc歌词的同步展示

    Android开发--lrc歌词的同步展示 别的不说,先上图,看效果 LrcFragment.java代码如下: package com.android.administrator.happymusi ...

  5. 【嵌入式Android开发学习攻略】手把手教你循序渐进的学习

    [嵌入式Android开发学习攻略]手把手教你循序渐进的学习 学习嵌入式主要有以下几个方面: C语言:C是必须学的,它是最基础的 操作系统:Linux.Android   目前Linux是主流,这个一 ...

  6. Android开发学习之以CameraAPI方式实现相机功能(一)——快速实现相机

    今天无意当中发现在<Android开发学习之基于ZBar实现微信扫一扫>中的一部分代码可以用来以硬件方式实现一个照相机的功能,在<Android开发学习之调用系统相机完成拍照的实现& ...

  7. android培训内容明细,记录Android开发学习

    记录Android开发学习 Menu菜单学习 1.掌握Android中菜单的创建. 2.掌握Intent信使组件. 创建菜单Menu 我们模仿微信菜单栏学习,创建一个于微信菜单栏相似的菜单 那么我们应 ...

  8. android开发学习之路——连连看之游戏逻辑(五)

    GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖, ...

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

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

最新文章

  1. SilverLight 4页面跳转大全
  2. ECLIPSE 插件使用LINKS目录的用法
  3. 40个亿非负整数中找到未出现的数
  4. PostgreSQL字符串截取替换
  5. 让数组的左边全为奇数C语言,2015年全国计算机等级考试全真模拟考场_二级C语言试卷四.docx...
  6. day5-xml模块
  7. C++ exit 与 return 浅析
  8. ABP vNext微服务架构详细教程——结束语
  9. python判断奇数_python 中x%2 x1 判断偶数奇数 性能对比
  10. linux技能点七 shell
  11. html插入精灵,帮助插入超链接到CSS精灵代码..Java? HTML?
  12. hadoop的作业提交过程之yarn
  13. 企鹅智库《2019-2020中国互联网趋势报告》
  14. win8 桌面显示计算机图标不见了怎么办,win8开始屏幕桌面图标不见了怎么办
  15. Choerodon猪齿鱼1.0先行版已发布!
  16. Hadoop去掉格,换行符,制表符,回车符,换页符【好吧,其实用正则表达式一下子就搞定了】
  17. NPN和PNP三极管收录笔记
  18. 微信打开网址添加在浏览器中打开提示
  19. Android 头像选择(拍照、相册裁剪),含7.0的坑
  20. 云主机和物理机有什么区别?

热门文章

  1. Android Studio中R报错(cnanot resolve symbol R)
  2. UNIX/Linux系统取证之信息采集案例
  3. CentOS7-Python系列】之一【python-devel教训】
  4. MyEclipse10 离线图文安装SVN插件教程
  5. “父亲项目”走进澳洲校园 助父子建立联系
  6. 国产手机的安全漏洞或比勒索病毒还可怕?
  7. 关于python中的字符串编码理解
  8. springMVC4(14)各类视图输出实例分析
  9. PL/SQL编程1-基础
  10. System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部