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

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

原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7783250.html