

Java media APIsはいろいろあります。Java 2 Platformにも多く入っています。
など。
参考
2003年記述中
元になるデータからアプリケーションまたはブラウザとなるソフトを特定し、それを使って表示、再生等をしようとする仕組みかな。
記録等々にも使えるらしい。動画や音声など時間軸を持つようなメディアを対象としているらしい。リアルタイム会議なども関係あり?
標準ではないので、別途ダウンロードしてみる。今はIntel版はないらしい。
再生する場合
javax.media.Manager が中心になるのかな。Playerをとりだしたり・・・。
QuickTimeも QuickTime for Javaを入れれば対応できるような気もしたりしなかったり、入れなくても使えるのかな。
オーディオについて知ってるということを前提として。
Java Sound API は サンプリング系(PCM音源) と MIDI をサポートしています。今回は、その中でサンプリング系を使ってみます。
javax.sound.sampled パッケージです。
親玉管理クラスは AudioSystem です。ここから、Mixerを取り出し、DataLine まで順番に引き出してきます。
Mixerまでは簡単にわかりますが、Clip、Line とは何者なのでしょうか? 入力用とも出力用ともはっきり書かれていません。Clip は、再生用のバッファのように見えます。
DirectX的ですかね。
| クラス | 親クラス | 種類 | 概要 |
|---|---|---|---|
| Line | 入力または出力のインターフェース Lineは、データ用とデバイス用、両方のスーパーインタフェースです。 | ||
| Port | Line | デバイス | デバイス側のライン入力、ライン出力、CD-DAなどのようです。常にオープンされている。 |
| Mixer | Line | 複合デバイス | あれです。Windowsならわかると思いますが。 |
| DataLine | Line | データ | データ対デバイスでは、データ側です。 |
| Clip | DataLine | 単データ | 再生のためのメモリー上に準備するデータ。再生用デバイスからインスタンスをつくる? データを持ったSourceDataLineのようなものか |
| SourceDataLine | DataLine | 単データ | 再生のための随時処理用のデータ。(app to device) Mixer から見たSource |
| TargetDataLine | DataLine | 単データ | 録音のためのデータライン(device to app) Mixer から見た Target |
| Port.Info | 特定の型の情報がある | ||
| AudioFormat | ファイルやデータ? の情報(Info) |
| 録音、音をとりだす | TargetDataLine | AudioInputStream |
| 再生、記録する | SourceDataLine | - |
※種類は、厳密にはデバイスとデータではなく、単一ストリームか複数ストリームかのような感じである。
こんな感じになるのかな?
TargetDataLine → Mixer? → Port? → SourceDataLine
Line? Port? → Mixer ? → SourceDataLine ?
グラフィックとおなじように、各デバイスに依存しているという想定らしい。
InputStream / OutputStream の関係にも似ています。Source と Target という名前では、どちらなのか混乱します。OutputDataLine
とか InputDataLine にしてくれればよかったのに。
Mixer から各種手続きを行い、Clip や SourceDataLine、TargetDataLine を取り出す。
SouceDataLineやTargetDataLineがデータなのにLine とは何故かというと、他からデータを読み書きしながら処理する中継点でしかないので、Lineなのでしょう。
Clipは、その中にデータを持っている状態なので、名目上はLineという名前は付いていませんが、DataLineのサブインターフェースです。OutputStream
を継承して、それ自体がデータを持てるようにしたようなものです。
ということで、ユーザが作るプログラムの役割はどこにあるかというと、再生のときは、SourceDataLineを取り出して、そこにデータを送ってあげ、録音のときは、TargetDataLineを作って、そこからデータを拾うという作業になります。
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
for (int index = 0; index < mixerInfo.length; index++) {
System.out.println(mixerInfo[index].getName());
System.out.println(mixerInfo[index].getVendor());
}
デバイスを取得するには、Infoをつかう。
Mixer[] mixerArray = AudioSystem.getMixer(mixerInfo[0]); // Mixerは各デバイスが持っているミキサーや、OSのミキサー //デバイスが持つラインの情報 Line.Info[] lineInfo = mixerArray[0].getSourceInfo(); Line line = mixerArray[0].getLine(lineInfo[0]);
Line.InfoのかわりにPort.Infoをつかうこともできる。
line = AudioSystem.getLine(Port.Info.LINE_IN);
TargetDataLine から作り出されるAudioInputStreamが音源となるものです。そこから音情報を拾ってくる準備です。
AudioInputStream in = AudioSystem.getAudioInputStream(ファイル);
TargetDataLineは、
参考
Java 3D の本があります。Java 3D でも DirectX でもそうなのですが、基本部分を隠して、入門のための独自のAPIを構築して、それをあたかもDirectXやJava3Dだといわんばかりに解説したものがあります。説明を簡単にするためなのでしょうが、少し注意して入門書を選ぶ必要があるかもしれません。
参考
[しいしせねっと]