※ ChatGPTを利用し、要約された質問です(原文:C Builder フレームレートの変更。)
C Builderでカメラのフレームレートを変更する方法
このQ&Aのポイント
C Builderを使用してウエブカメラのフレームレートを変更する方法について教えてください。
現在、ウエブカメラ4台を使用するシステムを開発しています。しかし、一部の環境で動作しない問題が発生しています。
PCIバスのバス幅が原因で、カメラのフレームレートを下げる必要があります。しかし、必要なプログラムの一部が見つからず、どのように組み込めば良いか分かりません。
現在、ウエブカメラ4台を使うシステムを作成しています。
下記のサイトを参考に、とりあえず動く様に成ったので現場へ送ったら動作しないとの事でした。
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/index-j.html
原因はPCIバスのバス幅が133Mbであり、たまたま私が開発に使って居たPCがPCI-Expressスロットを持っていた為、バス幅が大きく、その為私のPC上では問題なく動作してしまった様です。
そこでカメラのフレームレートを下げようと色々探したのですが、下記のプログラムを見つけました。
このプログラムを組み込もうとおもったのですが、2行目の"pTimeline"に該当する形式がこのサンプルの中にありません。 何かnewで作成するものか、若しくは
"IAMTimelineObj* pVideoGroupObj;"の様に定義するものか分からず組み込めないで居ます。
私はC自体は長くやっていますが、改造が主で、クラスやDirectXの知識はほとんどありません。
この"pTimeline"はどの様に宣言したら良いのでしょうか、お分かりに成る方、宜しくお教え下さい。
なお、サンプルプログラムは下から取りました。
http://www.erde.co.jp/~katsu/wiki/index.php?%A1%D6DirectShow%CA%D4%BD%B8%A5%B5%A1%BC%A5%D3%A5%B9%A1%D7%A5%B5%A5%F3%A5%D7%A5%EB
IAMTimelineObj* pVideoGroupObj;
pTimeline->CreateEmptyNode(&pVideoGroupObj, TIMELINE_MAJOR_TYPE_GROUP);
IAMTimelineGroup* pVideoGroup;
pVideoGroupObj->QueryInterface(IID_IAMTimelineGroup, (void**)&pVideoGroup);
// グループのメディア タイプを設定
AM_MEDIA_TYPE mtGroup;
ZeroMemory(&mtGroup, sizeof(AM_MEDIA_TYPE));
mtGroup.majortype = MEDIATYPE_Video;
mtGroup.subtype = MEDIASUBTYPE_ARGB32; // alpha blendingする場合はMEDIASUBTYPE_ARGB32
// フォーマット ヘッダーを設定する。
mtGroup.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
if (mtGroup.pbFormat == NULL)
{
return E_OUTOFMEMORY;
}
VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mtGroup.pbFormat;
ZeroMemory(pVideoHeader, sizeof(VIDEOINFOHEADER));
pVideoHeader->bmiHeader.biBitCount = 32; // 32bit
pVideoHeader->bmiHeader.biWidth = 640;
pVideoHeader->bmiHeader.biHeight = 480;
pVideoHeader->bmiHeader.biPlanes = 1;
pVideoHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVideoHeader->bmiHeader.biSizeImage = DIBSIZE(pVideoHeader->bmiHeader);
// フォーマット タイプとサイズを設定する。
mtGroup.formattype = FORMAT_VideoInfo;
mtGroup.cbFormat = sizeof(VIDEOINFOHEADER);
// サンプル サイズを設定する。
mtGroup.bFixedSizeSamples = TRUE;
mtGroup.lSampleSize = DIBSIZE(pVideoHeader->bmiHeader);
pVideoGroup->SetMediaType(&mtGroup);
pVideoGroup->SetOutputFPS(30); // フレーム/秒
pTimeline->AddGroup( pVideoGroupObj );
pVideoGroupObj.Release();
CoTaskMemFree(mtGroup.pbFormat);
お礼
ご回答ありがとうございました。 早速会社で実装してみました。 お蔭様で一応実装出来ましたが・・・・新たな問題が。