//キャプチャしたデータの配列をメモリ空間内に固定し,ビットマップに変換する. 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); } }
//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); } }
//フレームキャプチャ完了時に呼び出されるコールバック関数 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); }
//フレームキャプチャ完了時に呼び出されるコールバック関数 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); }
//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); } }
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(); }
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); }
//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); } }
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); }
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); }
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); }
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(); }
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); }
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); }
//キャプチャしたデータの配列をメモリ空間内に固定し,ビットマップに変換する. 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); } }