App 使用 `AudioRecord` 錄製 PCM/WAV 錄音,需將其與下載的背景音樂 (MP3/AAC) 合成單個文件,類似「配音+伴奏」混音效果。直接二進制拼接文件流無法播放,因容器格式、編碼參數、采樣率不一致。
FFmpeg 是音視頻處理的瑞士軍刀,支持解碼、重采樣、混音、編碼、封裝全流程,是業界標準方案。
ffmpeg -i recording.wav -i background.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=3[aout]" \
-map "[aout]" -c:a aac -b:a 128k output.m4a
# 創建文件列表 filelist.txt
file 'recording.wav'
file 'background.mp3'
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp3
# -c copy 直接流複製,極快無損,但要求編碼參數完全一致
# 統一采樣率 44100Hz、聲道立體聲、格式 s16
ffmpeg -i input.mp3 -ar 44100 -ac 2 -sample_fmt s16 -f wav processed.wav
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| FFmpeg 命令行 (Runtime.getRuntime().exec) | 功能全、穩定、無需編譯 so | APK 體積大 (~20MB)、啟動慢、進程通信麻煩 | 低頻後台處理、無實時要求 |
| MobileFFmpeg (官方預編譯庫) | API 友好、體積可裁剪 (~5-10MB)、支持 Kotlin/Java 直接調用 | 需配置 Gradle、學習 API | 推薦:主流 App 音視頻處理 |
| MediaCodec + AudioTrack 手寫混音 | 零依賴、系統級硬解、延遲極低 | 極其複雜:解碼器管理、重采樣、PCM 混合算法、編碼器配置、容器封裝 | 極致性能/學習研究/特殊定制 |
| 第三方封裝庫 (如 FFmpegKit、Tanersener) | 封裝更高級、支持 RxJava/Flow、進度回調 | 引入第三方依賴風險 | 快速集成、現代化 API |
implementation 'com.arthenica:mobile-ffmpeg-full:4.5.1-1'
# 或輕量版: mobile-ffmpeg-min / mobile-ffmpeg-audio (僅音頻)
import com.arthenica.mobileffmpeg.FFmpeg;
int rc = FFmpeg.execute("-i recording.wav -i bg.mp3 -filter_complex \"[0:a][1:a]amix=inputs=2:duration=first\" -c:a aac output.m4a");
if (rc == 0) { /* 成功 */ } else { /* 失敗,查日誌 */ }
FFmpeg.executeAsync(cmd, (executionId, returnCode) -> {
// UI 線程更新進度/結果
}, (executionId, progress) -> {
// 進度 0.0~1.0
});
Android 錄音與背景音樂合成,**FFmpeg (MobileFFmpeg) 是最佳實踐** 。直接流拼接不可行,必須經過解碼→重采樣統一參數→混音/拼接濾鏡→編碼封裝全流程。MobileFFmpeg 提供友好 Java/Kotlin API,體積可控,滿足 99% App 需求。