package com.Javen;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.text.format.Time;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.Javen44100.R;
public class AudioRecordActivity extends Activity {
private static final String TAG = "AudioRecordActivity";
private Button startButton, stopButton, playButton;
private int bufferSizeInBytes = 0;
private int audioSource = MediaRecorder.AudioSource.MIC;
private static int sampleRateInHz = 44100;
private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private static final String AudioName = "/sdcard/love.raw";
private String NewAudioName = "/sdcard/new.wav";
private AudioRecord audioRecord;
private MediaPlayer mediaPlayer;
private boolean isRecord = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Time time=new Time();
time.setToNow();
String times= time.year+"."+(time.month+1)+"."+time.monthDay+"_"+time.hour+":"+time.minute+":"+time.second;
NewAudioName = "/sdcard/"+times+".wav";
init();
}
private void init()
{
startButton = (Button)findViewById(R.id.startButton);
stopButton = (Button)findViewById(R.id.stopButton);
playButton = (Button)findViewById(R.id.playButton);
creatAudioRecord();
startButton.setOnClickListener(new AudioRecordLinstener());
stopButton.setOnClickListener(new AudioRecordLinstener());
playButton.setOnClickListener(new AudioRecordLinstener());
}
private void creatAudioRecord()
{
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
Log.d(TAG, "creatAudioRecord-->bufferSizeInBytes="+bufferSizeInBytes);
audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);
mediaPlayer = new MediaPlayer();
}
class AudioRecordLinstener implements OnClickListener
{
@Override
public void onClick(View v)
{
if(v == startButton)
{
startAudioRecord();
}
if(v == stopButton)
{
stopAudioRecord();
}
if(v == playButton)
{
playMusic();
}
}
}
private final class PrepareListener implements OnPreparedListener
{
@Override
public void onPrepared(MediaPlayer mp)
{
mediaPlayer.start();
}
}
* 播放录制的音频
*/
private void playMusic()
{
File file = new File(NewAudioName);
if(file.exists())
{
try
{
mediaPlayer.reset();
mediaPlayer.setDataSource(NewAudioName);
mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new PrepareListener());
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (SecurityException e)
{
e.printStackTrace();
} catch (IllegalStateException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
* 开始录制音频
*/
private void startAudioRecord()
{
audioRecord.startRecording();
isRecord = true;
new AudioRecordThread().start();
}
* 停止录制音频
*/
private void stopAudioRecord()
{
close();
}
private void close()
{
if (audioRecord != null)
{
System.out.println("stopRecord");
isRecord = false;
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
}
* 音频数据写入线程
* @author Administrator
*
*/
class AudioRecordThread extends Thread
{
@Override
public void run()
{
super.run();
writeDataToFile();
copyWaveFile(AudioName, NewAudioName);
}
}
* 把录制的音频裸数据写入到文件中去
* 这里将数据写入文件,但是并不能播放,因为AudioRecord获得的音频是原始的裸音频,
* 如果需要播放就必须加入一些格式或者编码的头信息。但是这样的好处就是你可以对音频的 裸数据进行处理,比如你要做一个爱说话的TOM
* 猫在这里就进行音频的处理,然后重新封装 所以说这样得到的音频比较容易做一些音频的处理。
*/
private void writeDataToFile()
{
byte[] audioData = new byte[bufferSizeInBytes];
int readSize = 0;
FileOutputStream fos = null;
File file = new File(AudioName);
if(file.exists())
file.delete();
try
{
fos = new FileOutputStream(file);
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
while(isRecord == true)
{
readSize = audioRecord.read(audioData, 0, bufferSizeInBytes);
Log.d(TAG, "readSize ="+readSize);
if(AudioRecord.ERROR_INVALID_OPERATION != readSize)
{
try
{
fos.write(audioData);
} catch (IOException e)
{
e.printStackTrace();
}
}
}
try
{
fos.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
private void copyWaveFile(String inFileName, String outFileName)
{
FileInputStream in = null;
FileOutputStream out = null;
long totalAudioLen = 0;
long totalDataLen = totalAudioLen + 36;
long longSampleRate = sampleRateInHz;
int channels = 2;
long byteRate = 16 * sampleRateInHz * channels / 8;
byte[] data = new byte[bufferSizeInBytes];
try
{
in = new FileInputStream(inFileName);
out = new FileOutputStream(outFileName);
totalAudioLen = in.getChannel().size();
totalDataLen = totalAudioLen + 36;
WriteWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);
while(in.read(data) != -1)
{
out.write(data);
}
in.close();
out.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
* 这里提供一个头信息。插入这些信息就可以得到可以播放的文件。
* 音频的文件,可以发现前面的头文件可以说基本一样哦。每种格式的文件都有
* 自己特有的头文件。
*/
private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,
long totalDataLen, long longSampleRate, int channels, long byteRate)
throws IOException {
byte[] header = new byte[44];
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 16;
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1;
header[21] = 0;
header[22] = (byte) channels;
header[23] = 0;
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 24) & 0xff);
header[28] = (byte) (byteRate & 0xff);
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
header[32] = (byte) (2 * 16 / 8);
header[33] = 0;
header[34] = 16;
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
out.write(header, 0, 44);
}
@Override
protected void onDestroy()
{
close();
if(mediaPlayer != null)
{
mediaPlayer.release();
mediaPlayer = null;
}
super.onDestroy();
}
}