0

PCM ファイルを再生するために にAudioInputStreamバイトをフィードするために を使用しています。SourceDataLineユーザーがスライダーを動かしてファイル内のあるポイントにジャンプできるようにしたいと考えています。

私が抱えている問題:

  • markSupported()に戻りfalseますAudioInputStreamreset()そのため、最初のアプローチを使用してそれを呼び出すことはできませんskip()(これはすでにちょっと醜いと思っていました...)
  • InputStrea現在のマークよりも前の位置にジャンプするためだけに、m を壊して新しいものを作成するのは本当に避けたいと思います。
  • SourceLineData.getLongFramePosition()あまり信頼できないようです...バッファがあることは知っていますが、バッファにbyte残っているsを考慮しても、動作がわかりません

a を使用しMemory-Mapped Fileてバイトを行に送り、必要な場所にジャンプできるようにすることを検討しましたが、必要がない場合は関数に複雑さを加えたくありません。私が見逃しているこれを行う良い方法はありますか?getLongFramePosition()また、実際に返されたフレーム番号が何を意味するのかを誰かが説明できますか? スピーカーを通過したフレーム数ですか(そうではないようです)?

4

2 に答える 2

1

BigClip は役に立ちましたか?

そうでない場合は、ここで機能する可能性があります。警告、少し複雑です。 http://hexara.com/VSL/VSL2.htm

このアプレットを使用すると、wav を読み込むことができます。5 分以上の wav を読み込んで問題なく動作しましたが、オーディオ データは大量の RAM を消費します。

WAV がロードされると、マウスを押したままドラッグすることで、任意のポイントにマウスを移動して再生できます。明らかに、それはまさにあなたがやりたいことではありません。ポイントから再生したいので、ドラッグやドラッグ速度を心配する必要はありません. しかし、再生可能な状態でデータを取得するためのパスは、引き続き機能するはずです。

AudioInputStream と AudioFileFormat が機能している場合は、内部配列を設定してデータを直接読み込むことができます。オーディオ ファイル形式は、配列次元の計算に使用できるエンコードとフレーム単位の長さを提供します。

次に、作成した配列からオーディオ データを取得する TargetDataLine を作成します。TDL には、次の読み取りの開始位置を示す変数が必要です。JSlider を使用して、その変数の内容を任意のフレームを指すように変更できます。

動作している AudioInputStream がない場合、取得する方法はありますが、ByteArrayOutput および Input Stream オブジェクトが関係して、より複雑になります。おそらくそこに行く必要はありません。(上記のアプレットでクライアント データを読み取るために使用します。)

現在のフレームの場所に関する質問については、主な問題は、JVM がオーディオ データをチャンクで処理し、バーストで聞こえるものよりも先に実行される傾向があることです。私は長い間この問題に頭を悩ませていましたが、これを思いつきました: http://www.java-gaming.org/index.php/topic,24605.0.html

于 2011-08-23T03:10:36.847 に答える