Android MediaFormat录制音频
时间: 2023-08-05 08:26:24 浏览: 55
使用 `MediaFormat` 类录制音频,可以更加灵活地设置音频格式和编码器。以下是一个简单的示例代码,可以使用 `MediaFormat` 类录制音频并保存到指定的文件路径:
```
private MediaCodec codec;
private MediaFormat format;
private String outputFilePath = "/sdcard/recorded_audio.aac";
private FileOutputStream outputStream;
public void startRecording() {
try {
format = MediaFormat.createAudioFormat("audio/mp4a-latm", 44100, 2);
format.setInteger(MediaFormat.KEY_BIT_RATE, 128000);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
codec.start();
outputStream = new FileOutputStream(outputFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopRecording() {
codec.stop();
codec.release();
codec = null;
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void encode(byte[] input) {
int inputBufferIndex = codec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex);
inputBuffer.clear();
inputBuffer.put(input);
codec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex);
outputBuffer.position(bufferInfo.offset);
outputBuffer.limit(bufferInfo.offset + bufferInfo.size);
byte[] chunk = new byte[bufferInfo.size];
outputBuffer.get(chunk);
outputStream.write(chunk);
codec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);
}
}
```
在这个例子中,我们首先创建一个 `MediaFormat` 对象,然后设置音频格式和编码器参数。接下来,我们创建一个 `MediaCodec` 对象,使用 `configure()` 方法配置 `MediaCodec` 对象。我们还创建一个 `FileOutputStream` 对象,用于将编码后的音频数据写入文件。
当我们想要开始录制时,只需要调用 `startRecording()` 方法。当有音频数据可用时,我们调用 `encode()` 方法将音频数据编码,并将编码后的数据写入文件。当我们想要停止录制时,只需要调用 `stopRecording()` 方法停止编码和释放资源。
请注意,此代码示例也需要一些权限,例如 RECORD_AUDIO 和 WRITE_EXTERNAL_STORAGE 权限。另外,如果你正在使用较旧的 Android 设备,可能需要使用不同的音频格式和编码器。