Exemplo n.º 1
0
        //キャプチャしたデータの配列をメモリ空間内に固定し,ビットマップに変換する.
        void OnCaptureDone(double SampleTime, int BufferLength)
        {
            try {
                if (mAudioSampleGrabber == null)
                {
                    return;
                }

                //コールバック関数の利用を停止する
                mAudioSampleGrabber.SetCallback(null, 0);

                // 絶対値を合計する
                int sum   = 0;
                int count = 0;
                for (int index = 0; index < BufferLength; index += mAudioInfoHeader.nBlockAlign)
                {
                    short sample = getAbsAmplitude(index, mFrameArray);
                    sum += sample;

                    //Console.Write(sample + " ");
                    ++count;
                }
                int ave = sum / count;
                mSoundHistories.Add(new KeyValuePair <double, int>(SampleTime, ave));

                mFrameArray = null;
                mProcessing = false;

                return;
            } catch (Exception e) {
                SMMMessageBox.Show("エラー:音声のフレームのキャプチャ(Grab)に失敗しました。Error: Failed to capture the frame of audio.(Grab) " + e.ToString(), SMMMessageBoxIcon.Error);
            }
        }
Exemplo n.º 2
0
        //COMやインタフェースの解放を行う
        public void CloseInterfaces()
        {
            try
            {
                if (mVideoGrabFilter != null)
                {
                    mVideoGrabFilter = null;
                }

                if (mVideoSampleGrabber != null)
                {
                    Marshal.ReleaseComObject(mVideoSampleGrabber);
                    mVideoSampleGrabber = null;
                }

                if (mVideoCaptureFilter != null)
                {
                    mVideoCaptureFilter.Stop();
                    Marshal.ReleaseComObject(mVideoCaptureFilter);
                    mVideoCaptureFilter = null;
                }
            }
            catch (Exception e)
            {
                SMMMessageBox.Show("エラー:映像インタフェースの終了に失敗しました。Error: An error ocouured when closing video interface. " + e.ToString(), SMMMessageBoxIcon.Error);
            }
        }
Exemplo n.º 3
0
        //フレームキャプチャ完了時に呼び出されるコールバック関数
        int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLength)
        {
            // コールバックの処理中なら終了
            if (mProcessing)
            {
                return(0);
            }

            mProcessing = true;

            // 1. キャプチャするフレームデータのサイズを設定する.
            int size = mVideoInfoHeader.BmiHeader.ImageSize;

            mFrameArray = new byte [size + 64000];

            //メモリ内のサンプリングされたデータ(pBuffer)を配列(frameArray)にコピーする.
            if ((pBuffer != IntPtr.Zero) && (BufferLength > 1000) && (BufferLength <= mFrameArray.Length))
            {
                Marshal.Copy(pBuffer, mFrameArray, 0, BufferLength);
            }

            try
            {
                //CaptureDoneデリゲードを呼び出す.
                mForm1.BeginInvoke(new CaptureDone(this.OnCaptureDone), new object[] { SampleTime });
            }
            catch (Exception e)
            {
                SMMMessageBox.Show("エラー:映像データのサンプリング完了時の処理に失敗しました。Error: Failed to process when complete sampling of video data." + e.ToString(), SMMMessageBoxIcon.Error);
            }
            return(0);
        }
Exemplo n.º 4
0
        //フレームキャプチャ完了時に呼び出されるコールバック関数
        int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLength)
        {
            // コールバックの処理中なら終了
            if (mProcessing)
            {
                return(0);
            }

            mProcessing = true;

            mFrameArray = new byte[mAudioInfoHeader.nAvgBytesPerSec / 100];

            // メモリ内のサンプリングされたデータ(pBuffer)を配列(frameArray)にコピーする.
            if ((pBuffer != IntPtr.Zero) && (BufferLength <= mFrameArray.Length))
            {
                Marshal.Copy(pBuffer, mFrameArray, 0, BufferLength);
            }

            //Console.WriteLine("SampleTime:" + SampleTime);
            //Console.WriteLine("BufferLength:" + BufferLength);

            try {
                // CaptureDoneデリゲードを呼び出す.
                mForm1.BeginInvoke(new CaptureDone(this.OnCaptureDone), new object[] { SampleTime, BufferLength });
            } catch (Exception e) {
                SMMMessageBox.Show("エラー:音声データのサンプリング完了時の処理に失敗しました。Error: Failed to process when complete sampling of audio data." + e.ToString(), SMMMessageBoxIcon.Error);
            }

            return(0);
        }
