首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android libmp3lame 解碼 MP3 至 PCM 實作指引

     編輯:程式設計綜合問答

現狀

libmp3lame 主要用於編碼(PCM → MP3),官方不提供解碼器。若需在 Android 上解碼 MP3,建議改用成熟的解碼庫。

推薦方案

1. MediaExtractor + MediaCodec(系統原生,API 16+)

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 較繁瑣、需處理緩衝區同步。

2. FFmpeg (libavcodec) — 功能最全

  • 編譯 libmp3lame(編碼)+ libmpg123 或 libavcodec(解碼)共用 so。
  • 使用 avcodec_send_packet / avcodec_receive_frame 新 API 解碼。
  • 成熟專案:ffmpeg-kit 提供預編譯 aar,引入即用。

3. JLayer / javampeg — 純 Java 輕量選擇

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。

合成流程建議

  1. 用 MediaCodec/FFmpeg 將本地 MP3 解碼為 PCM(short[] 或 ByteBuffer)。
  2. 將錄音 PCM 與解碼 PCM 按時間軸混音(簡單加法 + 限幅)。
  3. 用 libmp3lame 或 MediaMuxer 將混音後 PCM 編碼為 MP3 輸出。

避坑提醒

  • 採樣率、聲道數、位深必須一致,否則混音會變調或雜訊。
  • FFmpeg 編譯體積大,若只需解碼 MP3,可裁剪僅保留 libmpg123 或 libavcodec MP3 解碼器,so 體積可壓縮至 1~2 MB。
  • Android 10+ 需注意儲存權限(Scoped Storage),使用 MediaStore 或 FileProvider 讀取檔案。

總結:放棄用 libmp3lame 解碼,改用 MediaCodec(輕量)或 FFmpeg(功能全)解碼,再用 libmp3lame 編碼輸出,架構最清晰穩定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved