DirectShow関係4(クラスライブラリ)
2.サンプル
Play
動画ファイルを再生するサンプルです。
起動するとフォーム内で動画を再生させます。
最も基本的なサンプルで、全ソースを下記に示します。
これだけで動画を再生できます。
Option Explicit
On Option Strict On '////////////////////////////////////////////////////////////// 'DShowLib サンプル Play '・フォーム内で動画を再生させるサンプルです。 '・フォームのサイズに合わせて、動画の縦横比を保ちながらサイズを調整します。 '////////////////////////////////////////////////////////////// 'DirectShowクラスライブラリ Imports DShowLib '-------------------------------------------------------------- Public Class Form1 'モジュール変数 Private mGrp As IGraphBuilder 'グラフ 'フォームロード時 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'グラフ生成 mGrp = CreateNewGraph() 'グラフ構築 mGrp.RenderFile("C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\Media\Video\ruby.avi") 'フォーム内で縦横比を保って再生するように設定 SetVideoRendererOwner(mGrp, Me, RendererScale.KeepAspect) '再生開始 GraphPlay(mGrp) End Sub 'フォームクローズ時 Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed 'グラフの停止 GraphStop(mGrp) 'グラフの破棄 ReleaseInstance(mGrp) End Sub 'フォームサイズ変更時 Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize 'フォーム内で縦横比を保って再生するように再設定 SetVideoRendererOwner(mGrp, Me, RendererScale.KeepAspect) End Sub End Class |
PlayLoop
動画ファイルを連続再生(ループ再生)させるサンプルです。
起動するとフォーム内で動画が連続再生されます。
PlayLoopStart/PlayLoopStopを使えば動画や音楽を連続再生させることができます。
サンプルでは再生回数をカウントする為デリゲートを指定していますが、
単に連続再生させるだけなら指定する必要はありません。
例)簡単な連続再生
mLoopThread = PlayLoopStart(mGrp)
ループはメディアの終端まで再生位置が進んだら先頭に戻すという処理を行っているだけです。
注意しなければならないのは、この終端チェック(ループ監視)を別スレッドで行っているため
グラフを停止させたあとすぐにグラフを破棄するような場合監視スレッドが終了するの待つ必要がある点です。
具体的はPlayLoopStartの戻り値(System.Threading.Threadです)を指定しPlayLoopStopを呼び出すか、
戻り値のJoinメソッドを呼び出します。
すぐにグラフを破棄しないのであれば、この処理は必須ではありません。(PlayLoopの戻り値を保存しておく事も不要)
あと、逆転再生とかには対応してません。
Seek
再生位置の取得/設定を行うサンプルです。
現在の再生位置をスライドバーで表現し、
スライドバーで再生位置を変更できます。
メディアの再生時間はIMediaPositionのget_Durationで取得します。
現在の再生位置の取得はget_CurrentPositionメソッドで行い、
put_CurrentPositionメソッドで再生位置を設定します。
CameraView
カメラ(ビデオキャプチャデバイス)の映像を表示します。
このサンプルでは、利用可能なカメラをコンソールに出力した後、
はじめに見つかったカメラを使用しライブ映像をウィンドウ内に表示ます。
複数のカメラがある場合(TVキャプチャボードとUSBカメラがつながってるとかの場合)、
camflt =
CreateFilter(DSConst.FilterCategoryGUID.CLSID_VideoInputDeviceCategory, 0) '0番のフィルタ使用
上記の 0 の部分を変えてください。
CameraSelect
カメラをユーザに選択させてライブ映像を表示します。
基本的にCameraViewと同じです。
カメラの選択にDSUSelectCameraDialogを使用しています。
なおカメラを選択するときにフィルタやピンのプロパティページを表示させて変更することができます。
また出力フォーマットを選択することもできます。
Snap
カメラから静止画を取得します。
左側の映像をクリックすると静止画を取得し右側に表示します。
掲示板やメールで一番リクエストの多い「やりたい事」のサンプルです。(^^;
VB6では取得したビットマップを表示するのにちょっと面倒でしたが、
.Netでは便利な機能(Bitmapのコンストラクタ)があるので
とってもすっきりしたものになってます。
Snap2
カメラから静止画を取得します。
「Snap」と同様に、左側の映像をクリックすると静止画を取得し右側に表示します。
動作&見た目は「Snap」と同様ですが、
グラフ生成と静止画の取得に「FrameCapture」クラスを使用していますので
コードがだいぶ短くなっています。
Capture
カメラからの映像を動画ファイルに保存します。
保存するときのエンコード方式を選択できます。
InfinitePinTeeフィルタを用いて
録画しながらプレビュー表示も行っています。
またエンコーダが指定された場合そのフィルタの追加などをやっています。
この為グラフ生成が複雑に見えるかもしれませんが、
やってるのはフィルタをグラフに入れて、ピンを探して、くっつける
という操作を何度もやってるだけです。
SoundWave
音声ファイルを再生し、再生位置の波形をリアルタイムで表示します。
「DirectShow関係3」のサンプル集で公開しているやつをDShowLibを使って作ってみたやつです。
(DCTモジュールとか多くを流用しています。グラエコ風とかちょっと遊び心を加えてます。)
Telop
VMR9の機能を使い、動画に静止画を合成して再生します。
サンプルソースでははじめに見つかったカメラの映像に
現在時刻を表す時計を(半透明で)重ねて表示します。
StreamBuffer
ストリームバッファを用いてカメラからの入力をファイルに保存します。
常にプレビューを表示させておきながら任意のタイミングで録画を開始/終了できます。
サンプル「Capture」でも同様のことが可能ですが、
いちいちグラフを作り直す必要があるため、見た目的に美しくありません。
ストリームバッファを使うとキャプチャするグラフと保存するグラフが分離しているので
プレビュー表示はずっと表示したままになり、なんとなくスマートに見えます。