« 2007年10月 | トップページ | 2007年12月 »

2007年11月の16件の投稿

2007/11/26

QuickTime for Javaで字幕をつけてみる

iPod touchを衝動買いしてしまったので、QuickTimeで遊んでみようと思う。

iPod touchのためにJMFでなくQT4Jを使用しようと思った理由は、iPodの対象としている環境、つまりWindowsとMac OS Xで同じコードで同じ実行結果が得られそうということと、JMFからiPodで見られる形式でエクスポートできそうに無かった、という2点。

最終的な目標は、ニコニコ動画に登録した動画をコメントつきでiPod touchから見られるようにすること、か。

おそらく手順としては以下のようになる。

  1. Flash Video(.flv)からQuickTimeムービー(.mov)へ変換する。
  2. コメント情報を取得しxmlファイルへ保存する。
  3. QuickTimeムービーとxmlファイルから取得したコメント情報を合成する。
  4. iTunesに登録する。

これからやろうとしているのは3番で、そのほかの手順については、当面は手動、あるいは他のソフトウェアで代用することにする。

3.のプログラムを動かすためにQTファイルが必要なので、1.はffmpegを使用して保存しておく。下記のコマンドでQTファイルへ変換できる。
> ffmpeg -i inputfile.flv outputfile.mov

 

今日作成したコードはこちら(文字エンコーディングはSJIS)。QuickTimeにはテキストメディアというメディア形式があり、これを用いてキャプションなどを作成できるようだ。おそらくFlashにも同様のAPIがあるのだろう。

このプログラムは、ファイルオープンダイアログで指定されたムービーに規定の文字列を動画像上で合成し、result.movというファイルを出力する。

コンパイル、実行するためには、JDKの他にQuickTime for Javaが必要だが、QuickTimeをインストールしたことがあればおそらく既に入っている(例 C:\Program Files\Java\jre1.6.0_03\lib\ext\QTJava.zip)。Mac OS XではOSに標準添付されているのではないだろうか。

 

作成されたファイルをQuickTime Playerで再生してみたところ、所望の結果が得られた。しかし、iPod touchで再生した場合、字幕は消えてしまっていた。ffmpegで他のフォーマットに変換した場合も同様に消えてしまうようだ。

 

参考:
オライリー社ONJavaの記事 - Making Media from Scratch, Part1
QuickTime Framework Reference(pdf)
QuickTime Javadoc

2007/11/24

コメント付き動画再生プレイヤについて、他者の調査検討も参考にしてみる

ニコニコ動画をコメントつきで再生したり、保存したりするソフトウェアはおそらく既に存在しているだろう、それらの動作も参考にしてみよう、と考えて検索してみた。

結果、再生ソフトは多く存在し、保存ソフトも前者より少ないながらも存在しているようだ。

画面キャプチャを行うものは興味が無いので見ていないが、その他のものはffdshowあるいはFFmpegというソフトウェアのいずれかを用いているようだった。再生系はffdshow, 保存系はFFmpegだろうか。

ffdshowはGPLで、FFmpegはLGPL(ただしオプショナルモジュールにGPLのものが含まれる)、ということであり、他者のソースコードも参考にできるのでは、とも考えたが、検索でヒットした限りではソースコードが公開されているものは無かった。

ニコニコ動画のコメント仕様としては、ψ(プサイ)さんのエントリとそのコメントにまとまっていた。

2007/11/22

QuickTime for Javaを利用してみる

QuickTime for Java(QT4Jなどと略されるらしい)やライブラリファイル名であるQTJava.zipなどで検索をかけても、バッファオーバフローのセキュリティ問題対応や、QuickTimeをインストールするとClass Pathがおかしくなる、といった話題しかヒットせず、あまり有用な情報が入手できない。

そのような中、こちらにシンプルな動画再生コードが載せられていることを見つけた。

そのままコピー&ペーストしても動作するのだが、deprecatedなパッケージ, クラスが多用されており(当時はdeprecatedではなかったのだろう)、また、それらはjavadocに何もドキュメンテーションされていないため、かなり継続する気を削がれる。

とりあえず、deprecatedなものを排除した、同等の動作を行うコードを添付する。こちらのパッケージ、クラスは比較的ドキュメンテーションされている。ただし引数で渡す定数など、Javadocだけでは全くわからない事項もあるため、C言語用リファレンスも参照しながらコーディングする必要がある。

