AudioInputStream - 寻求更快

时间:2017-05-19 09:03:42

标签: java

我有AudioInputStream ,不支持skip()。它由jflac支持。

因此,我正在使用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 ); } 调用并转储数据,以跳过文件。

不幸的是,寻求通过17MB(大约0.25秒寻找一分钟)需要大约1秒钟,这对我来说太慢了。

我可以做些什么来尝试更快地搜索文件?为了获得良好的用户体验,我需要的速度和我现有的速度一样快20-30倍。

这是我的代码:

skip()

我尝试读取的内容多于少于256个字节,但它似乎没有任何有意义的影响。

我还尝试使用BufferedInputStream打开文件,在其上调用AudioSystem.getAudioInputStream(),然后以几种不同的方式将BufferedInputStream传递给{{1}},但那些也失败了。每当我打电话给skip时,jflac声称该流已被关闭。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

AudioInputStream.skip()已经存在时,你当然不应该尝试自己动手。如果您有一个不支持它,请向供应商投诉。所有要做的就是调用`skip()&#39;在底层流上,因为它是一个文件输入流应该是瞬时的。

答案 1 :(得分:0)

首先,我想我并不感到惊讶,因为它有点慢。 17MB / 256字节是相当慢的I / O操作的66406循环迭代。

你说

  

我尝试读取多于少于256个字节,但它似乎没有   任何有意义的影响。

但是看一下文档,似乎每次你能够读取的字节数都会发生变化。

  

public int available()抛出IOException

     

返回可以读取(或跳过)的最大字节数   从此音频输入流中无阻塞。

即使以下内容不是更快,它至少应该更正确:

long seekPositionByte = getBytePosition ( file, seekRequestPercent );
int bytesRead = 0;

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

谨慎的做法是检查它是否过度超调。