平台
RK3399 + Android 8.1
概述
需要在RK上完成MP3格式转换, 主要分两部分:
mp3 转 adpcm
mp3 转 CBR mp3
专业的事情还是要找专业的工具做, 比哪 FFMPEG. 很强大, 但并不了解它, 只能在应用边缘窥探.
在github上分别找了两个项目测试, 效果还可以: MobileFFmpeg , FFmpegAndroid
mp3 转 adpcm
以FFmpegAndroid为例:
FFmpegUtil.java 中添加
public static final String AUDIO_CODEC_ADPCM = "adpcm_ms"; public static final String AUDIO_CODEC_WAV = "wav"; public static final String AUDIO_CODEC_MP3 = "mp3"; //ffmpeg -i INPUT.wav -f wav -acodec adpcm_ms OUTPUT.wav public static String[] transformAudioAdpcm(String inputPath, String outputPath) { String transformAudioCmd = "ffmpeg -i %s -acodec %s -ac 1 -ar 16000 %s"; transformAudioCmd = String.format(transformAudioCmd, inputPath, AUDIO_CODEC_ADPCM, outputPath); return transformAudioCmd.split(" "); }
MainActivity.java 调用:
String srcMp3 = "/mnt/sdcard/test.mp3"; void toAdpcm(){ d("toAdpcm"); String out = "/mnt/sdcard/test.wav"; FFmpegHandler ffh = new FFmpegHandler(h); String[] cmds = FFmpegUtil.transformAudioAdpcm(srcMp3, out); ffh.executeFFmpegCmd(cmds); }
实际执行的命令: ffmpeg -i /mnt/sdcard/test.mp3 -acodec adpcm_ms -ac 1 -ar 16000 /mnt/sdcard/test.wav
mp3 转 CBR mp3
首先科普下CBR VBR ABR
CBR (constant Bitrate)固定比特率。
VBR(Variable Bitrate)动态比特率
ABR(Average Bitrate)平均比特率,是VBR的一种插值参数。
以MobileFFmpeg为例:
String src = "/sdcard/test.mp3"; String dst = "/sdcard/cbr.mp3"; //8, 16, 24, 32, 40, 48, 64, 80, 96, 112, 128, 160, 192, 224, 256 int rc = FFmpeg.execute(" -i " + src + " -codec:a libmp3lame -b:a 48k " + dst);
实际执行的命令: ffmpeg -i /mnt/sdcard/test.mp3 -codec:a libmp3lame -ar -b:a 48k /mnt/sdcard/test.wav
更多丰富的功能可以查看FFmpeg的文档, 共勉!
Converting to .mp3 format using ffmpeg and the libmp3lame codec.pdf
引用
科普贴!mp3中的比特率VBR,ABR,CBR分别是什么意思?
MobileFFmpeg
FFmpegAndroid
Converting to .mp3 format using ffmpeg and the libmp3lame codec
wiki:Encode/MP3