天天看点

AudioRecord录音 AudioTrack播放

通过AudioRecord实现自定义音频属性录音,使用AudioTrack进行播放

直接贴代码了

IRecord和IPlay自定义的两个接口。

录音实现:

package com.ione.recorddemo;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Created by user on 2014/11/13.
 */
public class RecordImpl implements IRecord {
    private boolean isRecording;
    protected static int FREQUENCY = 16000;
    private static int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
    private static int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private final String FILEPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/demo.wav";
    private  AudioRecord audioRecord;

    @Override
    public boolean open(int bufferSize) {
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                FREQUENCY, CHANNEL, ENCODING, bufferSize);
        if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
            audioRecord.startRecording();
            return true;
        }
        return false;
    }

    @Override
    public void close() {
        if (audioRecord != null) {
            if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
                audioRecord.stop();
            }
            if (audioRecord != null) {
                audioRecord.release();
                audioRecord = null;
            }
        }
    }

    @Override
    public void start() {
        File file = creatFile();
        int bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL, ENCODING);
        if(!open(bufferSize)){
            return ;
        }

        try {
            OutputStream os = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(os);
            DataOutputStream dos = new DataOutputStream(bos);

            short[] buffer = new short[bufferSize];
            audioRecord.startRecording();

            isRecording = true;
            while (isRecording) {
                int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
                for (int i = 0; i < bufferReadResult; i++)
                    dos.writeShort(buffer[i]);
            }

            audioRecord.stop();
            dos.close();
        } catch (Throwable t) {
            Log.e("AudioRecord", "Recording Failed");
        }
    }

    @Override
    public void stop() {
        isRecording = false;
    }

    private File creatFile() {
        File file = new File(FILEPATH);
        if (file.exists())
            file.delete();

        try {
            file.createNewFile();
        } catch (IOException e) {
            throw new IllegalStateException("Failed to create " + file.toString());
        }

        return file;
    }
}
           

播放实现:

package com.ione.recorddemo;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Environment;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * Created by user on 2014/11/13.
 */
public class PlayImpl implements IPlay {
    protected static int FREQUENCY = 16000;
    private static int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
    private static int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private final String FILEPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/demo.wav";
    private  AudioTrack audioTrack;
    @Override
    public void play() {
        File file = new File(FILEPATH);
        int musicLength = (int) (file.length() / 2);
        short[] music = new short[musicLength];

        try {
            InputStream is = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);
            DataInputStream dis = new DataInputStream(bis);

            int i = 0;
            while (dis.available() > 0) {
                music[i] = dis.readShort();
                i++;
            }

            dis.close();

            open(musicLength);
            audioTrack.play();
            audioTrack.write(music, 0, musicLength);
            audioTrack.stop();

        } catch (Throwable t) {
            Log.e("AudioTrack", "Playback Failed");
        }
    }

    @Override
    public void open(int musicLength){
         audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                FREQUENCY,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                musicLength * 2,
                AudioTrack.MODE_STREAM);
    }
    @Override
    public void stop() {
        audioTrack.stop();
    }
}
           

MainActivity.class

package com.ione.recorddemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends Activity {

    private static RecordImpl mRecord;
    private static PlayImpl mPlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }


    private void initView() {
        mRecord = new RecordImpl();
        mPlay = new PlayImpl();
        findViewById(R.id.record_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread = new Thread(new Runnable() {
                    public void run() {
                        mRecord.start();
                    }
                });
                thread.start();

            }
        });

        findViewById(R.id.record_stop).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRecord.stop();
                mRecord.close();
            }
        });

        findViewById(R.id.play_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPlay.play();
            }
        });

        findViewById(R.id.record_stop).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRecord.stop();
                mRecord.close();
            }
        });

        findViewById(R.id.play_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPlay.play();
            }
        });

    }
}
           

demo http://download.csdn.net/download/yangysng07/8162321