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

AudioRecord录制PCM格式的语音示例

Android 太平洋学习网 浏览 评论

AudioRecord可以将手机或麦克风的声音录制成pcm格式的语音文件,本案例将再service中实现pcm声音的录制,并提供将pcm格式语音转化为mp3格式的方法,先来看看AudioRecord如何实现声音的录制吧!

以下是小编封装的AudioRecord类,代码如下:

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.xuanyin.homektv.MainActivity;
import com.xuanyin.homektv.util.WaveHeader;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

public class RecorderService extends Service {

    private AudioRecord audioRecord;
    private int bufferSize;
    private Thread recordThread = null;
    private String songName = "test_new";
    private boolean isRunning = true;
    private byte[] voiceData;
    private String fileUrl = "";
    private String outFileUrl = "";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new Binder();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
		//此处可以获取到录音界面传递过来的值,如小编录制的是歌曲声音,所以获取了一个歌曲名称“SONG_NAME”的值
        if(intent.hasExtra("SONG_NAME")){
            songName = intent.getStringExtra("SONG_NAME");
        }
        startRecorder();
        return START_STICKY;
    }

    public void startRecorder(){
		//比特率16000hz,视自己的设备比特率而定
        bufferSize = AudioRecord.getMinBufferSize(16000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
        voiceData = new byte[bufferSize];
        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();
    }

    //将语音写入pcm文件中
    private void writeAudioToDirectory() {
        Long times = System.currentTimeMillis();
        String filePath = MainActivity.MY_SONGS_VOICE + songName +"_"+times+ ".pcm";
        fileUrl = filePath;
        outFileUrl = MainActivity.MY_SONGS_VOICE+times+".mp3";
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        int read = 0;
        while(isRunning){
            read = audioRecord.read(voiceData,0,bufferSize);
            if(read >= 0){
                try{
                    os.write(voiceData);
                    os.flush();
                    Log.e("writeAudioToDirectory3","在写入文件:"+read);
                }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;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                convertAudioFiles(fileUrl,outFileUrl);
            }
        }).start();
        Log.e("writeAudioToDirectory32","停止写入了"+fileUrl);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopRecorder();
        Log.e("writeAudioToDirectory33","再写入文件:"+isRunning+"==="+songName);
    }

	//将PCM转MP3格式
    public String convertAudioFiles(String src, String target){
        try{
	    //此处代码省略,请看文章下方提供的链接!
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return "ok";
    }
}

如何在代码中使用AudioRecord工具类录制手机的声音呢?代码如下:

//这是开启/关闭录音的组合开关Button按钮
public void recordUserVoice() {
	String luyinStr = weixin_luyin.getText().toString();
	Intent intent = new Intent(getActivity(), RecorderService.class);
	if(luyinStr.equals("开始录音")){
		//将按钮设置为关闭
		weixin_luyin.setText("关闭录音");
		String curr_songName = MainActivity.mainaction.tv_zhengzaibofang.getText().toString();
		//传递当前歌曲名称参数(这是小编的业务需求)
		intent.putExtra("SONG_NAME",curr_songName);
		//开启录音服务
		getActivity().startService(intent);
	}else{
		weixin_luyin.setText("开始录音");
		//关闭录音服务
		getActivity().stopService(intent);
	}
}

文章内提示:

由于文章中有将pcm格式的语音文件转化为MP3格式的文件,方法请参考下方链接中的工具类操作:

https://www.tpyyes.com/a/android/1028.html

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

打赏

取消

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

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

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

与本文相关的文章

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)

网友最新评论