(二)Android音频录制研究

转载请标明出处:(二)Android音频录制研究_stormxiaofeng的博客-优快云博客

上一篇实现了Android端文字的传输 点击打开链接,由于此系列要实现Android端语音的传输,所以这篇就先研究一下Android端语音的录制。先上效果图吧:

这是主页就是几个按钮:音频的录制分为文件录制和字节流录制,

(1)文件采用Media Record录制和Media Player播放

(2)字节流采用Audio Record录制和Audio Track播放

(3)音量可视化就是实时获取音量大小,显示到屏幕上面

(4)简单实现声音的变速,加速播放和减速播放

上代码:

(1)文件录制

需要说明的是录音JNI函数不具备线程安全性,所以采用了单线程的线程池

executorService = Executors.newSingleThreadExecutor();

因为录音线程在子线程,录音失败和成功与主线程交互,采用了Handler

mainThreadHandler = new Handler(Looper.getMainLooper());

tvSpeak.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //按下按钮开始录制
                startRecord();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                //松开按钮结束录制
                stopRecord();
                break;
        }
        return true;
    }


});
private void startRecord() {
    tvSpeak.setText("正在说话");
    //提交后台任务,执行录音逻辑
    executorService.submit(new Runnable() {
        @Override
        public void run() {
            //释放之前录音的recorder
            releaseRecorder();
            //执行录音逻辑,如果失败 提示用户
            if (!doStart()) {
                recordFail();
            }
        }
    });
}
private void stopRecord() {
    tvSpeak.setText("按住说话");
    //提交后台任务,执行停止逻辑
    executorService.submit(new Runnable() {
        @Override
        public void run() {
            //执行停止录音逻辑,失败就要提醒用户
            if (!doStop()) {
                recordFail();
            }
            //释放recorder
            releaseRecorder();

        }
    });

}
private boolean doStart() {
    try {
        //创建mediaRecorder
        mediaRecorder = new MediaRecorder();
        //创建录音文件
        mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyUdpDemo/" + System.currentTimeMillis() + ".m4a");
        mAudioFile.getParentFile().mkdirs();
        mAudioFile.createNewFile();
        //配置Media Recorder
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mediaRecorder.setAudioSamplingRate(44100);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mediaRecorder.setAudioEncodingBitRate(96000);
        //设置录音文件的位置
        mediaRecorder.setOutputFile(mAudioFile.getAbsolutePath());
        //开始录音
        mediaRecorder.prepare();
        mediaRecorder.start();
        //记录开始录音时间 用于统计时长
        mStartRecordTime = System.currentTimeMillis();

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


    return true;
}

private boolean doStop() {
    //停止录音
    try {
        mediaRecorder.stop();
        //记录停止时间
        mStopRecordTime=System.currentTimeMillis();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小丰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值