pcm文件不能直接使用MediaPlayer进行播放,  因为mediaplayer不支持这种格式的音频文件, 

我们可以使用AudioTrack对录到的pcm文件进行播放, 使用AudioTrack的步骤如下:

1.获取一个合适的缓存区

int bufferSize = AudioTrack.getMinBufferSize(16000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

第一个参数是采样率这里我是用的是16000(另外还有8000等格式), 第二个参数是单声道还是多声道(这里我用的是单声道), 第三个表示录音数据的格式这里用的是PCM_16BIT

2.创建一个AudioTrack对象

 audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);

3.调用play()方法, 并向audiotrack里写入录音数据:

try {audioTrack.play();fis = new FileInputStream(path);byte[] buffer = new byte[bufferSize];int len = 0;isPlaying = true;while ((len = fis.read(buffer)) != -1 && !isStop) {//                    Log.d(TAG, "playPCMRecord: len " + len);audioTrack.write(buffer, 0, len);}} catch (Exception e) {Log.e(TAG, "playPCMRecord: e : " + e);}

来看一个完整的写法:

private Runnable playPCMRecord = new Runnable() {        @Override        public void run() {            int bufferSize = AudioTrack.getMinBufferSize(16000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);            audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);            FileInputStream fis = null;            try {                audioTrack.play();                fis = new FileInputStream(path);                byte[] buffer = new byte[bufferSize];                int len = 0;                isPlaying = true;                while ((len = fis.read(buffer)) != -1 && !isStop) {//                    Log.d(TAG, "playPCMRecord: len " + len);                    audioTrack.write(buffer, 0, len);                }            } catch (Exception e) {                Log.e(TAG, "playPCMRecord: e : " + e);            } finally {                isPlaying = false;                isStop = false;                if (audioTrack != null) {                    audioTrack.stop();                    audioTrack = null;                }                if (fis != null) {                    try {                        fis.close();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }    };

 

更多相关文章

  1. Android(安卓)API 中文 (51) —— ZoomButtonsController
  2. Android(安卓)中传递 json 的问题
  3. Android(安卓)Post请求SQL数据库
  4. [android]android自动化测试三之设定AVD各项参数
  5. [置顶] S5PV210 Android(安卓)fimc驱动分析 - fimc_regs.c
  6. Android之旅十三 android中的数据传递方法
  7. 录音权限(Android(安卓)8.0)
  8. Android开发——SQLite数据库(二)android studio创建数据库,进行插
  9. Flutter String格式化

随机推荐

  1. insert select与select into 的用法使用
  2. sqlserver not in 语句使程充崩溃
  3. 解决SQL Server的“此数据库没有有效所有
  4. SQL建立数据库及删除数据库命令
  5. SQLServer 全文检索(full-text)语法
  6. sqlserver isnull在数据库查询中的应用
  7. SQL 比较一个集合是否在另一个集合里存在
  8. 动态给表添加删除字段并同时修改它的插入
  9. SQL对时间处理的语句小结
  10. sqlserver 数据库学习笔记