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のソースを変更して、Fileを処理するのと同じ方法でSmbFileを処理しました。それは問題なく機能しましたが、シーク/スキップに関しては、実際にあなたを驚かせることはありません。サーバーへの接続が良好である限り、問題はありません。

結局、そのソリューションを捨てて、代わりにtomcat6をサーバーにインストールし、特定の位置にあるファイルに対して要求を行うことができる、小さくて単純なサーブレットをデプロイしました。次に、クライアントマシンは応答をInputStreamとして受け取り、それをBasicPlayerに渡します。それははるかにうまく機能し、再生は瞬時に行われます。コードはここに貼り付けるのが妥当なものより少し多いですが、興味があれば共有したいと思います。

于 2012-07-27T11:23:35.503 に答える
0

別の方法として。いつでもストリームを閉じて再作成できます。速く進むようで、必要に応じて位置0に戻ります。

だからあなたがどこにいるかを追跡しなさい。前進する限り、ストリームを維持し、skip()でジャンプします。もう一度戻る必要がある場合は、そのストリームを閉じて、新しいを作成し、目的の位置にskip()をスキップします。

アプリケーションが常にバックスキップに重きを置いていない限り、大丈夫です。

それを新しい素敵なカスタムストリームにまとめると、行き来をサポートするストリームができます。

于 2014-07-12T19:24:47.637 に答える