1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
public class AudioRecorder {
private static final String TAG = "AudioRecorder";
private AudioRecord audioRecord;
private MediaCodec mediaCodec;
private Thread recordingThread;
private boolean isRecording = false;
private File outputFile;
public AudioRecorder() {
int minBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
try {
mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);
MediaFormat format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 44100, 1);
format.setInteger(MediaFormat.KEY_BIT_RATE, 96000);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void startRecording() {
if (isRecording) {
return;
}
isRecording = true;
outputFile = new File(Environment.getExternalStorageDirectory(), "audio_recorded_" + System.currentTimeMillis() + ".aac");
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
try (FileOutputStream fos = new FileOutputStream(outputFile)) {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
audioRecord.startRecording();
while (isRecording) {
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
int readSize = audioRecord.read(inputBuffer, inputBuffer.capacity());
if (readSize > 0) {
mediaCodec.queueInputBuffer(inputBufferIndex, 0, readSize, System.nanoTime(), 0);
}
}
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, -1);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] data = new byte[bufferInfo.size];
outputBuffer.get(data);
fos.write(data);
mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, -1);
}
}
audioRecord.stop();
audioRecord.release();
mediaCodec.stop();
mediaCodec.release();
} catch (IOException e) {
e.printStackTrace();
}
}
});
recordingThread.start();
}
public void stopRecording() {
if (!isRecording) {
return;
}
isRecording = false;
try {
recordingThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
|