android - 使用jlayer在Android上进行慢速MP3解码

标签 android mp3 jlayer

解码10秒需要1分钟,怎样才能更快解码MP3?

public static byte[] decode(String path, int startMs, int maxMs) throws FileNotFoundException 
{
    float totalMs = 0;
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    File file = new File(path);
    InputStream inputStream = new BufferedInputStream(new FileInputStream(file), 8 * 1024);
    try {
        Bitstream bitstream = new Bitstream(inputStream);
        Decoder decoder = new Decoder();
        boolean done = false;
        while (! done) {
            Header frameHeader = bitstream.readFrame();
            totalMs += frameHeader.ms_per_frame();
            SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);  
            short[] pcm = output.getBuffer();   

            for (short s : pcm) {
                os.write(s & 0xff);
                os.write((s >> 8 ) & 0xff);
              }
            if (totalMs >= (startMs + maxMs)) {
                done = true;
            }
            bitstream.closeFrame();
        } 
        return os.toByteArray();
    }catch(Exception e){
          e.printStackTrace();
    }
    return null;    
}

最佳答案

您上面列出的decode 方法只是示例代码。您不应该在生产中使用它,也就是说,您正在传递一个路径并反复重新打开同一个文件,这是一项代价高昂的操作。

相反,您应该在此方法之外打开文件,将其打开到 InputStream 中,然后将 InputStream 传递到该方法中。有关示例,请参见此问题:Android JellyBean network media issue

关于android - 使用jlayer在Android上进行慢速MP3解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14645087/

相关文章:

flash - AS3-如何找到下载前mp3的总时间?

java - 通过 JLayer 和 LayerUI 缩放 JLayeredPane

Android M 权限模型

java - 列表值和我给定的值相等,那么复选框将被选中?

Java 媒体框架 MP3 插件

python - 如何使用 Pydub 更改音频播放速度?

android - 单击链接时未启动 InstantApp

android - 最后几天我试图为我的回收站 View 添加 api 分页。但是我遇到了这样的问题

java - 使用 JLayer 播放 MP3 时指定开始/停止时间(以毫秒为单位)