RK3399 + Android 8.1
需要在RK上完成MP3格式转换, 主要分两部分:
专业的事情还是要找专业的工具做, 比哪 FFMPEG. 很强大, 但并不了解它, 只能在应用边缘窥探.
在github上分别找了两个项目测试, 效果还可以: MobileFFmpeg , FFmpegAndroid
以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
首先科普下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