また、今回の例ではMoviePlayerからライトウェイトのQTJComponentを使用している。この方法ではスライダーバーがデフォルトでは作成できず、自作する必要があるらしい。スライダーバーが必要な場合はMovieControllerからヘビーウェイトのQTComponentを作成する必要がある、らしい。

2007/11/19

動画へのアニメーションオーバレイ

前回までの、JLayeredPaneを用いたオーバレイ方法は、文字列の更新が無い場合だとうまくいく。しかし、動画の上で文字列のアニメーションを行うと、ちらつきが発生してしまう。

動画像の更新と、文字列の更新を同期させれば良いと思うのだが、javax.media.Playerはそういった用途は意図していないようで、更新タイミングを取得することはできなさそうだった。

仕方が無いので、JMFにもう少し深入りし、動画にエフェクトをかけることで動画像に直接文字列を書き込むことにした。

 

Java Web Startで実行する(JMF再生環境が整っている必要がある)

参考:
Java Media Framework API Guide日本語訳
SunのJMFフォーラム

 

2007/11/11

Swingで文字列をスクロールさせてみる

ITmediaの記事「開発者が明かす「ニコニコ動画」人気の“キモ”」に書かれているニコニコ動画プレイヤの仕様のうち、

  • 文字列が1画面を横断する時間が5秒
  • 後から見ても、コメントが流れる位置は同じ

だけ実装してみた。

 

Java Web Start

 

Swingアプリを作成するのには、EclipseよりNetBeansの方が良いかと思い試してみた。まっとうなプログラムを作る場合には、手作業で細かにパラメータを調整する必要があるかもしれないが、今のような適当なプログラムを作成するのにはかなりメリットがある。

文字列のスクロール(アニメーションという呼び方の方が適切か)については、Java2Dを学習する必要があると感じた。今回はこちらのサイトのサンプルコード中のクラス/メソッドを、あまり理解せずに使用している。API仕様等を読んでも専門用語が多くすんなりとは理解できそうも無い。壁は厚いと感じている。

Java Web Startについては、取り敢えず動くことを確認したのみ。仕組みなどは一切理解していない。余裕ができたら学習しようと思う。

ニコニコ動画やYouTubeはストリーミング配信ではない

JMFを学んでいる最中に得た雑学知識。

ダウンロード違法化の話題の中で、Flash Video(FLV)はストリーミング配信だから云々と書かれている事がよくある。法的な話は置いておき技術的な話をするならば、表題のサービスで行っているHTTPプロトコルでのFLVダウンロードは「擬似的な」ストリーミング配信であって本質はダウンロード再生と変わらない。従って、キャッシュに残るのは当然といえば当然。

これらのサービスで実行されるのはプログレッシブダウンロードである。プログレッシブダウンロードとはファイルのダウンロードが完了しなくてもコンテンツの再生が開始できる仕組みである。ナローバンド時代にプログレッシブJPEGが使用されたのと同じような目的のためのもの。

参考:
Wikipedia:Flv
ストリーミングメディアガイド:プログレッシブダウンロードって何?

2007/11/10

Windows Live フォトギャラリーをインストールするとエクスプローラが固まる

Windows Liveサービスがベータから正式版へ移行したそうなので、Windows Live Writerのアップデートと共に、Windows Live フォトギャラリーもインストールしなおしてみた。

結果は以前と変わらず。動画のサムネイル表示はiTunesで行うことにした。iTunes自体があまり軽快では無いが、エクスプローラで表示させようと思うと他の作業まで影響が出るのであれば仕方が無い。また、Picasa2は、動画だけ、という用途にはあまり向いていない。

Windows XPの標準状態では、動画や静止画が入ったフォルダは「縮小版」の表示方式では無かっただろうか。影響の有るユーザは少なくないと思うのだが。

2007/11/07

VistaにQuickTime7.3をインストールしたがやはり駄目だった

CVE-ID:CVE-2007-4677の問題に該当するのかと思って少し期待していたが、相変わらずbuffer overrunのダイアログが出て強制終了となる。

悪質なムービーファイルを開くようアタッカーがユーザを誘導することで、アプリケーションが予期せず終了したり、

とのことだが、次回は悪質ではないムービーファイルへも対応をお願いしたい。

原因記述の中の「カラーテーブルアトム」とは何だろうか(英語でもそのまま"color table atom")。検索するとAppleのDeveloper ConnectionでOverview Movie Atomsというページがヒットした。この中に説明がある。どうも、ファイル中に情報があるまとまりでブロック化して記述してあるのだが、そのブロックを指してアトムと読んでいるらしい。

