本文转载自:http://blog.csdn.net/fnuwfnh/article/details/46698509

最近在学习android 录音方面的知识,发现在部分手机正常运行的APP,在华为平板上挂了,eclipse的Logcat显示MediaRecorder start failed:-38。查了下资料,原因是我的APP在编码时使用了多路录音,而调试用的华为平板在硬件上只能单路录音,不支持多路录音。目前mtk的75,15,77,17平台硬件上只支持单路录音,不支持多路录音,后续89平台在这块已经做了改进,多路录音需要硬件支持,后续更高阶的平台是可以支持多路录音的。PDXXXX是mtk77平台,硬件上只支持单路录音,不支持多路录音。

解决的办法就是优化代码,看能不能从代码上调整为单路录音了。 
以下是我APP中两处用到MIC SOURCE之处,分别用来实现边录音边播放以及保存录音文件。在支持多路录音的手机上正常运行,而在不支持多路录音的平台上,通过改代码,测试发现要么只能边录音边播放,要么只能保存录音文件。要想保存录音文件,必须得在start前(需要一段时间延迟)释放边录音边播放占用的MIC SOURCE。

AudioRecord audioRecord2 = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,
channelConfiguration, audioEncoding, recBufSize); AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
channelConfiguration, audioEncoding,
playBufSize, AudioTrack.MODE_STREAM);
new RecordPlayThread().start(); class RecordPlayThread extends Thread {
public void run() {
try {
byte[] buffer = new byte[recBufSize2];
audioRecord2.startRecording();//开始录制
audioTrack.play();//开始播放 while (isRecording) {
//从MIC保存数据到缓冲区
int bufferReadResult = audioRecord2.read(buffer, 0, recBufSize2);
byte[] tmpBuf = new byte[bufferReadResult];
System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult);
//写入数据即播放
for (int i=0; i<buffer.length; i++){
tmpBuf[i] = (byte) (tmpBuf[i]*2);
}
audioTrack.write(tmpBuf, 0, tmpBuf.length);
}
audioTrack.stop();
audioTrack.release();
audioTrack = null;
audioRecord2.stop();
audioRecord2.release();
audioRecord2 = null;
} catch (Throwable t) {
Toast.makeText(testOscilloscope.this, t.getMessage(), 1000);
}
}
}
//释放底层资源
//mRecorder.stop();
//mRecorder.release();
//mRecorder = null;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
MediaRecorder mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setOutputFile(Second_Path+date+".amr");
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
//释放底层资源
//mRecorder.stop();
//mRecorder.release();
//mRecorder = null;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

记得释放底层资源~否则会导致其它APP无法得到底层的录音资源,从而无法录音,导致运行时异常。

android MediaRecorder start failed:-38【转】的更多相关文章

  1. Android: MediaRecorder start failed

    在某些机型上,MediaRecorder在调用start方法时,会出现start failed的错误,有一种可能是setVideoFrameRate导致的.要解决这个问题,只需要注释掉这条语句就可以了 ...

  2. I.MX6 Android iperf3 porting failed

    /***************************************************************************** * I.MX6 Android iperf ...

  3. Android resource compilation failed

    报错:Android resource compilation failed D:\android\EasySports\app\build\intermediates\incremental\mer ...

  4. Android MediaRecorder解析

    源码路径:frameworks/base/media/java/android/media/MediaRecorder.javaframeworks/base/media/jni/android_me ...

  5. org.jetbrains.android.uipreview.RenderingException: Failed to load the LayoutLib: com/android/layoutlib/bridge/Bridge : Unsupported major.minor version 52.0

    在Android Studio使用的时候,突然发现Preview功能不能用了,报了一个错,错误如下 org.jetbrains.android.uipreview.RenderingException ...

  6. Android MediaRecorder自定义分辨率

    Android MediaRecorder自定义分辨率 工作这么久了,确实积累了不少东西,但都是以文档的形式存在U盘里的,为什么不写博客呢?因为懒啊!!!总感觉博客太难写了(大概是上学时候写作文恐惧症 ...

  7. Android Studio:Failed to resolve ***

    更换电脑后,也更新了所有的SDK的tool,仍然报错:Failed to resolve  各种jar包,出现这种问题主要是因为在Android studio中默认不允许在线更新,修改方法如下:

  8. Android Studio Problem : failed to find style 'textviewstyle' in current theme 解决方法

    新建一个空白的MainActivity时Preview就出现一个错误: failed to find style 'textviewstyle' in current theme 开始在国内的博客平台 ...

  9. Android MediaRecorder录制音频

    今天介绍一下在Android中怎么录制音频,在Android中使用MediaRecorder来录制音频,步骤: 1.创建MediaRecorder对象. 2.调用MediaRecorder对象的set ...

随机推荐

  1. Java核心技术卷1 第三章

    1. Java区分大小写,下一段源代码中,关键字public称为访问修饰符,用于控制程序的其他部分对于这段代码的访问级别,关键字class表明Java程序中的全部内容都包含在类里面. 标准的类名命名规 ...

  2. 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)

    议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...

  3. Mongo索引学习笔记

    索引使用场景 优:加快查询速度 劣:增删改会产生额外的开销.占用空间 tips: 返回集合中一半以上的数据,全表扫描的效率高 索引基础 基础操作 查看索引:db.test.getIndexes() 创 ...

  4. ExecutorService 线程池 (转发)

    1.ExecutorService java.util.concurrent.ExecutorService 接口.用来设置线程池并执行多线程任务.它有以下几个方法. Future<?> ...

  5. angular2集成highchart

    集成highchart的配置困扰了我很久,今天终于解决了: 1.修改tsconfig.app.json: "compilerOptions": { //... "type ...

  6. BNUOJ 6023 畅通工程续

    畅通工程续 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 1874 ...

  7. Linux下汇编语言学习笔记6 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. JDBC的流数据

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/streaming-data.html: PreparedStatement对象必须具备使用输入和输出流 ...

  9. ETL全量单表同步简述

    ETL全量单表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 注意点: 1.数据库合并时,选择正确的数据源 ...

  10. Mybatis 增强工具包 Mybatis-Plus

    原文:https://www.oschina.net/p/mybatis-plus