【问题标题】:PCM to MP3 using MediaCodec API AndroidPCM 到 MP3 使用 MediaCodec API Android
【发布时间】:2016-04-18 08:19:10
【问题描述】:

我正在使用 AudioRecord 类从麦克风获取 PCM 数据,如何在 Android 中使用 MediaCodec 将其编码为 MP3?

【问题讨论】:

  • 你尝试过什么吗?>
  • 没试过。寻找最佳解决方案。

标签: android mp3 android-mediacodec pcm android-audiorecord


【解决方案1】:

是的,有可能MediaCodec Reference

下面的代码会将 pcm 对流到 m4a 你必须修改 mp3 的 muxer 输出格式

 private void convertAudio(String filename) throws IOException {

String outputpath =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()+"/converted.m4a";
// Set up MediaExtractor to read from the source.

MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(filename);


int trackCount = extractor.getTrackCount();

// Set up MediaMuxer for the destination.
MediaMuxer muxer;
muxer = new MediaMuxer(outputpath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
// Set up the tracks.
HashMap<Integer, Integer> indexMap = new HashMap<Integer, Integer>(trackCount);
for (int i = 0; i < trackCount; i++) {
    extractor.selectTrack(i);
    MediaFormat format = extractor.getTrackFormat(i);
    format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AMR_NB);

    int dstIndex = muxer.addTrack(format);
    indexMap.put(i, dstIndex);
}
// Copy the samples from MediaExtractor to MediaMuxer.
boolean sawEOS = false;
int bufferSize = 32000;
int frameCount = 0;
int offset = 100;
ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
/* if (degrees >= 0) {
    muxer.setOrientationHint(degrees);
}*/
// Test setLocation out of bound cases

muxer.start();
while (!sawEOS) {
    bufferInfo.offset = offset;
    bufferInfo.size = extractor.readSampleData(dstBuf, offset);
    if (bufferInfo.size < 0) {

        sawEOS = true;
        bufferInfo.size = 0;
    } else {
        bufferInfo.presentationTimeUs = extractor.getSampleTime();
        bufferInfo.flags = extractor.getSampleFlags();
        int trackIndex = extractor.getSampleTrackIndex();
        muxer.writeSampleData(indexMap.get(trackIndex), dstBuf,
                bufferInfo);
        extractor.advance();
        frameCount++;

    }
}
muxer.stop();
muxer.release();

return;
}

【讨论】:

  • 谢谢。我没有使用文件。将从 AudioRecord 类获取 pcm 缓冲区数据,并将其转换为 MP3 缓冲区数据以流式传输到其他机器。
  • Android MediaCodec 不支持 MP3 编码。所以我使用 MediaCodec 进行了 AAC 编码。 (developer.android.com/guide/topics/media/media-formats)
猜你喜欢
  • 2017-04-02
  • 2019-06-27
  • 1970-01-01
  • 2016-02-16
  • 2011-07-15
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多