• 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无法得到底层的录音资源,从而无法录音,导致运行时异常。

  • 相关阅读:
    Java 中的四种引用
    vue 移动端的开发
    使用java语言实现一个动态数组(详解)(数据结构)
    深度长文回顾web基础组件
    告诉你如何回答"线上CPU100%排查"面试问题
    超实用的mysql分库分表策略,轻松解决亿级数据问题
    【源码解析】凭什么?spring boot 一个 jar 就能开发 web 项目
    java中的守护线程
    Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
    spring-data-redis-cache 使用及源码走读
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7783250.html
Copyright © 2020-2023  润新知