android mp3转pcm
时间: 2023-11-06 07:07:54 浏览: 49
在 Android 平台上,可以使用 Android 自带的 MediaCodec 类来完成 MP3 转 PCM 的操作。下面是一个简单的示例代码:
```java
import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
public class Mp3ToPcmConverter {
public static void convert(String mp3FilePath, String pcmFilePath) throws Exception {
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(mp3FilePath);
int audioTrackIndex = -1;
int trackCount = extractor.getTrackCount();
for (int i = 0; i < trackCount; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("audio/")) {
audioTrackIndex = i;
break;
}
}
if (audioTrackIndex == -1) {
throw new IllegalStateException("No audio track found in " + mp3FilePath);
}
extractor.selectTrack(audioTrackIndex);
MediaFormat audioFormat = extractor.getTrackFormat(audioTrackIndex);
MediaCodec codec = MediaCodec.createDecoderByType(audioFormat.getString(MediaFormat.KEY_MIME));
codec.configure(audioFormat, null, null, 0);
codec.start();
ByteBuffer[] codecInputBuffers = codec.getInputBuffers();
ByteBuffer[] codecOutputBuffers = codec.getOutputBuffers();
FileOutputStream fos = new FileOutputStream(pcmFilePath);
boolean inputDone = false;
boolean outputDone = false;
long presentationTimeUs = 0;
while (!outputDone) {
if (!inputDone) {
int inputBufferIndex = codec.dequeueInputBuffer(10000);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = codecInputBuffers[inputBufferIndex];
int sampleSize = extractor.readSampleData(inputBuffer, 0);
if (sampleSize < 0) {
codec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
inputDone = true;
} else {
codec.queueInputBuffer(inputBufferIndex, 0, sampleSize, presentationTimeUs, 0);
presentationTimeUs = extractor.getSampleTime();
extractor.advance();
}
}
}
int outputBufferIndex = codec.dequeueOutputBuffer(new MediaCodec.BufferInfo(), 10000);
if (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = codecOutputBuffers[outputBufferIndex];
outputBuffer.position(0);
byte[] pcmData = new byte[outputBuffer.remaining()];
outputBuffer.get(pcmData);
fos.write(pcmData);
codec.releaseOutputBuffer(outputBufferIndex, false);
if ((outputBufferIndex & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
outputDone = true;
}
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
audioFormat = codec.getOutputFormat();
}
}
fos.flush();
fos.close();
codec.stop();
codec.release();
extractor.release();
}
}
```
使用方法:
```java
try {
Mp3ToPcmConverter.convert("/sdcard/test.mp3", "/sdcard/test.pcm");
} catch (Exception e) {
e.printStackTrace();
}
```
其中 `/sdcard/test.mp3` 是输入的 MP3 文件路径,`/sdcard/test.pcm` 是输出的 PCM 文件路径。注意,此代码仅供参考,实际使用时可能需要根据自己的需求进行修改。