バイナリエディタで動画ファイルを開き、文字列"ctab"を検索したが存在しなかった。Googleで "quicktime atom"をキーに検索すると、日本語で解説しているサイトが存在するようだ。

2007/11/06

Javaでニコニコ動画風のプレイヤを作れるか

概要:Swingで動画に文字列をオーバレイ表示できるか試してみたところ、色々と制約があることがわかった。

デスクトップアプリを趣味で作るのであれば、やはりマルチメディアか、ということでJavaで動画再生するための方法を調べて見た。…どうも動画処理についてはあまり得意ではないらしい。

Run Anywhereなものを目指すのであれば、Flashを学んでFLVを扱ったほうが良いのではないかと思う。そうでないとしても、Managed DirectXを学ぶ、など他に有効な時間の使い方があるような気がする。

ともかく、Javaで動画再生であるが、検索ではJMFQuickTime for Javaがヒットしたが、今回はJMFを使用した。

 

以下調査結果。

動画(ビジュアルコンポーネント)の上に他のコンポーネントをかぶせる場合、ビジュアルコンポーネントがライトウェイトである必要があるらしい。また、上に被せようとしているコンポーネントもライトウェイトで無ければならない。これはヘビーウェイトコンポーネントは透明化できないという理由による。

つまり、ライトウェイトで作れば表題のようなことが実現できるかもしれない。

やっつけのサンプルコード。コード中、(1)の箇所は上に被せるコンポーネントをライトウェイト(JLabel)にするかヘビーウェイト(Label)にするかであり、(2)の箇所はビジュアルコンポーネントをライトウェイト(2つのsetHintで指定)とするか、ヘビーウェイト(デフォルトのまま)とするか、の指定である。

実行結果。双方ライトウェイトの場合は、期待した結果が得られた。

ビジュアルコンポーネントがヘビーウェイトだと、どうやってもテキストは前に来ない。

result02

参考:
http://forum.java.sun.com/thread.jspa?forumID=28&threadID=696564
http://forum.java.sun.com/thread.jspa?forumID=28&threadID=378404

2007/11/04

Swing入門以前 - Swingのスレッドポリシー(1)

Swingのことをweb検索しているとよくスレッドの話題を見かける。javax.swingパッケージのJavadocにもセクションが設けられているくらい重要な事項らしい。しかし、Swing入門書のサンプルコードを書き写している限りではスレッドの話なんて一言も出てこなかったが?

というわけで、スレッドについて調査することにした。「入門以前」としては、前回までの概念モデルと今回からのスレッドの調査で完了としよう、と考えている。

今回はThe Java Tutorialsのうち、Concurrency in Swingを主に参考にしている。

 

スレッドの種類

Swingで扱うスレッドは、以下の3種類に大別できる。2列目の記述は、現段階で理解している内容である。

イニシャルスレッド
(initial theads)
mainメソッドが実行される、いわゆるメインスレッドをイメージすればよい。単純なSwingアプリケーションでは、何も行わない。
イベントディスパッチスレッド
(EDT;event dispatch thread)
Swingコンポーネントのコントロールはすべてこのスレッドで実行する必要がある(ただし例外は有る)。
ワーカースレッド
(worker threads)
一般的に使用されているワーカースレッドと同じイメージ。バックグラウンドスレッドとも呼んでいるようだ。

ここで疑問点。

  • メインスレッド(イニシャルスレッド)とイベントディスパッチスレッドは別物か?

イベントディスパッチスレッドというものがメインスレッドと同一のものであるならば、入門書では敢えてスレッドについて触れていないのもうなづける。…が、これは別物である。

ここが誤解していた点であり、理解を妨げていた箇所なのだが、Webでよく見かける「Swingはシングルスレッド設計」というような文章、これは「Swingコンポーネントのコントロールはイベントディスパッチスレッドという単一のスレッドで実行する必要がある」ということであり、Swingプログラムがシングルスレッドというわけではない(少なくともイニシャルスレッドとイベントディスパッチスレッドの2スレッドは使用される)。

 

イベントディスパッチスレッドを意識しなくてよい理由

Swingアプリケーションをプログラミングしてきたので、もちろんSwingコンポーネントのコントロールは行っている。しかし今までイベントディスパッチスレッド(EDT)は全く意識してこなかった。何故だろうか。