Exemplo n.º 5
0
        //COMやインタフェースの解放を行う
        public void CloseInterfaces()
        {
            try
            {
                if (mediaControl != null)
                {
                    mediaControl.Stop();
                    Thread.Sleep(100);
                    mediaControl = null;
                }

                if (mediaEvent != null)
                {
                    mediaEvent.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
                    mediaEvent = null;
                }

                if (videoWindow != null)
                {
                    videoWindow.put_Visible(OABool.False);
                    videoWindow.put_Owner(IntPtr.Zero);
                    videoWindow = null;
                }

                if (captureGraphBuilder != null)
                {
                    Marshal.ReleaseComObject(captureGraphBuilder);
                    captureGraphBuilder = null;
                }

                if (graphBuilder != null)
                {
                    Marshal.ReleaseComObject(graphBuilder);
                    graphBuilder = null;
                }

                if (mVideoChecker != null)
                {
                    mVideoChecker.CloseInterfaces();
                    mVideoChecker = null;
                }
                //if (mAudioChecker != null)
                //{
                //	mAudioChecker.CloseInterfaces();
                //	mAudioChecker = null;
                //}
            }
            catch (Exception e)
            {
                SMMMessageBox.Show("エラー:インタフェースの終了に失敗しました。Error: An error ocouured when closing video interface. " + e.ToString(), SMMMessageBoxIcon.Error);
            }
        }
Exemplo n.º 6
0
        private void Button_Save_Click(object sender, EventArgs e)
        {
            // 画面の内容を設定ファイルに保存
            Preferences prefs = Preferences.Instance;

            prefs.mVideoDeviceName = ComboBox_VideoDeviceName.Text.ToString();
            //prefs.mAudioDeviceName = ComboBox_AudioDeviceName.Text.ToString();
            prefs.SaveToFile();
            SMMMessageBox.Show("保存しました。", SMMMessageBox.SMMMessageBoxIcon.Information);
            this.DialogResult = DialogResult.OK;

            Close();
        }
Exemplo n.º 7
0
        private bool SetDevice()
        {
            DsDevice audioDevice = GraphFactory.GetDevice(FilterCategory.AudioInputDevice, GraphFactory.DEVICE_TYPE.AUDIO);

            if (audioDevice == null)
            {
                SMMMessageBox.Show("エラー:音声デバイスが選択されませんでした。Error: Audio device is not selected.", SMMMessageBoxIcon.Warning);
                return(false);
            }

            // 音声のキャプチャデバイス(device)とソースフィルタ(captureFilter)を対応付ける.
            mAudioCaptureFilter = GraphFactory.GetCaptureFilter(audioDevice);

            return(true);
        }
Exemplo n.º 8
0
 //COMやインタフェースの解放を行う
 public void CloseInterfaces()
 {
     try
     {
         if (mAudioCaptureFilter != null)
         {
             mAudioCaptureFilter.Stop();
             Marshal.ReleaseComObject(mAudioCaptureFilter);
             mAudioCaptureFilter = null;
         }
     }
     catch (Exception e)
     {
         SMMMessageBox.Show("エラー:音声インタフェースの終了に失敗しました。Error: An error ocouured when closing audio interface. " + e.ToString(), SMMMessageBoxIcon.Error);
     }
 }
