元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。
Javaとか組込とかできます。お仕事ください。

EM-ONEでDirectshow使ってリアルタイムキャプチャ

とりあえずC#からも呼び出せるようになりました。

インタフェイス系の実装は終わったから、明日からSDK部分をつくろうかな。


C#ならこんなかんじのコードで使います。
終了処理とかがえらくイイカゲンなのは気にしないで下さい。

namespace DllTestCS
{

    public partial class Form1 : Form, INySampleCB
    {
        NyWMCapture  capture;
        INyWMCapture capif;
        PictureBox   pictureBox1;
        public Form1()
        {
            InitializeComponent();
        }
        Bitmap bmp=new Bitmap(240,320);
        byte[] bmp_tmp = new byte[320 * 240 * 2];
        private delegate void myDelegate();
        public void dg()
        {
            this.pictureBox1.Image = bmp;
            return;
        }
        public int OnSample(IntPtr i_data, Int32 i_length)
        {
            BitmapData bd = this.bmp.LockBits(
                new Rectangle(0, 0,240,320),
                ImageLockMode.WriteOnly,
                PixelFormat.Format16bppRgb565);
            //ビットマップデータのコピー
            //もうちょっとうまい方法ないのかな?
            Marshal.Copy(i_data, bmp_tmp, 0, i_length);
            Marshal.Copy(bmp_tmp, 0, bd.Scan0, i_length);
            this.bmp.UnlockBits(bd);
            myDelegate d = new myDelegate(dg);
            this.Invoke(d);
            return 0;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.pictureBox1=new PictureBox();
            this.pictureBox1.Size=new Size(240,320);
            this.Controls.Add(this.pictureBox1);
            this.capture = new NyWMCapture();
            this.capif = (INyWMCapture)capture;
            int hr;
            hr = this.capif.SetCallBack(this);
            hr = this.capif.Initialize(
                NyWMCapture.NyWMCapture_DeviceId_S01SH,
                NyWMCapture.NyWMCapture_MediaSubType_RGB565,
                NyWMCapture.NyWMCapture_PinCategory_PREVIEW);
            hr = this.capif.Start();
        }
    }
        
}


DLLのソースも公開したいけど、コンパイルのためのSDK設定がえらくめんどーなんで、どうするか思案中。

当分はバイナリだけでもいいかな。