6

我正在使用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);

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

audioBIS.reset();
audioBIS.skip(newBytePosition);

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

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

4

2 回答 2

2

我和你现在走的完全一样。案例是我们有一个服务器(和一个 SMB 共享)保存数千个音频文件。这些文件需要在应用程序中可播放。

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

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

于 2012-07-27T11:23:35.503 回答
0

作为备选。您始终可以关闭流并重新创建它。似乎走得很快,如果需要,你会回到位置 0。

因此,请跟踪您所在的位置。只要你向前移动,保持流并用skip()跳转。一旦您需要再次返回,请关闭该流并创建一个新的并 skip() 到想要的位置。

除非应用程序一直在回跳,否则你应该没问题。

将其包装在一个新的漂亮的自定义流中,您将拥有一个支持来回传输的流。

于 2014-07-12T19:24:47.637 回答