試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

OpenGLアプリケーションが快適にキャプチャできるglcについて(キャプチャ、再生、エンコード)

ここではglcを用いたキャプチャ/再生/エンコード作業についてを扱う。「OpenGLアプリケーションが快適にキャプチャできるglcについて(概要/インストール/Mandriva Linux向けパッケージ)」の作業例のように${HOME}/glc/以下を指定した場合、以下の各コマンドは「OpenGLアプリケーションが快適にキャプチャできるglcについて(概要/インストール/Mandriva Linux向けパッケージ)」のラッパースクリプトのファイル名に合わせて(「glc-capture」は「glc-capture-wrapper」のように)実行する。

キャプチャ

キャプチャ操作はglc-captureコマンドによって行う。

$ glc-capture [オプション...] [実行コマンド] [実行コマンドへの引数...]

このようにしてOpenGLアプリケーションを起動すると、既定ではShift+F8を押すことで録画が開始され、再びこのキーを押すかアプリケーションが終了するまでの間の映像と音声がキャプチャされる。この開始/終了のキーの組み合わせは--hotkeyオプションで変更できる。下はF12を設定する例。

$ glc-capture --hotkey F12 [オプション...] [実行コマンド] [実行コマンドへの引数...]

また、アプリケーション起動時にキャプチャ開始することもでき、--startオプションを指定する。この場合も、停止するときに押すキーは同様。

(Shift+F8で止める)
$ glc-capture --start [オプション...] [実行コマンド] [実行コマンドへの引数...]
(任意のキーで止める)
$ glc-capture --hotkey [キーの組み合わせ] --start [オプション...] [実行コマンド] [実行コマンドへの引数...]

その他、--fpsオプションでキャプチャフレームレートを指定するなど、色々なオプション指定が別途可能となっている。
SDLを用いたアプリケーションの場合、SDLサウンド出力ドライバがPulseAudioなどの別の出力先になって正常に音声をキャプチャできない場合があるので、--force-sdl-alsa-drvオプション*1を付けてALSAサウンドシステムからの出力を強制する。

再生とエンコード

キャプチャされた動画は独自の形式(.glcファイル)で保存される。これは付属のglc-playコマンドによって再生できる他、映像と音声のそれぞれについての変換出力も行える。

再生

再生はそのまま.glcファイルを開くことで行える。

$ glc-play [.glcファイル]
情報の取得

映像と音声は.glcファイルの「ストリーム番号」を指定して取り出す。その番号はglc-play-iオプション指定によりストリーム一覧を含む各種情報を出力して確認する。
シンプルな構成では

$ glc-play -i 1 [.glcファイル]
[   0.00s] audio stream 1
[   0.10s] video stream 1
[ 696.79s] end of stream
video stream 1
  frames      = 19259
  fps         = 27.64
  bytes       = 12.91 GiB
  bps         = 18.98 MiB
audio stream 1
  packets     = 32657
  pps         = 46.87
  bytes       = 29.28 MiB
  bps         = 43.02 KiB

のようにそれぞれ1つずつのストリームとなり、ともに「1番」で取り出せる。-iオプションの後ろに指定するのは詳細度で、1から6が指定できるが、ストリーム番号の一覧が見たいだけなら「1」でOK。

映像の変換(x264サポート付きのmencoderを用いてH.264エンコード)

映像はglc-play-yオプションを付けることで映像のストリーム番号を指定してYUV4MPEG形式として取り出せる。
映像はYUV4MPEG形式のファイル(ディスク上)に書き出して2passエンコードしてもよいのだが、数GiB単位(あるいはそれ以上)のとてつもない量のディスク領域を用いるため、パイプを用いてmencoderに渡すという形を2回行うのが現実的。ただし、非常に多くのCPU資源を用い、エンコードにかかる時間もかなり長くなる。

$ glc-play [入力ファイル] -o - -y [映像のストリーム番号] | mencoder -demuxer y4m -nosound -ovc x264 -vf harddup -ofps [出力フレームレート] -x264encopts [x264用オプション...]:pass=1:turbo=1 - -of rawvideo -o /dev/null
$ glc-play [入力ファイル] -o - -y [映像のストリーム番号] | mencoder -demuxer y4m -nosound -ovc x264 -vf harddup -ofps [出力フレームレート] -x264encopts [x264用オプション...]:pass=2 - -of rawvideo -o video.264
音声の変換

音声についてはglc-play-aオプションを付けることでWAVEファイルとして取り出せる。

$ glc-play -a [音声のストリーム番号] [.glcファイル] -o temp.wav

あとは好きな形式にエンコードする。AACへのエンコード作業は「zoomeとSMILEVIDEOへアップロードする動画の再エンコード回避に関する覚え書き(2009/8/21現在)」で扱っている。

好みのコンテナ形式に入れる

MP4コンテナへ映像と音声を入れる(mux)作業については「zoomeとSMILEVIDEOへアップロードする動画の再エンコード回避に関する覚え書き(2009/8/21現在)」で扱っているので、ここでは書かない。
動画共有サイトにアップロードするのでなければ、MKVToolnixのmkvmerge GUI(mmg)でMatroskaコンテナに入れるなど、好きな入れ物に入れてOK。ただし、mmgでは手動でフレームレートを「FPS」の欄に入力する必要がある。これは「zoomeとSMILEVIDEOへアップロードする動画の再エンコード回避に関する覚え書き(2009/8/21現在)」でMP4Boxを用いる場合の-fpsオプションに相当する。

なお、glcの公式ページエンコード支援スクリプトへのリンクがあるが、これは(H.264+MP3).mp4な形式となり、コンテナはオプションで変更できるようだが、オーディオにmp3という部分が好みでないため、おすすめはしない。

関連記事:

使用したバージョン:

*1:このオプションを指定すると環境変数SDL_AUDIODRIVERが「alsa」に設定される