• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Builder フレームレート設定)

カメラのフレームレート設定方法と違いについて

LongSecretの回答

回答No.4

なるほど、分かりました。 これですと 前回質問の3の ーーーーーーーーーー hr = pStreamConfig->SetFormat(pmt); するまえに ((VIDEOINFOHEADER*)pmt->pbFormat)->AvgTimePerFrame = 数値; 的なことをするとどうなるのでしょうか? ーーーーーーーーーー のうち、前半部分を満たしていません。 これにからんでるとこだけ抜粋すると pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc); pStreamConfig->SetFormat(pmt); int iFrmSpd = pVideoHeader->AvgTimePerFrame; ((VIDEOINFOHEADER*)pmt->pbFormat)->AvgTimePerFrame = 666666; iFrmSpd = pVideoHeader->AvgTimePerFrame; この順番になってしまっています。 私の提案は pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc); ((VIDEOINFOHEADER*)pmt->pbFormat)->AvgTimePerFrame = 666666; pStreamConfig->SetFormat(pmt); int iFrmSpd = pVideoHeader->AvgTimePerFrame; この順番、ということです。 どういう事かと言いますと SetFormatの後でメモリ上でいくら数値をいじくりまわしても それがデバイス(カメラ)に伝わらないとダメという事です。 Debug::f(int); でintの数値を表示するとしたら 例えば int 能力 = 100; void func(){ int a = 能力; Debug::f( a ); //もちろん、100と表示される。 a = 30; int b = a; Debug::f( b ); //もちろん、30と表示されるが、「能力」が書き変わったわけではない。 } というのとまったく同じことになっているわけです。 デバイスドライバって言うのは基本的に デバイス(この場合カメラ) と、PCのメモリやCPUは離れた場所にあるのだから 通信には多かれ少なかれ時間がかかる なので、ある程度まとまった情報を 特定の関数からのみやりとりすることで そのオーバーヘッドを避ける という風に作られてるのが普通です。 そう考えれば、内部的な動作がだいたい予想できるのではないでしょうか? なお IAMStreamConfig::GetStreamCapsのMSDNの解説にもありますが pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc); として得たpmtは、情報を得るために内部的に領域が確保されてるので 使い終わったら DeleteMediaType(pmt); として解放してください。

TinyPine
質問者

補足

再度のご指摘ありがとうございます。 pVideoHeaderが無いとのエラーメッセージが出ましたので2行目を追加してやってみましたが、結果は次の読み込みで333333が返って来てしまいました。 pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc); VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)pmt->pbFormat; ((VIDEOINFOHEADER*)pmt->pbFormat)->AvgTimePerFrame = 666666; pStreamConfig->SetFormat(pmt); iFrmSpd = pVideoHeader->AvgTimePerFrame;

