zoukankan      html  css  js  c++  java
  • android录音相关

    android的麦克风在现在的生活中发挥着很大的作用,打电话,视频聊天,语音识别等等。

    android sdk的api里提供了很方便的调用方法,下面写一个小的DEMO。

    五个按钮:开始录音,停止,播放,删除录音,保存(令存为)

    recordBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    try{
                        _recordAudioFile=File.createTempFile("record",".amr");
                        //将创建以record开头,后边是一串数字的.amr
                        _mediaRecorder=new MediaRecorder();
                        _mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//麦克风
                        _mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                        _mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                        _mediaRecorder.setOutputFile(_recordAudioFile.getAbsolutePath());
                        _mediaRecorder.prepare();
                        _mediaRecorder.start();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            });
            stopBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    if(_mediaRecorder!=null){
                        _mediaRecorder.stop();
                        _mediaRecorder.release();
                        _mediaRecorder=null;
                    }
                }
            });
            playBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    if(_recordAudioFile==null||!_recordAudioFile.exists()) {
                        Toast.makeText(getApplicationContext(),"尚未录制", 0).show();
                        return;
                    }
                    _mediaPlayer=new MediaPlayer();
                    try{
                        _mediaPlayer.setDataSource(_recordAudioFile.getAbsolutePath());
                        _mediaPlayer.prepare();
                        _mediaPlayer.start();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            });
            deleteBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    _recordAudioFile.delete();
                }
            });
            saveBtn.setOnClickListener(new OnClickListener() {
                //注意事项:getAbsolutePath()返回字符串不包含末尾的“/”
                @Override
                public void onClick(View v) {
                    String sdcard=Environment.getExternalStorageDirectory().toString();
                    File dest=new File(sdcard+"/MyAudioRecord/");
                    if(!dest.exists()) dest.mkdir();
                    short rtnCode=moveFile(_recordAudioFile.getAbsolutePath(),
                            dest.getAbsolutePath()+"/"+_recordAudioFile.getName());
                    if(rtnCode==0) Toast.makeText(getApplicationContext(),
                            "成功保存至/SDCard/MyAudioRecord/", 1).show();
                    else if(rtnCode==1) Toast.makeText(getApplicationContext(),
                            "尚未录制,保存失败", 0).show();
                    else if(rtnCode==2) Toast.makeText(getApplicationContext(),
                            "同名文件已存在,保存失败", 1).show();
                }
            });
        }
    
        private  short  moveFile(String oldPath,String newPath){
            File oldFile=new File(oldPath);
            if(!oldFile.exists()) return 1;
            File newFile=new File(newPath);
            if(newFile.exists()) {return 2;}
            else 
            try {
                newFile.createNewFile();
                FileInputStream fis=new FileInputStream(oldFile);
                FileOutputStream fos=new FileOutputStream(newFile);
                byte[]buf=new byte[1024];
                int bytes;
                while((bytes=fis.read(buf))!=-1){
                    fos.write(buf, 0, bytes);
                }
                fis.close();fos.close();
                //oldFile.delete();//删除旧文件
                return 0;
            } catch (Exception e) {
                e.printStackTrace();
                return 5;
            }

    别忘记加以下的权限:

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!--往sdcard中写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--在sdcard中创建/删除文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

    上面的代码只是简单地将录制的音频保存到特定的位置,也没有做详细的出错检查,如判断SD卡的状态。

    据此可以做一些简单的应用了,如供自娱自乐的人录制自己唱的歌曲,通过压缩或转码,再上传到服务器,向他人分享。。。

    但是说到对声音的处理,博主真是捉襟见肘了,前几日用Lame编码器将录制的wav格式转换为体积小而音质损失较小的MP3时对那些参数一窍不通。

    大家如果有兴趣可以试试,Lame编码器是开源的C语言写的代码,可以移植到手机上。

  • 相关阅读:
    dubbo服务配置
    架构基本概念和架构本质
    最大子数组和问题
    struts2简单登陆页面
    四则运算随机出题
    省赛训练赛赛题(简单题)
    Ubuntu虚拟机安装,vritualbox虚拟机软件的使用
    Rational Rose 2007破解版
    netbeans出现的错误
    快速幂
  • 原文地址:https://www.cnblogs.com/makefile/p/3795629.html
Copyright © 2011-2022 走看看