Visual StudioでCシャープを使って動画を表示させる方法の紹介です。単純に見せるだけならWindows Mediaを貼り付ければよいでしょう。細かい制御をしようとするとOpenCVライブラリを利用する必要があるかもしれません。
C#で動画を表示する
Winndows Mediaを利用する
動画再生で手っ取り早いのはWindwos Media Playerコンポーネントを使うことです。
ツールボックスで右クリックし「アイテムの選択」を実行。
次に「COMコンポーネント」のタブで「Windwos Media Player」にチェックを入れます。
するとツールボックスにWindwos Media Playerのコンポーネントができますので、選択後にフォーム上でドラッグして配置します。
プログラムでは
using AxWMPLib;
としたうえで
axWindowsMediaPlayer1.URL= "c:/_work/sample.mp4";
axWindowsMediaPlayer1.Ctlcontrols.play();
のように記述すると、再生ファイルを選んで動画が開始します。
外観のユーザインタフェースを消すには「axWindowsMediaPlayer1.uiMode = "none";」という記述を追加します。
自動開始をオンにするには「axWindowsMediaPlayer1.settings.autoStart = true;」のように記述します。
OpenCV
動画でゴルフスイングや振り付けなどをコマ送りで確認するためのプログラムを作ろうと思ったのですが、ウィンドウズメディアではうまく制御できませんでした。
具体的には、再生位置を変更はできるのですが画面がリフレッシュされません。
リフレッシュのために動画の再生コマンドを使うと、指定フレームから先へ進んでしまうため、思い通りに動かせませんでした。
OpenCVは顔認識用ライブラリですが、動画再生の機能もあります。
まずNuGetを使って「OpenCVSharp4」「OpenCVSharp4.runtime.win」をインストールします。
プログラムでは
using OpenCvSharp;
using OpenCvSharp.Extensions;
として宣言をしておきます。
動画の初期化では、pathで動画のフルパスを設定しておきます。
VideoCaptureを作り、「IsOpened」でチェックします。
他の方の参考プログラムを見てみるとWhileでループで回していますが、インタフェースをいろいろつけたいのでTimerを使ってみました。
Timerのインターバルを動画のFPS(フレームパーセカンド)の値から算出するようにしました。スレッドで処理してもいいかもしれません。
VideoCapture vcap;
string path = "動画パス";
private void videoOpen(){
vcap = new VideoCapture(path);
if (!vcap.IsOpened())
{
MessageBox.Show("読み込めません!すんません");
return;
}timer1.Interval = (int)(1000 / vcap.Fps);
}
動画の表示部は以下のような感じです。タイマーでのイベント処理で、Mat形式のデータを作成。
vcapでreadで画像データを読み込ませた後、フォームに張ったpictureBoxへ転送するような感じになります。
private void timer1_Tick(object sender, EventArgs e)
{Mat mat = new Mat();
if (vcap.Read(mat))
{
if (mat.IsContinuous())
{
bmp = BitmapConverter.ToBitmap(mat);
pictureBox1.Image = bmp;
mat.Dispose();//Memory release}
}
}
動画全体のフレーム数は「vcap.FrameCount」で取得できます。
再生位置を指定するには「vcap.PosFrame」へフレーム番号を入れます。
C#でUSBウェブカメラ入力を表示する
AForge
カメラを利用する場合「NuGet」から「aForge.Video」「aForge.Video.DirectShow」「aForge.Video.Control」をインストールします。
最も手軽に表示するには、ツールボックスから「アイテムの選択」を実行。
ソリューション内にある「aForge.Video.Control」の「AForge.Controls.dll」を参照すると、ツールボックスに「VideoSourcePlayer」ができるのでフォームに追加します。
Form起動時などに、選択ダイアログを表示して選ばれたらそのカメラをソースにする設定だけで表示がすぐできます。
「using AForge.Video;」として置いたうえで、
var form = new VideoCaptureDeviceForm(); if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK) { videoSourcePlayer1.VideoSource = form.VideoDevice; videoSourcePlayer1.Start(); }
のように記述します。
キャプチャも以下のようなソースで行えます。
var bmp = videoSourcePlayer1.GetCurrentVideoFrame(); bmp.Save("temp.bmp");
デバイス一覧を取得する場合にはコンボボックスを用意して
「private FilterInfoCollection videoDevices;」を宣言したのち、
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) { MessageBox.Show("カメラがみつかりませんYO"); return; } comboBox1.Items.Clear(); foreach (FilterInfo device in videoDevices) { comboBox1.Items.Add(device.Name); }
のように記述します。