最新消息:关注【已取消】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

Android AudioRecord的用法完整示例

Android 太平洋学习网 浏览 评论

这个Android AudioRecord录音功能是小编自己项目中使用的,因为以后要经常用到,因此想把AudioRecord的使用作为笔记记录下来,小编将Android录音功能写在了Service类里面会更加科学实用,因为可以后台录音,下面是小编的代码,代码可以直接拿来使用!

AudioRecord录制的为“.pcm”格式的文件,需要将它转码成mp3或其它格式的语音文件才能在网页或播放器上播放,后续本站会发布pcm格式转mp3格式语音文件的文章供大家学习!

一:在Service实现AndroidRecord录音功能

package com.xuanyin.homektv.service;
import android.app.Service;
import android.content.Intent;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import com.tpyyes.MainActivity;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class RecorderService extends Service {
    private AudioRecord audioRecord;
    //缓冲区大小
    private int bufferSize;
    //录音线程
    private Thread recordThread = null;
    //外部传进来的mp3文件名称
    private String songName = "";
    //录音标记
    private boolean isRunning = true;
    //存储语音数据
    private byte[] voiceData;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new Binder();
    }
    //启动Service,会启动录音功能
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if(intent.hasExtra("SONG_NAME")){
            songName = intent.getStringExtra("SONG_NAME");
        }
        startRecorder();
        return START_STICKY;
    }
    //开始录音
    public void startRecorder(){
        //获取最适合的缓冲大小(小编在原有基础上放大了2倍)
        bufferSize = AudioRecord.getMinBufferSize(16000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
        //存储语音数据的数组
        voiceData = new byte[bufferSize];
        //创建录音对象(参数为:输入源为麦克风,赫兹16000,音道,比特数)
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,16000, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT,bufferSize);
        //录音        
        audioRecord.startRecording();
        //录音线程
        recordThread = new Thread(new Runnable() {
            @Override
            public void run() {
                writeAudioToDirectory();
            }
        },"recorder Thread");
        
        //开启线程
        recordThread.start();
    }
    //将录音文件写入文件夹
    private void writeAudioToDirectory() {
        //文件存储位置
        String filePath = MainActivity.MY_SONGS_VOICE + songName +"_"+(System.currentTimeMillis() / 1000) + ".pcm";
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        int read = 0;
        //循环写入文件
        while(isRunning){
            Log.e("writeAudioToDirectory2","在写入语音文件:"+isRunning);
            read = audioRecord.read(voiceData,0,bufferSize);
            if(AudioRecord.ERROR_INVALID_OPERATION != read){
                try{
                    os.write(voiceData);
                    Log.e("writeAudioToDirectory","在写入语言文件");
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        }
    }
    //停止录音
    public void stopRecorder(){
        isRunning = false;
        if(recordThread != null){
            recordThread.interrupt();
            recordThread = null;
        }
        if(audioRecord != null){
            audioRecord.stop();
            audioRecord.release();
            audioRecord = null;
        }
    }
    //销毁录音对象和线程
    @Override
    public void onDestroy() {
        super.onDestroy();
        stopRecorder();
        Log.e("writeAudioToDirectory33","在写入文件:"+isRunning+"==="+songName);
    }
}

二:注册Service

如果在Service中想要想要开启AudioRecord录音功能,必须要在AndroidManifest.xml中注册Service,代码如下:

<service android:enabled="true" android:name=".service.RecorderService"/>

三:在AndroidManifest.xml中给与录音权限

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

四:在Fragment中启动或关闭AudioRecord录音功能(当然也可以在Activity中使用)

//启动或关闭录音,可用在Click点击事件中
private void recordUserVoice() {
	String luyinStr = weixin_luyin.getText().toString();
	Intent intent = new Intent(getActivity(), RecorderService.class);
	//开启录音
	if(luyinStr.equals("开始录音")){
		//可以将文件名传入到Service中,例如
		intent.putExtra("SONG_NAME","测试歌曲名称");
		getActivity().startService(intent);
	}else{ //关闭录音
		weixin_luyin.setText("开始录音");
		getActivity().stopService(intent);
	}
}


来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/android/986.html
"文章很值,打赏犒劳作者一下"
微信号: Javaweb_engineer

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

与本文相关的文章

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)

网友最新评论