android MediaRecorder start failed:-38

安卓开发 专栏收录该内容
17 篇文章 0 订阅

最近在学习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;
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;

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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值