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

时间: 2024-10-10 19:22:57

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

Android: MediaRecorder start failed

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

Android MediaRecorder

MediaRecorder recorder; Camera camera; SurfaceView preview; SurfaceHolder holder; boolean isRecording = false; String TAG = "Evolution Camera"; int frameRate = 30; public static final int MEDIA_TYPE_IMAGE = 1; public static final int MEDIA_TYPE_

android MediaRecorder录制音频

使用MediaRecorder录制音频步骤: 创建MediaRecorder对象 调用MediaRecorder的setAudioSource()方法设置声音来源,一般传入MediaRecorder.AudioSource.MIC参数指定录制来自麦克风的声音 调用MediaRecorder对象的setOutputFormat()设置所录制的音频 文件的格式 调用MediaRecorder对象的setAudioEncoder() ,setAudioEncodingBitRate(int bitRa

关于android SDK安装Failed to fetch URL 一点思考

最近SDK出问题了,然后在google下载了一个android-sdk-windows.rar,然后点击SDK Manager,结果一直不能刷新API Level,然后就开始在网上找了好多资料,解决这个问题,修改 HOSTS,    HTTP  和  HTTPS  都不能解决,这给我带来了很大的困惑!   加载不出来的界面错误为: Fetching http://dl-ssl.google.com/android/repository/addons_list-1.xml Failed to fe

关于android SDK安装Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml出错二

近日,因为某些原因,大家在使用Android SDK升级的时候,出现了访问Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml 的情况.按照我之前给大家提供的方案:详细 已经没办法继续使用了,这个时候,别慌. 其实当你看到这篇文章的时候,https://www.google.com.hk是已经访问不了了.具体原因,不便解释,你只要明白443端口已经over了. 好了,我现在很正经的说说怎

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: Failed to load the LayoutLib: com/android/layoutlib/bridge/Bridge : Unsupported major.minor version 52.0 主要原因就是前几天Android N出来了,然后我就使用Android SDK Man

Android MediaRecorder录音与播放

上一篇讲到了使用意图录音,这篇文章将使用MediaRecorder类来录音,从而提供更多的灵活性. 效果图: 源代码奉上: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" andr

Android 解决Execution failed for task &#39;:app:clean.&#39;报错

说实话,我还真是没见过比Execution failed for task ':app:clean.'更为恶心,更为不要脸的bug啦,代码没啥问题,一下子行让你爽爽,一下子又不鸟你啦,研究了下,终于找到稳定的解决方法. (1)跑到报错的那个build父目录,强制(不管你用的是啥删除软件,360还是其他的,态度一定要强硬)把build文件夹删掉. (2)网上很多都说这时候重启studio即可,当俺发现不管用,就是不管用,那就以管理员身份命令行跑去项目目录中执行一遍gradlew clean即可,这

[转载]关于android SDK安装Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml出错

原文地址为:http://blog.csdn.net/springsky_/article/details/7442388 因为入行移动测试,所以很多测试环境的搭建.从中遇到了和这个GG同样的问题.怕GG哪天删了,就转载了GG的博文~ 最近SDK出问题了,然后在google下载了一个android-sdk-windows.rar,然后点击SDK Manager,结果一直不能刷新API Level,然后就开始在网上找了好多资料,解决这个问题,修改 HOSTS,    HTTP  和  HTTPS