使用InputStream通过网络搜索流式音频的有效方法

Giu*_*ppe 6 java audio inputstream

我正在使用jlGui的BasicPlayer 播放音频文件(它基于Javasound).该文件位于Samba共享中,我正在使用Jcifs来访问它.它给了我一个InputStream.

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication( ... );

SmbFile f = new SmbFile( ... );
SmbFileInputStream audioIn = new SmbFileInputStream(f);

int bufSize = 8096;//should I use f.length() here?
audioBIS = new BufferedInputStream(audioIn, bufSize);

audioBIS.mark(f.length());

    //call BasicPlayer
play(audioBIS);
Run Code Online (Sandbox Code Playgroud)

我需要能够将指针放在文件中的任何位置,就像任何普通玩家一样.我能想到的唯一解决方案是BufferedInputStream每次我需要重新定位指针时使用a 和mark/reset/skip的组合.一旦我打开文件并获取Stream,我就会调用该mark()方法,以便后续reset()将在开始时重新定位我.然后,skip()我可以去我想要的地方.

audioBIS.reset();
audioBIS.skip(newBytePosition);
Run Code Online (Sandbox Code Playgroud)

我的问题是只有当我指定一个足够大的缓冲区来包含整个文件时,skip()调用才能正常工作.

有没有更有效的方法来做到这一点?

sbr*_*tla 2

我一直走着和你现在完全相同的道路。情况是,我们有一台服务器(和一个 SMB 共享)保存数千个音频文件。这些文件需要能够在应用程序中播放。

我从 jCifs 开始,修改了 BasicPlayer 的源代码以处理 SmbFile,就像处理 File 一样。它工作得很好,但是当涉及到搜索/跳过时,它并没有真正让你震惊。只要您与服务器的连接良好,就应该没问题。

我最终放弃了该解决方案,而是在服务器上安装了 tomcat6 并部署了一个小型且简单的 servlet,该 servlet 允许在给定位置对文件发出请求。然后,客户端计算机会将响应作为输入流并将其传递给 BasicPlayer。它的效果更好,并且播放是即时的。该代码比此处粘贴的合理内容要多一些,但如果您有兴趣,我愿意与您分享。