发送语音消息,现在已经成为即时通讯app中的一个标配功能。在开发中大多采用MediaRecorder类,如果有较高的要求则使用AndioRecord来实现。
今天一起学习一下使用MediaRecorder 实现录音,主要是参照Android官网介绍来说明,并附一简单的实例。
1、使用Mediarecorder 录音
MediaRecorder类用来进行媒体采样,包括音频和视频。也就是用来记录音频和视频方法的类,记录的数据一般都是写入到文件里面。因此我们可以通过这个类实现录音和录视频的功能。下面介绍MediaRecorder用来录音的简单方法:
MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(PATH_NAME); recorder.prepare(); recorder.start(); // 开始录音 ... recorder.stop(); recorder.reset(); // You can reuse the object by going back to setAudioSource() step recorder.release(); // Now the object cannot be reused
上面是使用MediaRecorder录音的简单流程代码,基本上你使用的代码,就能实现录音的功能。
2、MediaRecorder 相关的类
//定义音频编码 class MediaRecorder.AudioEncoder //定义声音资源 class MediaRecorder.AudioSource //回调接口,当录音出现错误的时候调用 interface MediaRecorder.OnErrorListener //回调接口,当录音出现错误的时候调用 interface MediaRecorder.OnInfoListener //定义输出格式 class MediaRecorder.OutputFormat //定义视频编码 class MediaRecorder.VideoEncoder //定义视频source class MediaRecorder.VideoSource
3、MediaRecorder常用方法
//获取音频信号源的最高值。 final static int getAudioSourceMax() //最后调用这个方法采样的时候返回最大振幅的绝对值 int getMaxAmplitude() //准备recorder 开始捕获和编码数据 void prepare() //发布与此MediaRecorder对象关联的资源 void release() //重新启动mediarecorder到空闲状态 void reset() //设置录制的音频通道数。 void setAudioChannels(int numChannels) //设置audio的编码格式 void setAudioEncoder(int audio_encoder) //设置录制的音频编码比特率 void setAudioEncodingBitRate(int bitRate) //设置录制的音频采样率。 void setAudioSamplingRate(int samplingRate) //设置用于录制的音源。 void setAudioSource(int audio_source) //辅助时间的推移视频文件的路径传递。 void setAuxiliaryOutputFile(String path) void setAuxiliaryOutputFile(FileDescriptor fd) //在文件描述符传递的辅助时间的推移视频 //设置一个recording的摄像头 void setCamera(Camera c) //设置视频帧的捕获率 void setCaptureRate(double fps) //设置记录会话的最大持续时间(毫秒) void setMaxDuration(int max_duration_ms) //设置记录会话的最大大小(以字节为单位) void setMaxFileSize(long max_filesize_bytes) //注册一个回调被调用发生错误时,同时录制 void setOnErrorListener(MediaRecorder.OnErrorListener l) //注册要同时记录一个信息事件发生时调用的回调。 void setOnInfoListener(MediaRecorder.OnInfoListener listener) //设置输出的视频播放的方向提示 void setOrientationHint(int degrees) //传递要写入的文件的文件描述符 void setOutputFile(FileDescriptor fd) //设置输出文件的路径 void setOutputFile(String path) //设置在录制过程中产生的输出文件的格式 void setOutputFormat(int output_format) //表面设置显示记录媒体(视频)的预览 void setPreviewDisplay(Surface sv) //从一个记录CamcorderProfile对象的使用设置 void setProfile(CamcorderProfile profile) //设置视频编码器,用于录制 void setVideoEncoder(int video_encoder) //设置录制的视频编码比特率 void setVideoEncodingBitRate(int bitRate) //设置要捕获的视频帧速率 void setVideoFrameRate(int rate) //设置要捕获的视频的宽度和高度 void setVideoSize(int width, int height) //开始捕捉和编码数据到setOutputFile(指定的文件) void setVideoSource(int video_source) //开始录音 void start() //停止recording void stop()
4、播放录音
mPlayer = new MediaPlayer(); mPlayer.setDataSource(mSampleFile.getAbsolutePath()); mPlayer.setOnCompletionListener(this); mPlayer.setOnErrorListener(this); mPlayer.prepare(); mPlayer.start(); //....... mPlayer.stop(); mPlayer.release(); mPlayer = null;
上面是一段简单播放录音的过程,结合上面录音代码,就可以实现录音和回放。
5.特别提示
需要在AndroidManifest.xml中声明权限:
android.permission.WRITE_EXTERNAL_STORAGE android.permission.RECORD_AUDIO
如果是Android6.0以上的系统还需要动态申请权限
/** * 开启录音之前判断权限是否打开 */ private void requestPermissions() { //判断是否开启录音权限和文件写入权限 if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) ) { initRecorder(); initPlayer(); } else { //开启录音权限和文件写入权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, VOICE_REQUEST_CODE); } } /** * 请求权限回调 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == VOICE_REQUEST_CODE) { if ((grantResults[0] == PackageManager.PERMISSION_GRANTED) && (grantResults[1] == PackageManager.PERMISSION_GRANTED) ) { initRecorder(); initPlayer(); } else { Toast.makeText(this, "已拒绝权限!", Toast.LENGTH_SHORT).show(); } } }
代码下载:http://download.csdn.net/download/longwenjunjie/10104626
版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。