4

私はC++でスクリーンキャストユーティリティを開発しています。

基本的にデスクトップフレームをキャプチャし、AVIファイルを作成します。アルゴリズムは次のとおりです。

  1. スレッドを作成します。this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL);
  2. デスクトップをthScreenCapture1秒間にn回キャプチャします(5 fpsなど)。

    obj->Capture();

  3. Capture()で、ビットマップデータをaviファイルに追加します。

    this->appendBitmapToAvi(this->avifile, bmp);

このユーティリティは、サウンドも録音します。そのため、メソッドthScreenCaptureでは、サウンドデータもaviファイルに追加されます。

問題は、1秒あたり6フレーム(ハードウェア構成によって変わる可能性があります)を超えるフレームがキャプチャされると、フレームとサウンドの間にラグが発生することです。

アルゴリズムを最適化するための解決策を探しています。解決策は、フレームをメモリにバッファリングすることであり、すべてのフレームをオンザフライでaviファイルに追加することではありません。ただし、別のスレッドでキャプチャされているサウンドデータを処理する必要があるため、コードがより複雑になります。

このユーティリティが同期を失うことなくサポートするfps値を増やすために何を提案しますか?

4

4 に答える 4

1

CamStudioなどの他のスクリーンキャストソフトウェアのソースを調べて、それらがどのように実行されているかを確認できます。

プログラムがディスクにバインドされている場合(そして私はそうだと思います)、圧縮を使用することで状況が改善する可能性があります(これは、Camtasia Studioなどの有名なプログラムの動作方法です)

于 2010-09-08T22:10:13.053 に答える
1

円形のダブルまたはトリプルバッファーを使用してビットマップとサウンドを各フレームに保存し、個別のスレッドを使用してビットマップとサウンドをaviに追加します。したがって、データ収集は1つのスレッドにあり、データは循環(スレッドセーフ)バッファーにあり、データストレージは別のスレッドにあります。

于 2010-09-18T00:06:28.877 に答える
1

AVIファイルを自分で書いていますか?崇高な努力ですが、このタスクを支援するAPIがあります。

Windowsプラットフォームで作業している場合は、DirectShowまたはMediaFoundationAPIを使用してオーディオとビデオをディスクに多重化することを検討することをお勧めします。DirectShowは、WindowsプラットフォームでのA / Vキャプチャ、ストリーミング、および多重化のためのAPIです。

CodeProjectに関するこの記事では、オーディオとビデオの同期の問題と、DirectShowがこの問題を克服するために使用するメカニズムについて説明します。

基本的に、基準クロックが使用され、フレームにタイムスタンプが付けられます。

新しい人々にとって非常に有用なリソースである 非常に活発なDirectShowコミュニティがあります。TMHのウェブサイトはチェックする価値があります-彼はMSMVPであり、コミュニティの活発なメンバーです。

これがお役に立てば幸いです。

于 2010-09-20T08:02:53.557 に答える
0

どのOSをターゲットにしていますか?Windows XPで作業している場合は、 http: //tmhare.mvps.org/downloads.htmにあるDirectShowコードの一部、特にフィルターグラフライブラリを確認します。

于 2010-09-09T15:12:25.677 に答える