libmp3lame 主要用於編碼(PCM → MP3),官方不提供解碼器。若需在 Android 上解碼 MP3,建議改用成熟的解碼庫。
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(mp3Path);
extractor.selectTrack(0);
MediaCodec decoder = MediaCodec.createDecoderByType("audio/mpeg");
decoder.configure(extractor.getTrackFormat(0), null, null, 0);
decoder.start();
// 迴圈:dequeueInputBuffer → fill → queueInputBuffer
// dequeueOutputBuffer → 取得 PCM → releaseOutputBuffer
優點:無第三方依賴、硬體加速、支援多種格式。缺點:API 較繁瑣、需處理緩衝區同步。
libmp3lame(編碼)+ libmpg123 或 libavcodec(解碼)共用 so。avcodec_send_packet / avcodec_receive_frame 新 API 解碼。Bitstream bitstream = new Bitstream(new FileInputStream(mp3File));
Decoder decoder = new Decoder();
SampleBuffer output = (SampleBuffer) decoder.decodeFrame(bitstream.readFrame(), bitstream);
// output.getBuffer() 即為 PCM short[]
優點:無需 NDK、跨平台。缺點:效能較低、大檔案易 OOM。
short[] 或 ByteBuffer)。libmpg123 或 libavcodec MP3 解碼器,so 體積可壓縮至 1~2 MB。MediaStore 或 FileProvider 讀取檔案。總結:放棄用 libmp3lame 解碼,改用 MediaCodec(輕量)或 FFmpeg(功能全)解碼,再用 libmp3lame 編碼輸出,架構最清晰穩定。