2016/10/29

WPF(Livet)とOpenCVSharpで動画再生

動画の再生を行います。

ほぼ下のサイトのコピーですが。。。
http://sourcechord.hatenablog.com/entry/2014/10/05/022144


まずはXAMLです。
    
        
        

次はModelViewです。
ボタンを押すとファイル選択ダイヤログを表示して、
動画ファイルを選択すると 自動的に動画再生を行うようになります。

また、動画再生中にウィンドウがフリーズしないよう、async,awaitで非同期処理を行っています。

using Microsoft.Win32;
using System.Windows;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace LivetSample.ViewModels
{
    public class MainWindowViewModel : ViewModel
    {
        public void Initialize()
        {
        }

        #region FileUri変更通知プロパティ
        private string _FileUri;

        public string FileUri
        {
            get
            { return _FileUri; }
            set
            { 
                if (_FileUri == value)
                    return;
                _FileUri = value;
                RaisePropertyChanged();
            }
        }
        #endregion

        #region WBitmap変更通知プロパティ
        private WriteableBitmap _WBitmap;

        public WriteableBitmap WBitmap
        {
            get
            { return _WBitmap; }
            set
            { 
                if (_WBitmap == value)
                    return;
                _WBitmap = value;
                RaisePropertyChanged();
            }
        }
        #endregion

        #region FileOpenCommand
        private ViewModelCommand _FileOpenCommand;

        public ViewModelCommand FileOpenCommand
        {
            get
            {
                if (_FileOpenCommand == null)
                {
                    _FileOpenCommand = new ViewModelCommand(FileOpen);
                }
                return _FileOpenCommand;
            }
        }

        public async void FileOpen()
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = "ファイルを開く";
            dlg.Filter = "動画ファイル|*.avi";
            if (dlg.ShowDialog() == true)
            {
                FileUri = dlg.FileName;
                await ShowImage();
            }
        }
        #endregion

        private async Task ShowImage()
        {
            using (var cap = new CvCapture(FileUri))
            {
                int interval = (int)(1000 / cap.Fps);
                IplImage img;
                while ((img = cap.QueryFrame()) != null)
                {
                    WBitmap = img.ToWriteableBitmap();
                    await Task.Delay(interval);
                }
            }
        }
    }
}



0 件のコメント:

コメントを投稿