Direct ShowでUSBカメラキャプチャーする方法と処理時間の調査

このQ&Aのポイント
  • Direct Showを使用してUSBカメラをキャプチャーする方法と、処理時間の調査について質問させていただきます。
  • 現在、6台のUSBカメラを接続しており、連続して撮影を行っていますが、キャプチャーには時間がかかっているようです。
  • プログラムの処理時間を計測した結果、640x480画素モードでは160mS、1600x1200画素モードでは620mSかかっていました。この処理時間は正常なのでしょうか?また、処理時間を短くする方法はありますか?
回答を見る
  • ベストアンサー

Direct Show でUSBカメラキャプチャー

Direct showでUSBカメラキャプチャーしようとしています。 現在、6台のUSBカメラを接続し、連続して撮影をしています。 問題はキャプチャーする時間が長く、640x480画素モードで1000mS、1600x1200画素モードで2000ms程かかります。 Direct Showを使用する場合、この程度かかるのは普通でしょうか。 試しにプログラムに時間計測させた所、 FMediaControl->Run(); で640x480 の時160mS 1600x1200の時620mS(カウンター2-3間) FMediaControl->Stop(); で640x480 の時310mS 1600x1200の時330ms(カウンター5-6間) かかって居ました。 プログラム自体は先人が作成したもので、私はDirectXが良く分からないので、これから勉強し、時間が短く出来るのであれば挑戦したいと思って居ます。 ただ、他の開発時間も足りないので、初めからこの位かかるのが正常ならばここの部分はそのままにして置きたいと思い、質問させて頂きました。    下記に使用して居るプログラムの抜粋を記します。 この処理時間が正常なのか、正常で無い場合、考えられる原因、若しくは原因の調査の仕方をお教え頂ければ幸いです。 DWORD dTime0; DWORD dTime1; DWORD dTime2; DWORD dTime3; DWORD dTime4; DWORD dTime5; DWORD dTime6; dTime0 = GetTickCount(); FCurrentCam = Cam; FCaptured = false; dTime2 = GetTickCount() - dTime0; hr = FMediaControl->Run(); dTime3 = GetTickCount() - dTime0; DWORD dTime0; DWORD dTime1; DWORD dTime2; DWORD dTime3; DWORD dTime4; DWORD dTime5; DWORD dTime6; dTime0 = GetTickCount(); // 前回のキャプチャー終了待ち for( int i=0; i<100 && FBusy; i++ ) { Sleep( 100 ); } if( FCurrentCam!=Cam ) { // カメラが同じ場合レンタリングしなおす必要なし    // レンダリングしなおし部分省略 } FCurrentCam = Cam; FCaptured = false; dTime2 = GetTickCount() - dTime0; hr = FMediaControl->Run(); dTime3 = GetTickCount() - dTime0; DWORD Ed = GetTickCount() + 3000; // 3000はタイムアウト do { Application->ProcessMessages(); Sleep( 20 ); } while( !FCaptured ); dTime4 = GetTickCount() - dTime0; long ImageSize = Cam->prImageSize; dTime5 = GetTickCount() - dTime0; frmMain->lHrs[22] = FMediaControl->Stop(); dTime6 = GetTickCount() - dTime0;; FBusy = false; return Cam->prImage; }

質問者が選んだベストアンサー

  • ベストアンサー
  • davidfox
  • ベストアンサー率58% (21/36)
回答No.2

#1 です。 >Run/Stopを繰り返さないで、どの様にキャプチャー出来るのでしょうか? 参考URLは SDK の 「サンプル グラバの使い方」というものです。 簡単に言えば、Run() 状態のまま、カメラのストリームから欲しい時にだけスナップショットでイメージを得る方法です。Stop() はアプリが終わるまで呼びません(時間が掛かるので)。 この方法の実装はネットで幾つか見つかると思います(どれも似ています)。 しかし、複数台のカメラで有効なのかどうか私には判りません。 よって #1に書いた「個人的にどうなのかな?」の部分は次のように言い換えたい思います。 ・カメラが1台ならRun/Stopは繰り返さない方が早いと思う。しかし、複数台のカメラになると、そうせざるを得ないのも知れない。...です。

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc371163.aspx
TinyPine
質問者

