2013年2月19日火曜日

【WPF】MediaElementを指定時間で止めてサムネイルを作成する


さて,今回はWPF.
ここにきて初めてWPFを触った.
WindowsMetroアプリケーションと同じ感じで作れるね.
っていうか根本的にはWindowsMetroがWPFと同じ感じで作れるってことなんだろうけど.

今回やりたいのは
MediaElementにムービーを設定して,
指定した時間のサムネイルが取得したい.

例えばソースを読み込んだ後,Playボタンが押されるまでは再生せずに(自動再生しない)
MediaElementには5秒ぐらいの再生位置で一時停止,表示させたい.

残念ながら完璧にはいかなかったので
うまいやりかたがあるのなら教示いただきたい.

SyntacsHilighter使うまでもないくらいなのだが.
UIに設置するMediaElement


自動再生が行われないようにLoadedBehaviorをManualにしている.
こいつにソースを設定する.


ソースを設定する際に直後にMediaElement.Pause()を呼び出してやれば
MediaOpenedイベントが発行される.
つまり,ここでいうところのmedia_MediaOpenedメソッドが実行される.

さて,ここで一旦話を変えて
クラスフィールドとしてデリゲートを作ってしまおう.


実際にMediaElementを操作する関数を作る.


なぜこのようになったかというと
・Pause中にPositionを変更しても再生するまでUIには反映されない
・Play()/Pause()を連続して呼び出した場合,早すぎて再生準備中に停止が発行される

ただし,このメソッドをUIスレッドで動かすと
ムービーの再生準備からスレッドをがっちりロックして
指定位置にくるまで離さないので当然別スレッドで動かしたくなる.

今回はXP SP3でも動作させるために.net 4.5などというハイカラなものは使わずに
.net 3.5を指定しているためasync/awaitなぞ使えない.

そのため,別スレッドで動かしつつディスパッチャにてUIスレッドに送り込む
先に作ったのはそのためのデリゲートだった.

というわけで,サムネイル(語弊あるけど)を作成するためのメソッドを作る


あとはMediaOpenedのタイミングでこのGetThumbnailを呼び出す


以上.
本当にサムネイル(ビットマップ)が欲しい場合は
http://ameblo.jp/nakdoll/entry-11133396303.html
このあたりを参考に~

0 件のコメント:

コメントを投稿