用MediaRecorder来做客户端的音频采集,下面是一些基础设置,
        MediaRecorder  audioRecorder = new MediaRecorder();
audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
final int mono = 1;
audioRecorder.setAudioChannels(mono);
audioRecorder.setAudioSamplingRate(8000);
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);        // 重点
        audioRecorder.setOutputFile(sender.getFileDescriptor());
        
        audioRecorder.prepare();
        audioRecorder.start();用localsocket来实时传输音频
        LocalServerSocket lss = new LocalServerSocket(serverName);
LocalSocket receiver = new LocalSocket();
receiver.connect(new LocalSocketAddress(serverName));
receiver.setReceiveBufferSize(bufSize);
receiver.setSendBufferSize(bufSize); LocalSocket sender = lss.accept();
sender.setReceiveBufferSize(bufSize);
sender.setSendBufferSize(bufSize);但是在一些机器上如小米、魅族在audioRecorder.start(); 是会报错 start failed -38如果将audioRecorder.setOutputFile(sender.getFileDescriptor()); 改成向文件写入:
        File soundFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile()+"/sound.amr");
audioRecorder.setOutputFile(soundFile.getAbsolutePath());
就可以正常录音有哪位知道原因或者解决办法呢? 谢谢

解决方案 »

  1.   

    你试下这个:
    主要是将LocalSocket替换为ParcelFileDescriptor初始化MediaRecorder之前,加入如下代码
    ParcelFileDescriptor[] parcelFileDescriptors;
                    try {
                        parcelFileDescriptors = ParcelFileDescriptor.createPipe();
                        parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]);
                        parcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    然后将代码:mediarecorder.setOutputFile(sender.getFileDescriptor());
    替换成:mediarecorder.setOutputFile(parcelWrite.getFileDescriptor());
    最后,获取inputstream改为
    DataInputStream dataInput = new DataInputStream(new ParcelFileDescriptor.AutoCloseInputStream(parcelRead));
      

  2.   

    用LocalSocket的方式会有问题的,后面视频根本无法进行。建议使用AudioRecorder + Camera + MediaCodec的方式实现
      

  3.   

    请问parcelfiledescriptor在三星 s7有时候会出现没有办法录音,该怎么解决