Exemplo n.º 9
0
        public static string[] GetDeviceNameList(Guid FilterCategory)
        {
            DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory);

            //PCに接続されているキャプチャデバイス(USBカメラなど)のリストを取得.
            if (devices == null || devices.Length == 0)
            {
                SMMMessageBox.Show("エラー:キャプチャ可能なデバイスが見つかりません。Error: Device that can be captured could not be found.", SMMMessageBoxIcon.Error);
                return(null);
            }
            string[] deviceNames = new string[devices.Length];
            for (int i = 0; i < devices.Length; ++i)
            {
                deviceNames[i] = devices[i].Name;
            }
            return(deviceNames);
        }
Exemplo n.º 10
0
        private bool SetDevice()
        {
            // 1. デバイスを取得
            DsDevice videoDevice = GraphFactory.GetDevice(FilterCategory.VideoInputDevice, GraphFactory.DEVICE_TYPE.VIDEO);

            if (videoDevice == null)
            {
                SMMMessageBox.Show("エラー:映像デバイスが選択されませんでした。Error: Video device is not selected.", SMMMessageBoxIcon.Warning);
                return(false);
            }

            // 2. キャプチャデバイスをソースフィルタに対応づける.

            // 映像のキャプチャデバイス(device)とソースフィルタ(captureFilter)を対応付ける.
            mVideoCaptureFilter = GraphFactory.GetCaptureFilter(videoDevice);

            return(true);
        }
Exemplo n.º 11
0
        public int update()
        {
            //Console.WriteLine("nAvgBytesPerSec:" + mAudioInfoHeader.nAvgBytesPerSec);
            //Console.WriteLine("nBlockAlign:" + mAudioInfoHeader.nBlockAlign);
            //Console.WriteLine("nChannels:" + mAudioInfoHeader.nChannels);
            //Console.WriteLine("nSamplesPerSec:" + mAudioInfoHeader.nSamplesPerSec);
            //Console.WriteLine("wBitsPerSample:" + mAudioInfoHeader.wBitsPerSample);
            //Console.WriteLine("wFormatTag:" + mAudioInfoHeader.wFormatTag);

            /*
             *  nAvgBytesPerSecは必須平均データ転送レートを バイト/秒 単位で指定します
             *      PCM の場合、通常はサンプリングレート * nBlockAlign を指定します
             *
             *      nBlockAlign は、指定フォーマットの最小単位のデータサイズを指定します
             *      これをブロックアラインメントと呼び
             *      PCM の場合、このメンバには nChannels * wBitsPerSample / 8 を指定します
             *
             *      nAvgBytesPerSec:192000
             *      nBlockAlign:4
             *      nChannels:2 ステレオかモノラルか
             *      nSamplesPerSec:48000 サンプリングレート。1秒間に何個のサンプルをとるか
             *      wBitsPerSample:16 サンプルあたりのビット数を指定します
             *      wFormatTag:1
             *
             *      計算式:
             *      nBlockAlign = nChannels * wBitsPerSample / 8
             *      nAvgBytesPerSec = nSamplesPerSec * nBlockAlign
             */

            try
            {
                //ビデオデータのサンプリングに利用するコールバック メソッドを指定する.
                //第一引数	 ISampleGrabberCB インターフェイスへのポインタ
                //			 nullを指定するとコールバックを解除
                //第二引数	0->ISampleGrabberCB.SampleCB メソッドを利用
                //			1->ISampleGrabberCB.BufferCB メソッドを利用
                result = mAudioSampleGrabber.SetCallback(this, 1);
            }
            catch (Exception e)
            {
                SMMMessageBox.Show("エラー:音声データのサンプリングコールバックの実行に失敗しました。Error: Failed to run sampling callback of audio data." + e.ToString(), SMMMessageBoxIcon.Error);
            }
            return(result);
        }
