android 录音压缩
时间: 2023-08-04 13:14:11 浏览: 190
Android录音压缩可以使用Android系统提供的MediaCodec API。具体步骤如下:
1. 创建一个MediaCodec对象,设置编码器类型和参数。
2. 创建一个MediaExtractor对象,从录音文件中读取数据。
3. 创建一个输出文件,用于存储压缩后的音频数据。
4. 循环读取录音数据,将其输入给MediaCodec对象进行编码。
5. 获取MediaCodec对象的输出数据,将其写入输出文件中。
6. 释放资源,关闭所有对象。
以下是一个简单的示例代码:
```java
public void compressAudio(String inputFilePath, String outputFilePath, String mimeType) {
try {
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(inputFilePath);
MediaFormat format = null;
int trackCount = extractor.getTrackCount();
for (int i = 0; i < trackCount; i++) {
format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("audio/")) {
extractor.selectTrack(i);
break;
}
}
MediaCodec codec = MediaCodec.createEncoderByType(mimeType);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
FileOutputStream fos = new FileOutputStream(outputFilePath);
boolean hasMoreData = true;
int timeoutUs = 10000;
while (hasMoreData) {
int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
int sampleSize = extractor.readSampleData(inputBuffer, 0);
if (sampleSize < 0) {
codec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
hasMoreData = false;
} else {
long presentationTimeUs = extractor.getSampleTime();
codec.queueInputBuffer(inputBufferIndex, 0, sampleSize, presentationTimeUs, 0);
extractor.advance();
}
}
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, timeoutUs);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] chunk = new byte[bufferInfo.size];
outputBuffer.get(chunk);
outputBuffer.clear();
fos.write(chunk);
codec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, timeoutUs);
}
}
fos.flush();
fos.close();
extractor.release();
codec.stop();
codec.release();
} catch (IOException e) {
e.printStackTrace();
}
}
```
其中,inputFilePath 是原始录音文件的路径,outputFilePath 是压缩后的音频文件的路径,mimeType 是编码器的类型,例如 "audio/mp4a-latm" 表示 AAC 编码器。
阅读全文