12

OpenGL アプリケーションのメイン ウィンドウからビデオ クリップをキャプチャする非常に簡単な方法をユーザーに提供することになっています。キャプチャを開始および停止するためのボタンやキーボード ショートカットを追加することを考えています。開始時に、ファイル名やその他のオプションがある場合はそれを尋ねることができました。Windows (XP/Vista) で実行する必要がありますが、これまで開いていた Linux のドアを閉じたくありません。

このアプリケーションは、OpenGL フラグメントとシェーダー プログラムを使用します。これらの効果は、最終的なビデオで絶対に必要です。

私の要件を満たす可能性のあるいくつかの異なるアプローチさえあるように思えます(しかし、どこから始めるべきか本当にわかりません):

  • startRecording(filename)、stopRecording、captureFrame などの関数を備えたエンコード ライブラリ。各フレームがレンダリングされるたびに (または毎秒/3 秒ごとに)、captureFrame() を呼び出すことができます。そうすることでプログラムの実行が遅くなる場合でも、実際には問題にはなりません。

  • アプリケーションからプログラムで制御できるスタンドアロンの外部プログラム。結局のところ、制御できないスタンドアロン プログラムは、ほとんど私が必要とすることを実行します... しかし、前述のように、ユーザーが操作するのは非常に簡単であるべきであり、シームレス性も高く評価します。私のアプリケーションは通常、フルスクリーンで実行されます。さらに、現在 NSIS を使用して準備しているアプリケーションのインストール パッケージの一部として配布できるはずです。

  • Windows API を使用してスクリーンショットをフレームごとにキャプチャし、(たとえば)ここに記載されているライブラリの 1 つを使用します。Windows でスクリーンショットをキャプチャする方法の例を見つけるのは簡単なようです。ただし、WinAPIレベルで非常に手を汚さないようにするソリューションが大好きです。

  • OpenGL を使用してオフスクリーン ターゲットにレンダリングし、ライブラリを使用してビデオを生成します。これが可能かどうかはわかりませんが、とにかく痛みが最も少ない方法ではないのではないかと心配しています. 特に、ビデオがキャプチャされているかどうかによって、実際のレンダリングが異なる実行パスを取ることは望ましくありません。さらに、通常の非キャプチャ モードでフレーム レートを低下させる可能性のあるものはすべて避けます。

ソリューションがどちらかの意味で無料である場合、それは素晴らしいことですが、絶対的な要件ではありません。一般に、膨満感が少ないほど良いです。一方、この質問以外の理由により、残念ながら GPL のみのコードにリンクすることはできません。

ファイル形式に関しては、ユーザーがコーデックを検索することは期待できませんが、ビデオの表示が基本レベルの Windows ユーザーにとって十分に簡単である限り、形式が何であるかはあまり気にしません。ただし、出力の圧縮品質を制御できれば素晴らしいと思います。

明確にするために、カムコーダーのような外部デバイスからビデオをキャプチャする必要はありません。また、マウスの動きに本当に興味があるわけでもありません。オーディオに関する要件はありません。アプリケーションはまったくノイズを発生させません。

私は Visual Studio 2008 を使用して C++ を作成しています。このアプリケーションも GLUT と GLUI を利用しています。私は C++ やライブラリのリンクなどについてしっかりと理解していますが、一方、OpenGL は私にとってまったく新しいものです。これまでのところ、実際に仕事を成し遂げるために必要なビットしか学んでいません。

緊急に解決策が必要なわけではないので、お気軽に時間をかけてください :)

4

4 に答える 4

9

ここには、OpenGL アプリケーションからフレームを取得する方法と、フレームをムービー ファイルに変換する方法の 2 つの異なる質問があります。

最初の質問は簡単です。glReadPixels() で各フレームを取得するだけです (パフォーマンスが必要な場合は PBO を介して)。

クロスプラットフォーム ソリューション (ffmpeg) は GPL または LGPL である傾向があるため、2 番目の質問は少し難しくなります。LGPL はプロジェクトに受け入れられますか? これを行う Windows の方法 (DirectShow) は、使用するのが少し面倒です。

編集: LGPL は問題なく、ffmpeg を使用できるため、ビデオのエンコード方法の例については、こちらを参照してください。

于 2008-09-30T20:14:45.470 に答える
1

これは(Andrewによって提案されたように)AVIにマージするのにかなり関連しているように見えますが、LPBITMAPINFOHEADERなどを避けたいと本当に思っていました。

回答ありがとうございます。何かあったら成功を報告します:)

glReadPixelsそれまでの間、生のフレームをビデオクリップにエンコードするための追加のヒントをいただければ幸いです。

編集:これまでのところ、MikeFによって提案されたffmpegが進むべき道のようです。ただし、実際の実装についてはまだ説明していませんが、近い将来変更されることを願っています。

于 2008-09-30T20:50:26.867 に答える
0

最も簡単なオプションは、レンダリングされた各フレームをアプリ内から保存し、それらを AVI にマージすることです。AVI がある場合、それをより最適な形式に変換したり、AVI ステップを完全にスキップしたりできる多くのライブラリが利用可能です。

各フレームを取得するという点では、提案したようにオフスクリーン テクスチャにレンダリングするか、ハードウェアがサポートしている場合はバックバッファをソースとして直接使用することで、これを実現できます。これらのいずれかを実行する (および各フレームを保存する) ことは、フレームレートに大きなペナルティを課すことなく困難になります。

アプリケーションが決定論的であれば、ユーザー アクションを一連の入力として「記録」し、これらをオフスクリーン サーフェスに順次レンダリングして AVI を生成するエクスポート モードを使用できます。

于 2008-09-30T20:16:17.853 に答える