首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioInputStream -寻求更快

AudioInputStream -寻求更快
EN

Stack Overflow用户
提问于 2017-05-19 09:03:41
回答 2查看 227关注 0票数 2

我有一个AudioInputStream ,它不支持skip()。它得到了jflac的支持。

因此,我使用一个read ( byte[] )调用,并转储数据,以跳过文件。

不幸的是,需要大约1秒的时间通过17 my (大约.25秒来寻找一分钟),这对我来说太慢了。

我能做些什么来更快地找到一个文件吗?我需要一些大约20-30倍的速度,我现在有,以便有一个良好的用户体验。

这是我的代码:

代码语言:javascript
复制
private void openStreamsAtRequestedOffset ( ) {
    encodedInput = AudioSystem.getAudioInputStream( file );

    AudioFormat baseFormat = encodedInput.getFormat();
    AudioFormat decoderFormat = new AudioFormat(
            AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(),
            16, baseFormat.getChannels(), baseFormat.getChannels() * 2,
            baseFormat.getSampleRate(), false );

    decodedInput = AudioSystem.getAudioInputStream ( decoderFormat, encodedInput );

    if ( seekRequestPercent != NO_SEEK_REQUESTED ) {
        long seekPositionByte = getBytePosition ( file, seekRequestPercent );
        int bytesRead = 0;

        byte[] skippedData = new byte[ 256 ];
        while ( bytesRead < seekPositionByte ) {
            int bytesSkipped = decodedInput.read ( skippedData );
            bytesRead += bytesSkipped;
        }
    }

    DataLine.Info info = new DataLine.Info ( SourceDataLine.class, decoderFormat );
    audioOutput = (SourceDataLine) AudioSystem.getLine(info);
    audioOutput.open( decoderFormat );
}

我试着读了256个字节,它似乎没有任何意义的影响。

我还尝试用BufferedInputStream打开文件,调用skip(),然后以几种不同的方式将BufferedInputStream传递给AudioSystem.getAudioInputStream(),但这些方法也失败了。每当我打电话给斯基普时,jflac就会说小溪已经关闭了。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-19 09:50:22

当然,当AudioInputStream.skip()已经存在时,您不应该尝试使用自己的。如果你有一个人不支持它,就向卖主投诉。所有要做的事情就是调用底层流上的‘`skip()’,因为它是一个文件输入流,应该是瞬时的。

票数 1
EN

Stack Overflow用户

发布于 2017-05-19 09:29:23

首先,我想我并不奇怪它的速度有点慢。17MB /256个字节是一个相当慢的I/O操作的66406循环迭代。

你说过

我试着读了256个字节,它似乎没有任何意义的影响。

但是,从文档来看,每次读取的字节数似乎会发生变化。

公共int可用()抛出IOException 返回可以在不阻塞的情况下从此音频输入流读取(或跳过)的最大字节数。

即使以下内容没有更快的速度,至少也应该更正确:

代码语言:javascript
复制
long seekPositionByte = getBytePosition ( file, seekRequestPercent );
int bytesRead = 0;

byte[] skippedData = new byte[ decodedInput.available() ];
while ( bytesRead < seekPositionByte ) {
    int bytesSkipped = decodedInput.read ( skippedData );
    bytesRead += bytesSkipped;
}

谨慎的做法可能也是为了确保它不会过高。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44065772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档