しいしせねっとわーくAmazon.co.jp アソシエイト
[技術資料室] [Java] [J2EE]

Java Media API

Java media APIsはいろいろあります。Java 2 Platformにも多く入っています。

など。

参考

Java Media Framework (JMF)

2003年記述中

元になるデータからアプリケーションまたはブラウザとなるソフトを特定し、それを使って表示、再生等をしようとする仕組みかな。
記録等々にも使えるらしい。動画や音声など時間軸を持つようなメディアを対象としているらしい。リアルタイム会議なども関係あり?

標準ではないので、別途ダウンロードしてみる。今はIntel版はないらしい。

再生する場合

javax.media.Manager が中心になるのかな。Playerをとりだしたり・・・。
QuickTimeも QuickTime for Javaを入れれば対応できるような気もしたりしなかったり、入れなくても使えるのかな。

Java Sound API に挑戦

オーディオについて知ってるということを前提として。
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は、

参考

Java3D入門的

Java 3D の本があります。Java 3D でも DirectX でもそうなのですが、基本部分を隠して、入門のための独自のAPIを構築して、それをあたかもDirectXやJava3Dだといわんばかりに解説したものがあります。説明を簡単にするためなのでしょうが、少し注意して入門書を選ぶ必要があるかもしれません。

参考

Get Thunderbird

[しいしせねっと]