関連するQ&A

  • 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 );

  • (再)フレームレートについて

    何度も質問して申し訳ありません。 先日フレームレートについて伺ったのですが もう1度確認させて下さい。 1秒間29.97fpsと言う曖昧な数字は秒単位に直した時に 単純に割り切れないからだと言う事ですが、これは100秒2997コマと 言うのを基準に秒単位に直した時の数字でしょうか?? どのようにして秒単位に直すことが出来るのでしょうか?? また29.97fpsだと30fpsの時と比べ100秒たてば3コマの差が出て きますが最初の10秒間程は映像を確認すれば30fpsの時と同じで 1秒間30コマで構成されているわけですよね?? 何十秒かに1回の割合で1秒間30コマではなくなってるフレームレート があると言う事ですよね?? 本当に何度も申し訳ありません。 お願い致します。

  • カメラのフレームレート

    カメラのフレームレートが低すぎますの表示が何度も表示されます ※OKWAVEより補足:「富士通FMV」についての質問です。

  • FPS リフレッシュレートとフレームレートについて

    オンラインゲームカウンターストライクオンラインをやっていた時のことです。 コンソールからFPS数値の最大値を100まであげられるようにしました。 特に目的はなかったのですが、初期設定に制限があったらfps値が低くて快適にできないのではないか?という思いがあったからです。 しかし設定後、なぜか不思議な結果になりました。 変更後、fps数値が左上に表示されるようになったのですが、99と表示されるように。 ゲームの解像度及び液晶の解像度とリフレッシュレート設定は1920×1080の60Hzにしていたので、60fpsまでが限界かと感じたのですが、違うのでしょうか? ためしにFrapsでも計測すると99に。 リフレッシュレートとフレームレートの事については調べてみて、 フレームレート<=リフレッシュレートという考えには行き着いたのですが、これも自分の見解なので真意が気になります。 表示が99とでているだけで、実際はfpsは60までしかディスプレイには出力されてないという結論でいいのでしょうか? 助言をおねがいします。 使用してるディスプレイは BenQ G2411HD VGAはHD4670 PC上の設定は1980×1080でリフレッシュレートは60Hz固定で変更できまっせん。

  • WEBカメラの1秒間のフレーム数

    デジタルカメラでは、明るさを-1や-2の暗めに設定してあると、写真撮影時には、シャッタースピードが速くなりブレが少なくなります。動画撮影時にもフレーム数が多くなるようですが、最近、買ったWEBカメラ(130万画素)は、設定を暗めにすると、フレーム数も少なくなる事が分かりました。 解像度というのか、画角を大きく設定した時と同じ感じてす。1秒間に10フレーム以下まで低下して、コマ送りみたいになります。 設定を暗めにすると、フレーム数も少なくなるという現象は、WEBカメラでは普通なのでしょうか。? 宜しかったら、どのような仕組みなのか、簡単に教えて頂けますと参考になります。

  • スモールディスプレイのフレームレート上限は?

    2016年現在、1~3インチクラスの小画面サイズディスプレイでフレームレートはどこまで向上させられますか? 市販のものはまあ60~120fpsもあれば十分とは思いますが、その10倍とか20倍の数値は 出せないものでしょうか? 例えば、有機ELの素子応答速度は数μsecで、液晶の1000倍速いそうですが、 これをそのまま高フレームレート化に活かすと、何fpsくらいまで上げられるのでしょうか。 解像度はHD程度を想定しています。 もちろん、有機EL以外でも可能性があれば教えていただきたいです。 よろしくお願いします。

  • フレームレートWEBカメラ スペック

    はじめまして。 当方WEBカメラとノートPCを使用してビデオカメラのように動画を記録したいのですが、WEBカメラの付属ソフトを使うとフレームレートが極端に落ちてしまい、速い動きなどが撮れません。PCのスペックを上げずに、容易にフレームレートを30コマに近い動画を記録することは可能なのでしょうか?位置出しが完了すれば、プレビューも要らないですし、必要あらばスクリプトを使用してもいいのですが。。。宜しくお願いします。

  • シャッタースピードとフレームレートの関係

    フレームレートとシャッタースピードの関係について教えて下さい。 フレームレートは、単位時間あたりのフレーム(画像)処理数で、24fpsは、1秒間あたり24回画面を書き換えることを意味し、シャッタースピードは、撮像素子への露光時間を意味し、これが短い程、鮮明が画像を記録でき、手ぶれ等が少なくなると聞きました。 ここで、例えば、24fpsでシャッタースピードが24(1/24秒)の場合は、1フレームについて(便宜上、プログレッシブを前提とします)、1回シャッターが切られ、その画像が1フレームに記録されていることになるかと思います。 一方で、24fpsでシャッタースピードが48(1/48秒)の場合は、1フレームについて、2回シャッターが切られていることになりますが、この場合は、1フレームの画面にはどのように画像が記録されるのでしょうか? 2回シャッターが切られているとすると、2枚の画像が出来上がっているはずですが、フレーム数は変わっていないので、2枚の画像を1フレームで処理することになってしまいます。 イメージとして、フレームとはキャンバスのようなもので、そこにシャッターできった画像を張り付けたようなものをイメージしているのですが、そうだとすると、1つのキャンバスに2枚の画像が重なることになってしまいます。 シャッタースピードとフレームレートの関係について、ご説明頂ければと思います。 また、シャッタースピードは、フレームレートの倍が適正という話を聞きました。 これの理屈はどういったものなのでしょうか? ご回答よろしくお願い致します。

  • フレームレートについて

    最近PCゲームにハマってるのですがフレームレートについて少々わからないことが出てきたので質問させて頂きます。 とりあえず自分で色々勉強してFPSは1秒間に何枚の絵が描写されているかの単位だということがわかりました。 とあるゲームでFPSを測っているのですが、自分のPCでは大体130fpsでした。 オンボードの安物なのでまったく良い性能とは言えないのですが最近の高性能グラフィックカードだともっと凄いのでしょう。 ですが、実際1秒間に1000枚とか描写したとしても、ディスプレイがそんなに描写出来るのか?という問題にぶつかりました… 自分のディスプレイのリフレッシュレートは60Hzなので別に1000枚とか必要ない気がします… で、ゲーム側でfpsに制限をかけて130fps出るところをあえて60fpsにしています。 当然オンボードなので130より60にすればCPUの使用率が下がり良いことばかりなのです。 で、今度PCの買い替えor自作PCを考えています。当然ディスプレイの買い替えも行い、リフレッシュレートが高いものを買う予定です。 PCもハイスペックなものにするので当然fpsは高めになるでしょう。 ですが実際ディスプレイのリフレッシュレートはせいぜい120Hzが限度だと思います。 では120fpsのディスプレイで1000fpsのゲームをするとどういった映像になるんでしょうか?? もし120fpsしか表示できないのならば、そこまで高性能なグラボは必要ない事になりますよね? でもみんな高性能なグラボを求めるということは何かしら意味があるということっぽいので 今回質問させて頂きました。 長ったらしい文章で申し訳ありません。 まとめさせていただくと ※120fpsまでしか表示出来ないディスプレイで1000fpsの映像を流すとどうなるのか? ※上記の場合で1000fpsでもディスプレイの性能で120fpsになる場合。高性能グラボはいらないのでしょうか? 暇な時でいいので回答宜しくお願い致します。

  • 動画ビットレート

    元のファイルが解像度 848×480 フレームレート 29.97fps 総フレーム 12255fで映像ビットレートが1766kb/sなんですけどこれを1280×720のHDサイズに解像度を大きくする場合にブロックノイズが出ない最適な映像ビットレートってどれくらいですか?? ちなみに元ファイルのコーデックはAVC/H.264です。