Exemplo n.º 12
0
        private void SaveButton_Click(object sender, EventArgs e)
        {
            string message = checkInput();

            if (message != "")
            {
                SMMMessageBox.Show(message, SMMMessageBoxIcon.Information);
                return;
            }

            DeathSetting s = DeathSetting.Instance;

            s.PastTimeRange = double.Parse(TextBox_PastTimeRange.Text);
            s.setDeadSpan(int.Parse(TextBox_DeathSpan.Text));
            s.DeadPixelValueThreshold = int.Parse(TextBox_PixelValueThreshold.Text);
            s.DeadAmplitudeThreshold  = int.Parse(TextBox_AmplitudeThreshold.Text);

            s.SaveToFile();

            this.Close();
        }
Exemplo n.º 13
0
        public int update()
        {
            if (mVideoSampleGrabber == null)
            {
                return(-1);
            }

            int result = -1;

            try
            {
                //ビデオデータのサンプリングに利用するコールバック メソッドを指定する.
                //第一引数	 ISampleGrabberCB インターフェイスへのポインタ
                //			 nullを指定するとコールバックを解除
                //第二引数	0->ISampleGrabberCB.SampleCB メソッドを利用
                //			1->ISampleGrabberCB.BufferCB メソッドを利用
                result = mVideoSampleGrabber.SetCallback(this, 1);
            }
            catch (Exception e)
            {
                SMMMessageBox.Show("エラー:映像データのサンプリングコールバックの実行に失敗しました。Error: Failed to run sampling callback of video data." + e.ToString(), SMMMessageBoxIcon.Error);
            }
            return(result);
        }
Exemplo n.º 14
0
        private bool directShowInitialize()
        {
            try
            {
                mVideoChecker = new VideoChecker(this);
                //mAudioChecker = new AudioChecker(this);

                //mVideoChecker.Test();

                // 3. フィルタグラフマネージャを作成し,各種操作を行うためのインタフェースを取得する.

                //graphBuilderを作成.
                graphBuilder = GraphFactory.MakeGraphBuilder();

                //各種インタフェースを取得.
                mediaControl = (IMediaControl)graphBuilder;
                videoWindow  = (IVideoWindow)graphBuilder;
                mediaEvent   = (IMediaEventEx)graphBuilder;


                // 4. キャプチャグラフビルダと,サンプルグラバフィルタ(個々のビデオデータを取得するフィルタ)を作成する.

                //キャプチャグラフビルダ(captureGraphBuilder)を作成.
                captureGraphBuilder = GraphFactory.MakeCaptureGraphBuilder();

                // 5. 基本となるフィルタグラフマネージャ(graphBuilder)にキャプチャグラフビルダと各フィルタを追加する.

                //captureGraphBuilder(キャプチャグラフビルダ)をgraphBuilder(フィルタグラフマネージャ)に追加.
                result = captureGraphBuilder.SetFiltergraph(graphBuilder);
                if (result < 0)
                {
                    Marshal.ThrowExceptionForHR(result);
                }


                // 1. デバイスを取得し、2. キャプチャデバイスをソースフィルタに対応づける.
                // 6. 各フィルタの接続を行い,入力画像のキャプチャとプレビューの準備を行う.
                bool ret = mVideoChecker.AddVideoFilters(graphBuilder, captureGraphBuilder);
                if (!ret)
                {
                    //SMMMessageBox.Show("エラー:映像入力デバイスが見つかりませんでした。\nプログラムを終了します。Error: Any video devices are not found.\n Closing this application.", SMMMessageBoxIcon.Error);
                    return(false);
                }

                //ret = mAudioChecker.AddAudioFilters(graphBuilder, captureGraphBuilder);
                //if (!ret) {
                //	SMMMessageBox.Show("エラー:音声入力デバイスが見つかりませんでした。\nプログラムを終了します。Error: Any audio devices are not found.\n Closing this application.", SMMMessageBoxIcon.Error);
                //	return false;
                //}

                // 7. プレビュー映像(レンダラフィルタの出力)の出力場所を設定する.

                //プレビュー映像を表示するパネルを指定.
                result = videoWindow.put_Owner(this.panel1.Handle);
                if (result < 0)
                {
                    Marshal.ThrowExceptionForHR(result);
                }
                //ビデオ表示領域のスタイルを指定.
                result = videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren);
                if (result < 0)
                {
                    Marshal.ThrowExceptionForHR(result);
                }
                //ビデオパネルのサイズを変更する.
                Rectangle rect = this.panel1.ClientRectangle;
                videoWindow.SetWindowPosition(0, 0, rect.Right, rect.Bottom);

                //レンダラフィルタの出力を可視化する.
                result = videoWindow.put_Visible(OABool.True);
                if (result < 0)
                {
                    Marshal.ThrowExceptionForHR(result);
                }



                // 8. DirectShowイベントを,Windowsメッセージを通して通知するための設定を行う.

                // mediaEvent(DirectShowイベント)をWM_GRAPHNOTIFY(Windowsメッセージ)に対応付ける.
                result = mediaEvent.SetNotifyWindow(this.Handle, WM_GRAPHNOTIFY, IntPtr.Zero);
                if (result < 0)
                {
                    Marshal.ThrowExceptionForHR(result);
                }



                // 9. プレビューを開始する.

                result = mediaControl.Run();
                if (result < 0)
                {
                    Marshal.ThrowExceptionForHR(result);
                }
            } catch (Exception e)
            {
                SMMMessageBox.Show(e.Message, SMMMessageBoxIcon.Error);
                return(false);
            }
            return(true);
        }
