Javaでエンコードするソフトを作る(3)

Javaでメディアファイルを読み込むだけでも本当にきつい事が分かった。
基本のSDKではもちろん提供されてないし、プラグインを作ってる人たちもいるけどサンプルも少ない。何より基本的に動きがWindowsならDLLをJNIなりJNAなりで操作して読み込んでたりするので、Javaの利点であるOS依存ではない点において全く無価値になっている。


もちろん殆どのDLLが32ビットコンパイルされているので64ビットのJVMでは参照できずにExceptionをはいて死ぬ。

じゃあソース持ってきてコンパイルしようとすると、DLLを作るC/C++ソースの中にインラインアセンブリコードが混ざっててコンパイルできない(VCのx64コンパイラはインラインアセンブリをサポートしない)ことが多く、綺麗に直すだけのC/C++の知識が無いため諦めた。
そもそもVC2008ではx64コンパイル自体がExpress Editionではサポートされていないし。MinGWのGCCも64ビットについてはまだ正式な物がリリースされていない。

まあその辺はかなり時間かかってしまうので放置する方向で目標はあくまで動画を読み込んで画像に変換することなので、読み込みについては動けばいい。というわけで兎に角簡単に動くものを探したところQuicktime for Javaってのがあったのでこれを利用することにする。もちろん64ビットJVMでは動かないがな!

使うにはQuicktimeを落としてインストールすると、インストールフォルダの中にQTSystemフォルダがあるのでその中の「QTJava.zip」「QTJavaNative.dll」「QTJNative.dll」を使う。多分これで足りるはず。
サンプルとか動作確認にはここのサイトが参考になった。取り合えずだが特定のコーデックの動画と音声を読み込んで再生できることは確認できた。

だが、Javadocが全然まともに書かれていないためかなりこれでもきつい。
特に関数の引数にModeやTypeを指定する場合に、どの値を指定すればどのModeやTypeになるのか全くといっていいほど書いてない。多分quicktime.std.StdQTConstants*に固定値があるんだろうが、どれが何を指定しているのか非常に分かりにくい。というか分からない。

とまあ色々試してみたのだが、そもそも前回考えた圧縮状態で表示って言う考え自体が間違っていることに気がついた。表示しているのだから当然ながら横×縦のピクセル×32bitはあるわけだが、表示している以外の部分については画像形式にかかわらずByteデータな訳だからどのようにも圧縮できるわけだ。
後は表示フレームの前後をどれだけ未圧縮で保持するか、圧縮と展開の速くて効率のよい方法は何かを考えればいいんだ。

まあ現状ではそのあたりまで全然たどりつけていませんが。

0 コメント:

コメントを投稿