なんと動画をまとめてレイヤー状態で再生できるプレーヤーを作ってみました。レイヤー状態なのでいろいろとおもしろい効果を見ることができるかもしれません。
ソフトウェアの部屋よりダウンロードができます。なお、どうでもいいですが、今回は初めからバージョンは1.00として公開します。
動画をレイヤー状態で描画とは・・・
ちなみに作った目的をreadmeには詳しく書いていないのでblogでかきますが、二つ目的があり、
- 再生している曲は同じだが微妙に演出がちがう2つの動画を重ねて見比べる
- いわゆる「人物違い」の動画を並べて同時再生してみる
だったりします。後者については美少女ゲームのOPなんかでは2ndOPで見ることができるタイプのものです。特にゲーム名は限定しませんが。
同時に再生できて並べて表示ができる動画プレーヤーはないことはないですが、今回のように
- 再生している画像を「重ねて」表示する(半透明描画など)
- それぞれの動画オブジェクトを「完全に同時に」再生する
- 開始時間に時差がある場合、その時差を含めて再生命令を行える
ことはできないのが痛いですね。この手のプログラムはだいたいWindowsMediaPlayerの機能を借りてきてプログラムに組み込んでいるだけなので同時処理がどうしても甘くなりがちなのと、指定した時間だけずらして再生を行うといった動作ができないですからね。
それを解決するためにこういうものを作ってみたわけですよ。はい。なので特に「できる限り同時に(もしくは指定した時間差をつけて)」再生を実行する、ことにかなり重点が置かれています。おそらくCPUコアの個数が再生しようとしてる動画の数を上回っているならほぼ確実に同時に再生が始まるように設計されています。映像がない音だけのものでも同時再生を行うことができるのが強みですね。
また、動画を「レイヤー状態」で表示するようにしているので描画時に透過率を含めた描画(動画が透過率を持っている場合に透過率を有効にする、レイヤーを描画するときに透過率を含める)や、拡大縮小、一部分のみの描画と言った特殊な表示再生を得意としています。
ベースとなるプログラムは自前ADVシステムからの借り物
特に「レイヤー状態での描画」と「動画管理」を使っています。描画はDirect3D9経由、動画管理はDirectShow経由で行っています。
なので、実際は「レイヤーとして描画」ではなく、一度テクスチャを作った上で「ポリゴンとして描画」しているのでちょっと設定を増やせば3D的に描画ができたりします。意味はほぼなさそうなのでいまのところは放置です。そんな要望があるとも思えませんからね。あるとおもしろいですが。
まあ、おかげで違う意味で苦労しました。Direct3D9+DirectShowで設計することは決めていたものの、初めはコードをサブセットで実装しようかと思いあまりにも面倒になってキャンセル。次に元々ADVシステム用(ウィンドウのリサイズなどが考慮されていなかったり、デバイスのリセットが固定されている)だったのをコードを追加して何とか対応しようとしてごにょごにょ。おまけに「完全に同時に再生する」と言うことからかなりの数のスレッドを使うことになって同期処理で一度訳がわからなくなりかかったり。
少し大きくなるとそれなりに設計しないとどこがどうなるのか考えるのが面倒になりますね。
機能要望があればこのblogのコメントや掲示板にでも
今のところは動画再生以外は余り機能を積んでいません。一応「レイヤーとして描画」を意識しているのでその部分の設定(透過率および描画領域)はそれなりですが。readmeにも書いたとおり拡張を考えている部分がないわけではないですが、余り意味がなさそうなんですよね。
動画再生プログラム自身は特殊なものであればそこまで不要というわけでもないでしょうから何かあることを期待しながら。
ついでにバグフィックスも
今回のテストのおかげでライブラリにあったバグを修正することができました。おかげで一部のプログラムを修正して公開することに。
放置しないでたまにこういうのをやらないとだめになるものですね。いろいろと成果が得られたかな、というところです。
さらについでですが、結局ダウンロードカウンタを外しました。まあ無くてもいまのところ大丈夫でしょう、と。必要になったらphp版で組んでみようかと思います。