Exemplo n.º 15
0
        //キャプチャしたデータの配列をメモリ空間内に固定し,ビットマップに変換する.
        void OnCaptureDone(double SampleTime)
        {
            try
            {
                int result;
                if (mVideoSampleGrabber == null)
                {
                    mFrameArray = null;
                    mProcessing = false;
                    return;
                }

                //コールバック関数の利用を停止する
                result = mVideoSampleGrabber.SetCallback(null, 0);

                //フレームデータのサイズを取得
                int width  = mVideoInfoHeader.BmiHeader.Width;
                int height = mVideoInfoHeader.BmiHeader.Height;

                //widthが4の倍数でない場合&widthとheightの値が適正でない場合は終了.
                if (((width & 0x03) != 0) || (width < 32) || (width > 4096) || (height < 32) || (height > 4096))
                {
                    mFrameArray = null;
                    mProcessing = false;
                    return;
                }

                //stride(1ライン分のデータサイズ(byte)=width* 3(RGB))を設定.
                int stride = width * 3;

                //配列frameArrayのアドレスを,メモリ空間内で固定する.
                GCHandle gcHandle = GCHandle.Alloc(mFrameArray, GCHandleType.Pinned);

                int addr = (int)gcHandle.AddrOfPinnedObject();
                addr += (height - 1) * stride;

                //frameArrayを格納したメモリアドレスから,ビットマップデータを作成.
                Bitmap bitmap = new Bitmap(width, height, -stride, PixelFormat.Format24bppRgb, (IntPtr)addr);
                gcHandle.Free();

                // 画像を高速に扱えるオブジェクトに格納
                FastBitmap bitmapPlus = new FastBitmap(bitmap);

                // ゲームの状態を分析して更新
                bitmapPlus.BeginAccess();
                UpdateGameState(bitmapPlus);
                bitmapPlus.EndAccess();

/*
 *                              Image pre = null;
 *
 *                              //画面上にキャプチャした画像を表示する.
 *
 *                              pre = this.pictureBox1.Image;
 *                              this.pictureBox1.Image =  bitmap;
 *
 *
 *                              if(pre != null) pre.Dispose();
 */
                mFrameArray = null;
                mProcessing = false;

                return;
            }
            catch (Exception e)
            {
                SMMMessageBox.Show("エラー:映像のフレームのキャプチャ(Grab)に失敗しました。Error: Failed to capture the frame of video.(Grab) " + e.ToString(), SMMMessageBoxIcon.Error);
            }
        }