Код: Выделить всё
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class MainActivity extends Activity {
final String TAG = "Func";
int myBufferSize;
AudioRecord audioRecord;
boolean isReading = false;
private short nChannels;
private int sRate;
private short mBitsPersample;
private int mBufferSize;
private int mAudioSource;
private int aFormat;
private int mPeriodInFrames;
private byte[] myBuffer;
private static final int TIMER_INTERVAL = 120;
private RandomAccessFile randomAccessWriter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBitsPersample = 16;
nChannels = 1;
sRate = 44100;
mPeriodInFrames = sRate * TIMER_INTERVAL / 1000;
//myBufferSize = mPeriodInFrames * mBitsPersample / 8 * nChannels;
//myBufferSize = 65400;
createAudioRecorder();
//String mRcordFilePath = Environment.getExternalStorageDirectory() + "/testwav.wav";
//prepare(mRcordFilePath);
Log.d(TAG, "init state = " + audioRecord.getState());
}
void createAudioRecorder() {
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minInternalBufferSize = AudioRecord.getMinBufferSize(sampleRate,
channelConfig, audioFormat);
int internalBufferSize = minInternalBufferSize * 4;
Log.d(TAG, "minInternalBufferSize = " + minInternalBufferSize
+ ", internalBufferSize = " + internalBufferSize
+ ", myBufferSize = " + myBufferSize);
myBufferSize = internalBufferSize * 2;
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, channelConfig, audioFormat, internalBufferSize);
}
public void prepare(String filePath) {
try {
// nChannels = 1;
//sRate = 44100;
//mBitsPersample = 16;
// write file header
randomAccessWriter = new RandomAccessFile(filePath, "rw");
//randomAccessWriter.setLength(0); // Set file length to 0, to prevent unexpected behavior in case the file already existed
randomAccessWriter.setLength(0);
randomAccessWriter.writeBytes("RIFF");
randomAccessWriter.writeInt(0); // Final file size not known yet, write 0
randomAccessWriter.writeBytes("WAVE");
randomAccessWriter.writeBytes("fmt ");
randomAccessWriter.writeInt(Integer.reverseBytes(16)); // Sub-chunk size, 16 for PCM
randomAccessWriter.writeShort(Short.reverseBytes((short) 1)); // AudioFormat, 1 for PCM
randomAccessWriter.writeShort(Short.reverseBytes(nChannels));// Number of channels, 1 for mono, 2 for stereo
randomAccessWriter.writeInt(Integer.reverseBytes(sRate)); // Sample rate
randomAccessWriter.writeInt(Integer.reverseBytes(sRate * nChannels * mBitsPersample / 8)); // Byte rate, SampleRate*NumberOfChannels*mBitsPersample/8
randomAccessWriter.writeShort(Short.reverseBytes((short) (nChannels * mBitsPersample / 8))); // Block align, NumberOfChannels*mBitsPersample/8
randomAccessWriter.writeShort(Short.reverseBytes(mBitsPersample)); // Bits per sample
randomAccessWriter.writeBytes("data");
//randomAccessWriter.seek(4); // Write size to RIFF header
// randomAccessWriter.writeInt(Integer.reverseBytes(8236));
//randomAccessWriter.seek(40); // Write size to Subchunk2Size field
// randomAccessWriter.writeInt(Integer.reverseBytes(8192));
//randomAccessWriter.writeInt(0); // Data chunk size not known yet, write 0
myBuffer = new byte[mPeriodInFrames * mBitsPersample / 8 * nChannels];
} catch (Exception e) {
if (e.getMessage() != null) {
Log.e(TAG, e.getMessage());
} else {
Log.e(TAG, "Unknown error occured in prepare()");
}
}
}
public void recordStart(View v) {
Log.d(TAG, "record start");
// audioRecord.startRecording();
//int recordingState = audioRecord.getRecordingState();
//Log.d(TAG, "recordingState = " + recordingState);
}
public void recordStop(View v) {
Log.d(TAG, "record stop");
//audioRecord.stop();
}
public void readStart(View v) {
Log.d(TAG, "read start");
isReading = true;
new Thread(new Runnable() {
@Override
public void run() {
audioRecord.startRecording();
int recordingState = audioRecord.getRecordingState();
if (audioRecord == null)
return;
byte[] myBuffer = new byte[myBufferSize];
int readCount = 0;
int totalCount = 0;
while (isReading) {
readCount = audioRecord.read(myBuffer, 0, myBuffer.length);
totalCount += readCount;
Log.d(TAG, "readCount = " + readCount);
Log.d(TAG, "totalCount = " + totalCount);
myBufferSize = totalCount;
}
}
}).start();
if (isReading == false) {
String mRcordFilePath = Environment.getExternalStorageDirectory() + "/testwav.wav";
prepare(mRcordFilePath);
try {
Log.d(TAG, "myBuffer" + myBuffer);
Log.d(TAG, "myBuffer" + myBufferSize);
randomAccessWriter.seek(4);
randomAccessWriter.writeInt(Integer.reverseBytes(36 + myBufferSize));
randomAccessWriter.seek(40);
randomAccessWriter.writeInt(Integer.reverseBytes(myBufferSize));
randomAccessWriter.write(myBuffer);
randomAccessWriter.close();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
}
}
public void readStop(View v) {
Log.d(TAG, "read stop");
audioRecord.stop();
isReading = false;
}
@Override
protected void onDestroy() {
super.onDestroy();
isReading = false;
if (audioRecord != null) {
audioRecord.release();
}
}
}