android MediaRecorder start failed(-38)

归志宁无五亩园,读书本意在元元。这篇文章主要讲述android MediaRecorder start failed:-38相关的知识,希望能为你提供帮助。
本文转载自: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
【android MediaRecorder start failed(-38)】记得释放底层资源~否则会导致其它APP无法得到底层的录音资源,从而无法录音,导致运行时异常。

    推荐阅读