ここで、いつSwingコンポーネントを操作した(Swing系オブジェクトのメソッドを使用した)か考えてみた。以下の2点が心当たりとしてあった。

  • (A):mainメソッドの中でJFrameのオブジェクトを作成(new)して表示(setVisible)した。
  • (B):actionPerformedメソッドの中に、ボタンが押されたときに文字列を表示するようにした。

上記の(A), (B)は、Swingのスレッドポリシーというものに合致してるのか反しているのか?

4th MEDIA(@nifty TV)の解約

@nifty TVの解約手続きが面倒なので記録しておく。

フレッツ光を申し込んだ際に、無料期間があるからといってついでに表題のサービスを申し込んだが、結局利用しそうに無いので解約することにした。4番目のメディアという名前なのにテレビ受像機が必要なんて(注:紙(新聞・雑誌)->ラジオ->テレビときて4番目のインターネットという意味かと思っていたのだが、Wikipediaによるとそういう意味ではないらしい)。

niftyのサポートページによる説明はこちら:「(2-9)サービス解約の手続き方法を教えてください。」また、サポート窓口はこちら:「お問い合わせ

解約手続きとして、行わなければならないことは大きく3つ。

  1. @nifty TVサービスの解約:インターネットから手続きする
  2. フレッツ・ドットネットの解約:インターネットから手続きする
  3. レンタル機器の返却:NTT東日本へ電話連絡する。電話番号:116

1点目、@nifty TVの解約。上記のサイトの一番下に解約ボタンがある。これ以降の手続きの流れについて説明が出るのだが、色々なページに分散しているので、しっかり読みながら進めていかないと、あと何を行えば完了なのかわからなくなる恐れが有る。

私の場合、1度も利用したことが無かったのでこの表示が出て解約できなかった。

4thmedia01

7月にサービスを開始しているので、サービス初回利用月ということもないはずだが、請求金額を確認したところ料金が発生してないのは気になる。電話で聞く必要があるが、土日祝は開いていない。

2点目、フレッツ・ドットネットの解約。こちらは特に問題は無かった。

3点目、レンタル機器の返却。私は2->3->1の順番で手続きを行っていたので手続き先の電話番号がわからなかった。上記116の電話番号は手順1のどこかのタイミングで表示される。

上記niftyのサポート窓口ページに書かれているNTT東日本ビジュアルサポートデスクの電話番号0120-970492は携帯電話で繋がらなかったし、この番号で検索して出てきたページに書かれていた携帯電話用の番号03-5667-7036も、実際にはレンタル返却受付窓口ではなかった(ここで私が住んでいる地域の担当窓口電話番号を教えてもらった)。

返却の申し込みをすると、後日、返却物を入れる箱、返却物一覧など一式が送られてくるらしい。着払いで返却でき、送料はかからない、とのこと。

910ISのケース

Canon IXY DIGITAL 910 IS 本体を買った際、店舗で黒色系(ブルーブラック)のケースIXC-310Aが売り切れていたため、amazonで購入した。

想像以上に青味が強い。バーガンディ(IXC-310B)の方が良かったかな、とも思った。こういったものは、やはり現物を見て考えるべきか。

GIMP for Windows インストール

GIMP for Windowsのインストール方法。他のサイトに書かれている記述内容は、古いものも多いようなので今回の手順を記載しておく。

以前からgimpは使用していた。おそらくVectorに登録してあるこのパッケージだったと思う。私が使用していたバージョンでは、「クリップボードから貼り付け」を行おうとすると失敗する場合が多く、バージョンアップすることに決めた。

今回インストールしたパッケージの配布先はhttp://gimp-win.sourceforge.net/。特に日本語対応とも書かれていないが、大体のメニューは日本語化されている。また、他のパッケージでは、別途Gtk+のインストールが必要なものもあるようだが、これは1回のインストール作業で終了する。今回インストールしたバージョンは2.4.1。

起動後、一部の日本語が文字化けする。解消方法はこちらのサイトを参考にした。ただし一部手順が異なる。

C:\Program Files\GIMP-2.0\etc\gtk-2.0\gtkrc を開き、1行目から以下の文字列をペーストし、GIMPを再起動する。

gtk-theme-name = "Default"
style "user-font"
{font_name="ms ui gothic 9"}
widget_class "*" style "user-font"

 