お礼

再度のご回答ありがとうございした。 グラバーで検索するんですね。昨日はPose等をやって見ましたが、違う所を探していた様です。 これから会社に行って探してみます。 会社の環境だと、質問サイトはセキュリティーのブロックがかかってしまい、家には開発環境が無いので直ぐに試す事が出来ません。 これで解決出来るといいのですが。 ありがとうございました。

その他の回答 (3)

回答No.4

ANo.2さんへの返答に近いのですが、複数カメラでもRun,Pauseを繰り返す必要がありません。ただしマルチスレッドを使った場合の話ですが。 DirectShowはマルチスレッドでの利用が出来るようです。

TinyPine
質問者

お礼

再度のご回答ありがとうございます。 現在、davidfox さんの書き込みを元に、GetCurrentBufferで画像を入力しようと思っていますが、何故か最初の画像しか取得出来ないでいます。 ただ、京都大学の川島講師のサンプルプログラムで、画像の連続取得には成功しています。 これは昨年やったものですが、川島講師のサンプルプログラムの中にGetCurrentBufferを使ったものもありましたので、今週はこれを参考に検討を進めて見ようと思っています。 DirectXを全く知らない私にはちょっときつい開発です。 http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#stillcap_console1

回答No.3

明らかに無駄な処理をしていることによる遅さですね。そんなにかかりません。 ちなみにRunとStopは繰り返してもいいですがものすごく短い時間間隔では無論行ってはいけません。 複数カメラが合ってもマルチスレッドを使うことによって同時にキャプチャできます。静止画ではなくて動画です。

  • davidfox
  • ベストアンサー率58% (21/36)
回答No.1

回答と言えるレベルではないので参考程度でお願いします。 私は1台のカメラ接続しか経験が有りませんが、640x480で160+310=470msec ... x6台であるのと、ハードの性能を考えると、明らかにおかしいとは言えないように感じます。 とは言え、Run/Stop を繰り返すのは個人的にどうなのかな?と思いますが。 手間(と費用)を掛けて、お使いのカメラメーカーに相談するのが良いと思いますが、そこは状況次第ですね。

TinyPine
質問者

補足

ご回答、ありがとうございます。 >640x480で160+310=470msec ... x6台であるのと、 測定時間は6台のカメラでは無く、1台のカメラでのキャプチャー時間です。 >とは言え、Run/Stop を繰り返すのは個人的にどうなのかな?と思いますが。 Run/Stopを繰り返さないで、どの様にキャプチャー出来るのでしょうか? キャプチャーの開始(Run)、キャプチャーの終了待ち(Stop)と思って居るのですが私の理解の誤りでしょうか? Run/Stop以外でキャプチャーする方法があればお教え下さい。

