Android 端录制PCM文件

语音识别功能有一项需要手机端录制pcm文件,以此记录一下,以后需要了方便复制
代码如下:

  
    ExecutorService executorService;
    private String voicePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/myAutoFile/xxx.pcm";
    private File mAudioFile;
    private AudioRecord mAudioRecord;
    private byte[] buffer;
    private static final int BUFFERSIZE = 2048;

    private Handler mHander = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            int what = message.what;
            switch (what){
                case 100:
                    Toast.makeText(VoiceDialogActivity.this,"请重试!",Toast.LENGTH_SHORT).show();
                    break;
                case 200:
                //录制成功,可以做一些操作,不如上传录音文件
                   
                    break;

            }
            return true;
        }
    });

  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      
        initData();
      

    }



  
    private void initData() {
        //创建一个单线程来录制声音
        executorService = Executors.newSingleThreadExecutor();
        buffer = new byte[BUFFERSIZE];
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    doStart();
                }
            });

    }

    private void doStart() {
        try {
           
            //创建录音文件
            mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/myAutoFile/sanyangplay.pcm");
            mAudioFile.getParentFile().mkdirs();
            mAudioFile.createNewFile();

            //创建文件输出流
            FileOutputStream fileOutputStream = new FileOutputStream(mAudioFile);
            //配置audio
            //配置Audio Record
            int minBufferSize = AudioRecord.getMinBufferSize(16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
            mAudioRecord.startRecording();
            while (mIsRecording){
                int read = mAudioRecord.read(buffer, 0, BUFFERSIZE);
                if (read > 0){
                    //读取成功
                    fileOutputStream.write(buffer,0,read);

                }else {
                    //读取失败

                }
            }
            fileOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();

        }
    }

  
   
    private void stopRecord() {
        //停止录音 关闭文件输出流
        if (mAudioRecord != null){
            mAudioRecord.stop();
            mAudioRecord.release();
            mAudioRecord = null;

        }
        mHander.sendEmptyMessage(200);

    }

    private int dp2px(int dpValue) {
        return (int) getResources().getDisplayMetrics().density * dpValue;
    }

    public void  releaseRecorder(){
        if (executorService != null){
            executorService.shutdownNow();
            executorService = null;
        }
        if (mAudioRecord != null){
            mAudioRecord.release();
            mAudioRecord = null;
        }
        if (mAudioFile != null){

            if (mAudioFile.exists() && mAudioFile.length()>0){
                mAudioFile.delete();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseRecorder();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值