なお、行いたかった作業「クリップボードから貼り付け」は、ツールウィンドウ(正式名称知らず)の、ファイル>Acquire>新規に貼り付けでできる。画像編集ウィンドウの「編集」メニューからでも可能。同一メニュー階層に有る「画像取り込み」機能を使えば、画面キャプチャ自体もgimpでできる。

910ISとCG6を撮り比べてみた

せっかくなので、所有しているデジカメ2台で同じ場所を撮影してみた。上がCanon IXY DIGITAL 910 IS、下が SANYO Xacti DMX-CG6。両方とも最高画質の設定にしているはず...だが自信が無い。ちなみに910ISの方は時刻設定が1日ずれていた。

IMG_0006

SANY0225

歪みは減ったかな、と思うが、画質の差はどうだろう、正直自分にはあまりわからない。

この他にも何枚か撮影したが、CG-6はオートホワイトバランスが失敗していることが多いのかな、という感じはする。測光方法の設定を間違えている可能性も高いのだが。

デジタルズーム、初めて使用してみた。カメラの小さな液晶でプレビューする限りではかなりきれいに見えるので使える機能なのかと思ったが、PCモニタで見ると...やはり意味のある機能には思えない。

2007/11/03

Swing入門以前 - Swingの概念モデル(3) - layered pane, glass pane

前回の続き。「階層化区画」「コンテンツ区画」「ガラス区画」の上下関係はどうやって決まっているのか。

これについては、JRootPaneのJavadocに解説が記載されていた。Javadocの図の方がわかりやすいかもしれないが、一応オブジェクト図で関係を示す。

swing06_rootpane_rel

コンテンツ区画及びメニューバーは、階層化区画にセットされる。つまり、階層化区画の上に乗っているイメージとなる。以下はJRootPaneのコンストラクタ(前回の記事参照)で実行されているコンテンツ区画に関する処理。太字の部分で、階層化区画へコンテンツ区画をセットしている。(斜体箇所については[補足]参照)

public void setContentPane(Container content) {
    if(content == null)
        throw new IllegalComponentStateException("contentPane cannot be set to null.");
    if(contentPane != null && contentPane.getParent() == layeredPane)
        layeredPane.remove(contentPane);
    contentPane = content;

    layeredPane.add(contentPane, JLayeredPane.FRAME_CONTENT_LAYER);
}

 

次に、階層化区画とガラス区画はどちらもルート区画の子であるにもかかわらず、ガラス区画の方がより上の区画として表現されて理由について。

この上下関係は、JRootPaneクラス中の次のメソッドで表されている。

protected void addImpl(Component comp, Object constraints, int index) {
    super.addImpl(comp, constraints, index);
    /// We are making sure the glassPane is on top.
    if(glassPane != null
        && glassPane.getParent() == this
        && getComponent(0) != glassPane) {
        add(glassPane, 0);
    }
}

このメソッドは、JRootPaneにコンポーネントを追加するメソッドであるが、太字コメントにある通り、新しいコンポーネントが追加された後、ガラス区画が必ず最前面に来るようにセットしなおしていることがわかる。

以上が、各区画の上下関係について調べた結果である。

 

[補足]前述コード中の斜体の部分からは、JRootPaneのフィールドにも同じインスタンスをセットしているように見える、つまりオブジェクト図としては下のようになるのが正確なように思えるが、本筋とは関係ないと思われるため、今回考察は省略する。

swing07_rootpane_rel2

Eclipse3.3 JDTが使用しているコンパイラのバージョン確認方法

3.0のときに調べた結果はこちら

現在3.3.0を使用しているが、ふとコンパイラのバージョンが気になったので調べてみた。…現在はファイル名にバージョンが書かれている。

  1. pluginsディレクトリの下でファイル名"org.eclipse.jdt.core"を検索する。
  2. "org.eclipse.jdt.core_3.3.0.v_771.jar"が見つかる。

以上。上の結果より、バージョンは0.771であることがわかる。一応、コマンドラインでバージョン表示を行う方法も記載しておく。

pluginsディレクトリで下のコマンドを実行(実際には1行で記述する):
> java -cp org.eclipse.jdt.core_3.3.0.v_771.jar org.eclipse.jdt.internal.compiler.batch.Main -version

出力結果:
Eclipse Java Compiler 0.771, 3.3.0, Copyright IBM Corp 2000, 2007. All rights reserved.

« 2007年10月 | トップページ | 2007年12月 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