我正在创建一个应用程序,我需要解码一个mp3,执行一些过滤,然后使用AudioTrack播放它。现在我正在使用Jlayer。我的代码看起来像这样:
private void writeintoBuffer(){
Decoder decoder= new Decoder();
ByteArrayOutputStream os = new ByteArrayOutputStream();
while(playing){
try {
os.reset();
Header frameHeader = bitStream.readFrame();
if (frameHeader == null) {
playing=false;
}
//Jlayer stuff
SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitStream);
bitStream.closeFrame();
short[] pcm =output.getBuffer();
for (short s : pcm) {
os.write(s & 0xff);
os.write((s >> 8 ) & 0xff);
}
byte[] Buffer=os.toByteArray();
if(Filter){
//apply filter
Buffer=Tools.Filter(Buffer);
}
AudioInputBuffer.write(Buffer, 0, Buffer.length);//writing into buffer
}
catch (Exception E){
E.printStackTrace();
}
}*
AudioInputBuffer是AudioTrack变量.Bitstream先前已初始化
不幸的是,JLayer非常慢,这真的导致我的应用程序现在滞后。我希望得到NDK的帮助,根据this article,它比Pure Java快20倍左右。我查看了NDK的音频项目样本,我必须承认,我的C不是很好。难道我无法用NDK做什么,Jlayer为我做了什么:我传递了一些mp3文件,它为我解码并将它交还给我准备运行我的进程然后提交到缓冲区?代码将更受赞赏!