質問

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

このアプリケーションは OpenGL フラグメントとシェーダー プログラムを使用しており、最終的なビデオに必ず必要なエフェクトです。

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

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

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

  • Windows API を使用してスクリーンショットをフレームごとにキャプチャし、(たとえば)次のいずれかを使用します。 ここで言及されているライブラリ. 。Windows でスクリーンショットをキャプチャする方法の例を見つけるのは簡単なようです。ただし、WinAPI レベルで非常に面倒な作業を強いられないソリューションが欲しいと思っています。

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

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

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

明確にするために:私 しないでください ビデオカメラなどの外部デバイスからビデオをキャプチャする必要があるし、マウスの動きにもあまり興味がありません。マウスの動きを取得しても害はありません。オーディオに関する要件はありません。アプリケーションはまったくノイズを出しません。

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

早急に解決策を必要とするわけではないので、ゆっくり時間をかけてください :)

役に立ちましたか?

解決

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

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

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

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

他のヒント

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

ご回答ありがとうございます。成功した場合は報告します:)

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

編集: 今のところ、Mike F が提案した ffmpeg が最適な方法のようです。ただし、まだ実際の実装には入っていませんが、近い将来に変わることを願っています。

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

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

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

OpenGL レンダリングをビデオに記録するデモ プロジェクトを作成する必要がありました。私が使用した glReadPixels ピクセルデータを取得し、OpenCVでビデオを作成しました cvWriteFrame. 。OpenCV を使用すると、divx または x264/vp8 (ffmpeg がコンパイルされている) でさえ書くことができます。

サンプル プロジェクトとともにブログ投稿に詳細を記載しています。http://tommy.chheng.com/2013/09/09/encode-opengl-to-video-with-opencv/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top