関連するQ&A

  • RAID0に高速で書き込む方法(補足2)

    昨日から、たびたび質問させていただいています。 困っているので、教えてください。 下に、ハードディスクにデータを取り込むテストプログラムの一部を載せます。不必要と思われる部分は省かせていただいたので、少々バグが含まれていたり、変数の意味がわからないところがあるかもしれませんが、ご勘弁ください。 CFile file( m_strPath, CFile::modeCreate | CFile::modeReadWrite ); DWORD dwSize; dwSize = 2000000000; file.SetLength( dwSize ); file.SeekToBegin(); DWORD dwTick = GetTickCount(); DWORD aSize = 32 * m_dwSectorsPerCluster * m_dwBytesPerSector; char* buf = new char[ aSize ]; if( buf != NULL ) { DWORD pos; for( pos = 0; pos < dwSize; pos += aSize ) { file.Write( buf, aSize ); } CString str; str.Format( "%d ms for %g MB", GetTickCount() - dwTick, dwSize * 0.001 * 0.001 ); AfxMessageBox( str ); } 最後に書き込んだ大きさと、かかった時間を表示しています。 よろしくお願いします。

  • USBカメラ画像の表示が不安定

    リナックス環境 ・Fedora Core 1 Kernel 2.4.22 ・RT-Linux 3.2 pre3 Kernel 2.4.22 USBカメラ ・Qcam Pro 4000 USBカメラから画像を取得して表示するプログラムを作成しています。 ドライバをインストールし、下のコマンドで正常に画像が表示されます。 xawtv -c /dev/video0 作成中のプログラムでは、ウィンドウにカメラ画像を表示し、25ms毎にその画像を更新しています。ウィンドウの作成、画像の表示にはOpenCVを用いています。 このプログラムを起動すると始めのうちは正常に画像が更新されているのですが、あるときを境に表示が乱れ始めます(ブロックノイズが多発する、点滅する、真っ黒になる)。いったん乱れ始めるとプログラムを再起動したとしても症状が直ることはありません。また、この症状が発生するとOSが極端に不安定になり、今までに以下のようなフリーズが発生しています(ほとんどが1のようなフリーズで、2のフリーズは先日初めて発生しました)。 1.マウスもキーボードも応答しなくなる(マウスカーソルも動かない) 2.突然黒い画面になり「usb-uhci.c: interrupt, status 2, frame #1779」と表示される 不思議な事に、この症状が発生中にxawtvコマンドを用いて画像を表示すると乱れる事は一切ありません。自作のプログラムを経由して画像を表示すると乱れてしまうのです。また、どうやら画像自体は正常に取得できているようで(OpenCVによる画像処理は上手くいっている)、「プログラム」から画像を「表示」することに問題があるようです。 症状の特徴としては、CPUに負荷がかかったときに画像が乱れるようです。マウスをそっとしておくよりも、マウスを速く動かしているときの方が激しく乱れます。また、この症状はプログラムを動かしているときに急に発生するのですが、全く発生しない日もあり(それがまた原因が特定しにくい)、プログラムが完全に悪いというわけでもないようなのです。 始めはグラフィックボードの故障を疑いましたが、交換しても症状は直りませんでした。 当方Linuxの知識に乏しく、インターネットで情報を集めできる限りのことはしたつもりなのですが、もうなす術がなく途方に暮れているところです。近くに相談できる人もおらず、最後の望みとしてここで質問させて頂く事にしました。 もし何かお気づきの点がありましたらアドバイスして頂けると非常に助かります。 よろしくお願い致します。 長文失礼しました。

  • DirectXを用いたActiveXを用いてVistaで情報が取れない

    ActiveXからDirectXを叩いてOSやCPUなどの情報を 取得しようとしています。 XPでは問題なく情報が取れますが、Vistaでは 情報が取れる項目と取れない項目があります。 この現象について、教えてください。 APIは正常に終了しています。 OS(szOSExLongEnglish) → 正常取得 ベンダー(szSystemManufacturerEnglish) → n/a 型番(szSystemModelEnglish) → n/a CPU(szProcessorEnglish) → (空白) 物理メモリ(szPhysicalMemoryEnglish)  → 正常取得 IEのデフォルトの設定では上記のような状態ですが、 設定を変えて保護モードを外すと正常動作し、 すべての情報が取得できます。 しかし、保護モードが有効の状態で、 情報取得したいです。 以下にコードを書きます。 ※このコードはあるサンプルソースをほとんどそのまま使っています。 //////////////////////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::Init(void) { HRESULT hr; DXDIAG_INIT_PARAMS dxDiagInitParam; m_pDxDiagProvider = NULL; m_pDxDiagRoot = NULL; g_DxDiagInfo = NULL; g_DxSoundInfo = NULL; // COMライブラリを使用できるように初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return false; } hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider); if( FAILED(hr) || m_pDxDiagProvider == NULL) { return false; } // DXDIAG_INIT_PARAMSを初期化 ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; // WHQLを確認するかどうか // ネットを経由するので基本的にはfalseにしておく dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks; dxDiagInitParam.pReserved = NULL; hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) { return false; } hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot ); if( FAILED(hr) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// // DxDiag でSystem情報を取得 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::GetSyatemInfo( void ) { HRESULT hr; IDxDiagContainer* pObject = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; DWORD nCurCount = 0; // "DxDiag_SystemInfo" を取得 if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) ) { return false; } // 情報保存領域の確保 ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo)); if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) ) { SAFE_RELEASE( pObject ); return false; } SAFE_RELEASE( pObject ); return true; } よろしくお願いいたします。

  • OpenCVでキャプチャした画像をbmp保存したい

    OpenCVでカメラからキャプチャした画像(コマ画像)をbmpで保存しようと思っています。 以下のプログラムで一応bmp画像は保存できるのですが、キー入力をしないと保存できません。 #include <iostream> #include <stdio.h> #include <cv.h> #include <highgui.h> #include <math.h> #include <stdlib.h> int main(void){ //画像保存用 char str[32]; //キー入力用 int key; //カメラの用意 CvCapture *capture; IplImage *frame = NULL; //カメラ画像用 //カメラ・デバイスの先頭ポインタを取得 capture = cvCaptureFromCAM(-1); //カメラ画像のサイズ double height = 240; double width = 320; //カメラ初期化 if(capture == NULL){ //カメラが見つからなかった場合 printf("カメラが見つかりません\n"); return (0); } //カメラ画像を表示するウィンドウの生成 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width); cvNamedWindow("CaptureFromCamera", CV_WINDOW_AUTOSIZE); //キー入力されたら画像をキャプチャ while(1){ //カメラ画像からフレーム画像を取り込む frame = cvQueryFrame(capture); if(frame == NULL) break; //画像の表示 cvShowImage("CaptureFromCamera", frame); //sキー入力で画像を保存、Escキー入力でループから抜ける key = cvWaitKey(10); if(key == '\x1b') break; else if(key == 's'){ sprintf(str, "Capture_Bitmap.bmp"); cvSaveImage(str, frame); } } //キャプチャの解放 cvReleaseCapture(&capture); //ウィンドウの破棄 cvDestroyWindow("CaptureFromCamera"); } 自分が作りたいプログラムは、 ・カメラからコマ画像を取得 ↓ ・それをbmp形式にする ↓ ・変換した画像はファイルにではなく、プログラム中の変数に保存 ↓ ・プログラムが動いている間ずっとこの処理を行う というものです。 特に変換した画像をプログラムが動いている間、ずっと変数に保存し続ける方法がわかりません。 プログラム中の変数に保存したい理由は、保存したコマ画像を用いてテンプレートマッチングなどを行いたいからです。 どなたか教えていただけると助かります。

  • カメラの録画が1秒しかできません。

    機種:arrows TAb Q506/ME  OS:Windows10 標準のアプリ「カメラ」を使用して、動画の撮影をすると、画面上は正常に録画できている(録画時間が増えていく)用ですが、保存先の「ピクチャ¥カメラロール」には1秒しか保存されていません。 ユーザ環境の問題かと思いプロファイルの再作成をしても状況は変わりません。 また、「You Cam Mobile for FUJITSU」で撮影しても同じです。 この現象は、複数台のarrowsで同じ現象が起きております。 ですから、カメラアプリ側の不具合でなく保存する機能の不具合ではないかとも思います。 原因や対策など、何か参考になる情報があればご提供願えればと思います。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • 16ビットPICのインプットキャプチャについて

    dsPICやPIC24の16ビットPICのインプットキャプチャについて お世話になります。16ビットPICのインプットキャプチャは、8ビットのPIC(特に16F1ファミリ)のCCPモジュールと使用方法がどこか違うのでしょうか。 16ビットPICはバッファを4つ持っており、値を4つまで保持できるはずですが、パルス幅計測がうまくできません。 現在dsPIC33Eを使っています。 皆様のアドバイスを頂けると幸いです。 問題点: 以下のパルスを計測すると、値がおかしくなる。 ㅤAㅤㅤ Bㅤㅤ CㅤㅤD ___|¯¯¯¯|_________|¯¯¯¯¯|______ ・B-Aでは正常 ・D-Cでも正常 ・しかし、C-Bをすると値が狂う。 値の確認方法: LCDにて表示。 タイマ1をキャプチャ用タイマとしている。(分解能は0.1336us) オシロでの計測値が120usの時、LCDの表示は「896」なので 896*0.1336=119.705us なので、正常と判断しています。(B-AやD-Cでパルス幅を計算時) プログラム仕様: メインループ内で、キャプチャを行う。 IC1で立下りエッジを検出 Captime_down[0]=IC1BUF;ㅤㅤ上図のDエッジ Captime_down[1]=IC1BUF;ㅤㅤ上図のBエッジ IC2で立ち上がりエッジ検出 Captime_rise[0]=IC2BUF;ㅤㅤ上図のCエッジ Captime_rise[1]=IC2BUF;ㅤㅤ上図のAエッジ 2msでタイマ3割込みが入り、値を計算し、表示 Captime[0]=Captime_down[0]-Captime_rise[0];ㅤㅤD-C Captime[1]=Captime_down[1]-Captime_rise[1];ㅤㅤB-A この時にC-B Captime_rise[0]-Captime_down[1] を行うと値が理論値をはるかに超えた19000等の値になります。 考察: インプットキャプチャに使用のタイマ1のオーバーフローも疑いましたが オーバフローしている形跡はありません。以下を試しました。 (1)タイマ1は0.1336usでカウントUP。 FFFFまで8755us=8.7ms必要。今回は2msで回し、値もクリアしている。 (TMR1=0) (2)タイマ1がオーバーフローすると、別ピンがON →ONしていないのでオーバーフローしない バッファの使い方?がおかしいのか? Captime_rise[0]-Captime_down[1] と配列の要素が違う計算(バッファの位置とでも言うのでしょうか、 キャプチャしたタイミングの違う値→[0]でのエッジ検出と[1]で タイマ1の値が変わる?) リファレンスマニュアルや書籍も読んだのですがわかりません。 アドバイスを頂けると幸いです。

  • AVIファイル

    MovwWriter3というソフトでキャプチャーして、PC内にできたAVIファイルを再生すると、クイックタイムプレイヤーで「圧縮プログラムが見当たりませんでした」と表示され再生できません。キャプチャー元はHI8ビデオカメラです。ファイル詳細を見ると、オーディオ形式がPCM、ビデオ圧縮がMS-YUVになっています。 どうすればこのAVIファイルを見ることが出来るでしょうか?よろしくお願いします。

  • フォームを開いてからの時間を取得

    ウィンドウズを起動してからの経過時間取得のプログラムは下記ようになったのですが・・・VBでつくったフォームを開いたと同時にカウントされるようにコーディングしたいのですがどうしたらよいのでしょうか? 例) Aという名前のフォームを開くと「OO時間OO分OO秒経過」という風にそのフォームのステーラスバーに出そうとしています。 Private Declare Function GetTickCount Lib "kernel32.dll" () As Long Private Sub Timer1_Timer() Dim RetCount As Long Dim h As Integer, m As Integer, s As Integer, ms As Integer RetCount = GetTickCount 'ミリ秒単位で返ってきます ' h = RetCount \ 1000 \ 60 \ 60 m = RetCount \ 1000 \ 60 - h * 60 s = RetCount \ 1000 - (h * 60 * 60 + m * 60) ms = RetCount Mod 1000 Label1.Caption = "経過時間 " & Right(("0" & h), 2) & ":" _ & Right(("0" & m), 2) & ":" & Right(("0" & s), 2) & "." _ & Right(("00" & ms), 3) End Sub

  • DVDビデオカメラの高速ダビングについて

    現在、私の使っているものは古いものなんですが、 DVDビデオカメラ:日立DZ-MV580 http://av.hitachi.co.jp/cam/products/cam550/spec/index.html DVDレコーダ:パナソニックディーガDMR-E85H です。 ディーガでは、HDDへの番組録画時の設定で「高速ダビング入り」で録画したものは、DVD-Rへダビングする際に高速ダビングが出来ます。 通常、この設定で録画しています。 一方、DVDビデオカメラの方はそんな録画設定はなく、通常8cmDVD-RAMに録画したものをディーガのHDDへ高速ダビングします。 これをDVD-Rへダビングする際には高速ダビングが出来ません。 つまり、ディーガでHDDからDVD-Rへのダビング時には再エンコードになると思われます。 通常の再生時間がかかり、更に再エンコードの画質劣化が起こり、更に不便なのはチャプターがダビングされないことです。(ダビング後の編集なしとして) 私の持っているDVDビデオカメラからディーガを使ってDVD-Rへのダビングでは、上記は避けられませんよね? これはパソコンを使用したとしても同じことでしょうか? また、現在の最新機種(DVDビデオカメラ、DVDレコーダ)を使用しても環境は同じなんでしょうか? それとも最近はDVDビデオカメラで撮ったものを再エンコードなしでDVD-Rへダビング出来る様になっているのでしょうか? 出来るとすると、それはビデオカメラの機能?それともDVDレコーダの機能? どっちかを買い換えたら出来る様になりますか? どうそ、よろしくお願いしますm(_ _)m

  • BiilderとD-Show フレームレート変更

    現在、USB複数カメラのプログラムを開発して居ます。 問題は複数カメラを使用するとPICバスの帯域を越えてしまうので、フレームレートを低くしようとしていますが、うまく行って居ません。 調べた所、フレームレートを取得するのはAvgTimePerFrameがあり、こちらは実装出来てテストも終了して居ます。ただ、これは読み取り専用で書き込みが出来ません。 もう一つはGetOutputFPSで、これに対して書き込みにPutOutputFPSがあります。 この2つを実装したいと思っています。実装自体はLongSecret様のご助言で 一応出来ました。 下記のプログラムはフレームレートを読み出すプログラムで、前半はAvgTimePerFrameのものです。 関数の引数、Indexは現在使用しているカメラ、ロジクールC905Mの解像度23個のどれを選択しているかで、0から22が入って来ます。 AvgTimePerFrameの方はこのパラメーターに従って、選択した解像度のフレームレートを返して来ます。 (実際はレートでは無く、100nS単位のインターバル時間値ですが・・) これに対して、後半のGetOutputFPSはどの解像度でも15FPSしか返しません。 もっとも、後半のプログラムはどの解像度を選択されているか関数に伝わって居ないと思われるので当然でしょうけど。 実はこのプログラムは先人が作成し、私が少しずつ分かる範囲で今回の様に改造を加えて来たもので、現在は相談する人も無く困っております。 AvgTimePerFrameの追加は何とか私でも出来たのですが、GetOutputFPSから選択した解像度に従ったフレームレートを出させる事は出来ないでしょうか。 若しくは他の方法で選択された解像度のフレームレートの入手、変更は出来ないでしょうか。 宜しくお願い致します。 int __fastcall TWebCam::RedFPS( int Index ) { int iFrmSpd; //分解能コントロール IAMStreamConfig *pStreamConfig; //キャプチャピンに対してストリームコングィグをセット FCapture->FindInterface(&PIN_CATEGORY_CAPTURE, //キャプチャピン 0,//すべてのメディアタイプ FVideoCap, IID_IAMStreamConfig, (void **)&pStreamConfig ); AM_MEDIA_TYPE *pmt; VIDEO_STREAM_CONFIG_CAPS scc; //フォーマットリストの取得 HRESULT hr; // フォーマット機能の取得 機能番号はIndexに設定 hr=pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc); if(hr!=S_OK){ ShowMessage("Format change error(1)."); return 0; } // フォーマットの設定 hr = pStreamConfig->SetFormat(pmt); if(hr!=S_OK){ ShowMessage("Format change error(2)."); return 0; } VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)pmt->pbFormat; // ビットマップ情報を BITMAPINFO 構造体にコピーする // これはテスト用、今の所、選択されたカメラ、解像度番号のタイミングが入手出来ている様だ。 // 一方GetOutputFPSはどの解像度でも15が返ってくる。アクセス箇所位置が違う? iFrmSpd = pVideoHeader->AvgTimePerFrame; // フレームタイミング入手 // ここからGetOutputFPS用のプログラム IAMTimelineObj* pVideoGroupObj; IAMTimeline* pTimeLine; CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER, IID_IAMTimeline, (void**)&pTimeLine); pTimeLine->CreateEmptyNode(&pVideoGroupObj, TIMELINE_MAJOR_TYPE_GROUP); IAMTimelineGroup* pVideoGroup; pVideoGroupObj->QueryInterface(IID_IAMTimelineGroup, (void**)&pVideoGroup); double dTmp; pVideoGroup->GetOutputFPS(&dTmp); // 読み出しフレーム/秒 // pVideoGroup->GetOutputFPS(dTmp); // 書き込みフレーム/秒 pTimeLine->AddGroup( pVideoGroupObj ); pStreamConfig->Release(); return( (int) dTmp );