ugnagブログ

たいした内容はありません。思いつきで書いているだけ。
開発日記がメインかな。

<< MP3プレイヤー 技術的な話 | main | 回線速度が速くなった話 >>

JavaZoom BasicPlayer 使い方

いくつかわかったことがあるので、復習を兼ねてまとめておく。
その前に、basicplayer3.0.jarはマニュフェストファイルに不備があり、これをクラスパスに加えただけでは実行できない。
basicplayer3.0.jarには依存するファイルがあり、これは同梱されているのだが、依存するという情報がマニュフェストファイルに記載されていないため、依存するファイルが参照されず、結果クラスファイルノットファウンドで実行時エラーとなる。
対策は、マニュフェストファイルを書き換えるか、同梱されているライブラリをとりだし、クラスパスに追加するかだ。


---------------
2015/09/12 訂正

マニュフェストファイル云々というのは、勘違いの模様。
試しに修正してみたが変化なし。

やはり、ライブラリ(libディレクトリ)にあるjarファイルを
地道に1個づつクラスパスに加える必要がありそうだ。

---------------



では、使い方だ。

●再生方法

音を出すだけなら、
-----------------------------------------------
//インスタンス作成
BasicPlayer basicPlayer = new BasicPlayer();

//サウンドファイルのパス
String soundFile = "sound.mp3";
File file = new File(soundFile);

//再生
basicPlayer.open(file);
basicPlayer.play();
-----------------------------------------------
とこれでいいはず。

BasicPlayerは内部でスレッドを起動しているので、
ユーザー側でスレッド処理をする必要はない。


また、停止させるには
basicPlayer.stop();

ポーズ処理は
basicPlayer.pause();

とする。


●音量設定

BasicPlayer#setGain(float gain)

を使う。

引数gainは0.0から1.0までの間の値で、音圧値となっている。

通常オーディオプレーヤーのボリューム設定はデシベル単位で行うので、変換する必要がある。
変換をしなくても音量は変えられるのだが、そうすると非常に使いにくいボリューム設定になる。

他に注意として、
・音量変更は再生後でなければならない
・stop()後、pause()後、seek()後は音量がリセットされるので、
再度設定する必要がある。


●経過時間の取得

BasicPlayerにBasicPlayerListenerを登録し、そのイベントを拾うことで経過時間を取得する。

BasicPlayerListener#progressイベントの引数microsecondsは使ってはいけない。これでは経過時間は取得できない。

経過時間は直接送られてこないため、その都度計算する必要がある。
大まかにいうと、BasicPlayerListener#progressイベントで送られてくる「経過バイト数」から経過時間を算出する。

経過時間 = 全体の時間 ☓ 経過バイト数 ÷ 全体のバイト数

という計算になる。

「全体時間」「全体のバイト数」は、BasicPlayerListener#opendイベントの第二引数のMapオブジェクト(properties)からわかる。

◎全体の時間(ミリセカンド)

("duration"キーがある場合)

long milliseconds = (int) (((Long) properties.get("duration")).longValue()) / 1000;

あるいは、

("audio.samplesize.bits"キーがある場合)

int byteslength = ((Integer)properties.get("audio.length.bytes")).intValue();
int bitspersample = ((Integer)properties.get("audio.samplesize.bits")).intValue();
float samplerate = ((Float)properties.get("audio.samplerate.hz")).floatValue();
int channels = ((Integer)properties.get("audio.channels")).intValue();
milliseconds = (int) (1000.0f * byteslength / (samplerate * channels * (bitspersample / 8)));


あるいは、
int byteslength = ((Integer)properties.get("audio.length.bytes")).intValue();
float samplerate = ((Float)properties.get("audio.samplerate.hz")).floatValue();
int framesize = ((Integer)properties.get("audio.framesize.bytes")).intValue();
milliseconds = (int) (1000.0f * byteslength / (samplerate * framesize));

となる。


◎全体のバイト数

int bytesLength = ((Integer)properties.get("audio.length.bytes")).intValue();



なお、BasicPlayerListener#progressイベントの第四引数のMapオブジェクトには、これらの情報は入っていないので注意が必要だ。
必ず、openedイベントの第二引数を保存しておくこと。


●指定位置へのジャンプ

BasicPlayer#seek(long bytes)メソッドを使う。

ただし、この引数は時間ではなく、バイト数になるので注意がいる。
これも先ほどの経過時間のように計算する必要がある。

経過バイト数 = 全体のバイト数 ☓ 経過時間 ÷ 全体の時間

必要な情報の取得方法は、経過時間算出と同じだ。


●グラフィックイコライザー
JLayerのmp3再生ではグラフィックイコライザーに対応している。

なお、BasicPlayerListener#progressイベントの第四引数のMapオブジェクトの"mp3.equalizer"の値を変える。
これはfloatの配列になっていて、配列の要素0番が最低音を変化させる。
値は-1.0から1.0の間で、0.0が通常となる。
これはイベントが送られるたびに変更する必要はない。
また、これはpause()をしても記憶されている。




以上が基本的な使い方なのだが、BasicPlayerをそのままではやはり使いにくいと思う。
(音量設定や経過時間取得、シークなど)

やはり、これをラップするオブジェクトを作りそれ経由で操作したほうがいろいろと楽だと思う。



これを読んだ人で、疑問点があれば、コメンとなり掲示板などで質問をしてくれても結構です。
プログラム・開発(MP3用ツール) | comments (0) | -

Comments

Comment Form

本文に書いて下さい
本文にh抜きで書いて下さい