我有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声称该流已被关闭。
有什么想法吗?
答案 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;
}
谨慎的做法是检查它是否过度超调。