У меня есть диктофон с индикатором частоты, который успешно записывает звук, но записывает только 4 секунды. Мне нужно больше 4 секунд для записи кода, приведенного ниже:
public class vr1 extends Activity
{
private static final int SAMPLE_RATE_IN_HZ = 8000;
private static final int RECORDER_BPP = 16;
private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;
private static final String TAG = "VoiceDetection";
private static final int MAX_VOL = 600;
//private static final int MAX_VOL = 15000;
private static final int MIN_VAL = 0;
private static final int START_RECORD_FROM = 350;
private static final int CHECK_BLOCK_COUNT = 3;
private Thread onCreateThread = null;
private AudioRecord audioRecorder = null;
private int minBufferSizeInBytes = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.porec);
TextView textView = (TextView)findViewById(R.id.textView3);
Button button = (Button)findViewById(R.id.button1);
button.setVisibility( android.view.View.INVISIBLE );
textView.setVisibility( android.view.View.VISIBLE );
Start();
}
public void Start( )
{
// Create Handler
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg)
{
int value = msg.what;
ImageView picture = (ImageView) findViewById(R.id.imageView);
int resID[] = {
R.drawable.image0001, R.drawable.image20, R.drawable.image40,
R.drawable.image60, R.drawable.image80, R.drawable.image100
};
for( int i=MIN_VAL, step = (MAX_VOL - MIN_VAL)/resID.length; i<resID.length; i++ ) {
if( value >= i*step && value <= i*step + step )
picture.setImageResource( resID[i] );
}
// Set image for maximum value.
if( value >= MAX_VOL )
picture.setImageResource( R.drawable.image100 );
}
};
// Text change handler
final Handler changeTexthandler = new Handler() {
@Override
public void handleMessage(Message msg)
{
TextView textView = (TextView)findViewById(R.id.textView3);
Button button = (Button)findViewById(R.id.button1);
switch( msg.what )
{
case 0:
textView.setText("Waiting");
button.setVisibility( android.view.View.INVISIBLE );
textView.setVisibility( android.view.View.VISIBLE );
break;
case 1:
textView.setText("Recording");
button.setVisibility( android.view.View.INVISIBLE );
textView.setVisibility( android.view.View.VISIBLE );
break;
default:
button.setVisibility( android.view.View.VISIBLE );
textView.setVisibility( android.view.View.INVISIBLE );
break;
}
}
};
// Initialize minimum buffer size in bytes.
minBufferSizeInBytes = AudioRecord.getMinBufferSize( SAMPLE_RATE_IN_HZ,
CHANNEL_CONFIG,
AUDIO_FORMAT
);
if( minBufferSizeInBytes == AudioRecord.ERROR_BAD_VALUE )
Log.e( TAG, "Bad Value for \"minBufferSize\", recording parameters are not supported by the hardware" );
if( minBufferSizeInBytes == AudioRecord.ERROR )
Log.e( TAG, "Bad Value for \"minBufferSize\", implementation was unable to query the hardware for its output properties" );
// Initialize Audio Recorder.
try {
audioRecorder = new AudioRecord( AUDIO_SOURCE,
SAMPLE_RATE_IN_HZ,
CHANNEL_CONFIG,
AUDIO_FORMAT,
minBufferSizeInBytes
);
}
catch(IllegalArgumentException ex) {
Log.e( TAG, "Illegal Arguments: " + ex.getMessage() );
}
// Launch Thread.
onCreateThread = new Thread( new Runnable() {
@Override
public void run()
{
// Starts recording from the AudioRecord instance.
audioRecorder.startRecording();
int numberOfBytesRead = 0;
byte audioBuffer[] = new byte[minBufferSizeInBytes];
float tempBuffer[] = new float[CHECK_BLOCK_COUNT];
int tempIndex = 0;
boolean isRecording = false;
int totalReadBytes = 0;
byte totalByteBuffer[] = new byte[60 * 44100 * 2];
// While data coming from microphone.
while( true )
{
float totalAbsValue = 0.0f;
short sample = 0;
numberOfBytesRead = audioRecorder.read( audioBuffer, 0, minBufferSizeInBytes );
// Analyze income sound.
for( int i=0; i<minBufferSizeInBytes; i+=2 ) {
sample = (short)( (audioBuffer[i]) | audioBuffer[i + 1] << 8 );
totalAbsValue += Math.abs( sample ) / (numberOfBytesRead/2);
}
// Set Animation of microphone.
handler.sendEmptyMessage((int)totalAbsValue);
// Analyze tempBuffer.
tempBuffer[tempIndex%CHECK_BLOCK_COUNT] = totalAbsValue;
float tempBufferTotalCount = 0.0f;
for( int i=0; i<CHECK_BLOCK_COUNT; ++i )
tempBufferTotalCount += tempBuffer[i];
// Finalize value.
tempBufferTotalCount = tempBufferTotalCount/CHECK_BLOCK_COUNT;
// Waiting for load speak to start recording.
if( (tempBufferTotalCount >=0 && tempBufferTotalCount <= START_RECORD_FROM) && !isRecording )
{
Log.i("TAG", "Waiting for voice to start record.");
tempIndex++;
changeTexthandler.sendEmptyMessage(0);
continue;
}
if( tempBufferTotalCount > START_RECORD_FROM && !isRecording )
{
Log.i("TAG", "Recording");
changeTexthandler.sendEmptyMessage(1);
isRecording = true;
}
// Stop Recording and save data to file.
if( (tempBufferTotalCount >= 0 && tempBufferTotalCount <= START_RECORD_FROM) && isRecording )
{
Log.i("TAG", "Stop Recording and Save data to file");
changeTexthandler.sendEmptyMessage(2);
audioRecorder.stop();
audioRecorder.release();
audioRecorder = null;
SaveDataToFile( totalReadBytes, totalByteBuffer );
totalReadBytes = 0;
tempIndex++;
break;
}
// Record Sound.
for( int i=0; i<numberOfBytesRead; i++ )
totalByteBuffer[totalReadBytes + i] = audioBuffer[i];
totalReadBytes += numberOfBytesRead;
tempIndex++;
}
}
}, "Voice Detection Thread" );
// Run the Thread.
onCreateThread.start();
//*/
}
public void SaveDataToFile( int totalReadBytes, byte[] totalByteBuffer )
{
// Save audio to file.
String filepath = Environment.getExternalStorageDirectory().getPath();
File file = new File( filepath, "VioceDetectionDemo" );
if( !file.exists( ) )
file.mkdirs();
// String fileName = file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".wav";
// File always saved by same name.
String fileName = file.getAbsolutePath() + "/" + "VoiceDetectionDemo" + ".wav";
long totalAudioLen = 0;
long totalDataLen = totalAudioLen + 36;
long longSampleRate = SAMPLE_RATE_IN_HZ;
int channels = 1;
long byteRate = RECORDER_BPP * SAMPLE_RATE_IN_HZ * channels/8;
totalAudioLen = totalReadBytes;
totalDataLen = totalAudioLen + 36;
byte finalBuffer[] = new byte[totalReadBytes + 44];
finalBuffer[0] = 'R'; // RIFF/WAVE header
finalBuffer[1] = 'I';
finalBuffer[2] = 'F';
finalBuffer[3] = 'F';
finalBuffer[4] = (byte) (totalDataLen & 0xff);
finalBuffer[5] = (byte) ((totalDataLen >> 8) & 0xff);
finalBuffer[6] = (byte) ((totalDataLen >> 16) & 0xff);
finalBuffer[7] = (byte) ((totalDataLen >> 24) & 0xff);
finalBuffer[8] = 'W';
finalBuffer[9] = 'A';
finalBuffer[10] = 'V';
finalBuffer[11] = 'E';
finalBuffer[12] = 'f'; // 'fmt ' chunk
finalBuffer[13] = 'm';
finalBuffer[14] = 't';
finalBuffer[15] = ' ';
finalBuffer[16] = 16; // 4 bytes: size of 'fmt ' chunk
finalBuffer[17] = 0;
finalBuffer[18] = 0;
finalBuffer[19] = 0;
finalBuffer[20] = 1; // format = 1
finalBuffer[21] = 0;
finalBuffer[22] = (byte) channels;
finalBuffer[23] = 0;
finalBuffer[24] = (byte) (longSampleRate & 0xff);
finalBuffer[25] = (byte) ((longSampleRate >> 8) & 0xff);
finalBuffer[26] = (byte) ((longSampleRate >> 16) & 0xff);
finalBuffer[27] = (byte) ((longSampleRate >> 24) & 0xff);
finalBuffer[28] = (byte) (byteRate & 0xff);
finalBuffer[29] = (byte) ((byteRate >> 8) & 0xff);
finalBuffer[30] = (byte) ((byteRate >> 16) & 0xff);
finalBuffer[31] = (byte) ((byteRate >> 24) & 0xff);
finalBuffer[32] = (byte) (2 * 16 / 8); // block align
finalBuffer[33] = 0;
finalBuffer[34] = RECORDER_BPP; // bits per sample
finalBuffer[35] = 0;
finalBuffer[36] = 'd';
finalBuffer[37] = 'a';
finalBuffer[38] = 't';
finalBuffer[39] = 'a';
finalBuffer[40] = (byte) (totalAudioLen & 0xff);
finalBuffer[41] = (byte) ((totalAudioLen >> 8) & 0xff);
finalBuffer[42] = (byte) ((totalAudioLen >> 16) & 0xff);
finalBuffer[43] = (byte) ((totalAudioLen >> 24) & 0xff);
for( int i=0; i<totalReadBytes; ++i )
finalBuffer[44+i] = totalByteBuffer[i];
FileOutputStream out;
try {
out = new FileOutputStream(fileName);
try {
out.write(finalBuffer);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public void OnClickButtonTryAgain(View view)
{
Start();
}
}