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

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

recordMyDesktopが書き出す一部の動画がまともにエンコードも編集もできない場合の対処とFluxboxのウィンドウ装飾を消す設定について

http://cid-3f9be5b1cd4a806c.office.live.com/self.aspx/%E5%85%AC%E9%96%8B/%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E7%B4%A0%E6%9D%90/recordMyDesktop%E5%A4%89%E6%8F%9B%E4%B8%8D%E5%85%B7%E5%90%88/pingus-06.ogv
にアップロードした動画の先頭で数秒間画面が固定/無音状態が続いた後でマウスカーソルが画面の中に入ってきて四角の中をクリックして進むのだが、recordMyDesktopが書き出した(Theora + Vorbis).ogv形式のファイルをエンコードすると、再生したときに最初の固定/無音のシーンが飛んでいきなりマウスポインタが入ってきたり、もしくは動画の最初からマウスカーソルが画面内に入って止まっていたりという現象が起こった。更に、そのまま編集ソフト(KdenliveOpenShot)にクリップとして追加してもうまく動かず、試しにMatroskaコンテナに入れたところ、動くようにはなったが「動画の最初からマウスカーソルが画面内に入って止まる」という現象は起きてしまったため、映像をTheoraから他のコーデックにエンコードする必要に迫られた。ロスレス(可)なコーデックでエンコードをしてから編集をしたかったのだが、ロスレス指定でのH.264へのエンコードがうまくいかなかった。

無圧縮の状態を経由してエンコードすることで問題を回避

その後色々と試したのだが、最終的には一旦(rawvideo + pcm_s16le).avi*1エンコードしたものを入力ファイルとしてエンコードをすると出力ファイルが正しく再生できることが分かり、映像だけを下のようにして無圧縮経由でエンコードして後で(元の動画から取った)音声を合わせてもうまくいくことが分かった。
今回キャプチャした動画はウィンドウサイズの関係か対象のウィンドウ(854x480)を指定してもキャプチャ領域がそれよりも広く(864x480)取られてしまっているため、左4ピクセルの切り取りも行って、更に動画サイト向けの縮小もして

$ mencoder -nosound -really-quiet -vf crop=854:480:4:0,format=i420 -ovc raw -of rawvideo -ofps 30 [キャプチャしたファイル].ogv -o - | mencoder -nosound -demuxer rawvideo -rawvideo fps=30:w=854:h=480:format=i420 -ovc x264 -vf scale=640:360,harddup -ofps [フレームレート] -x264encopts crf=0 -of rawvideo - -o [映像].h264

のようにすることとなった。この方法だと途中で無圧縮状態のデータをディスクに書き出す必要はない。

MatroskaコンテナにロスレスH.264映像と元のVorbis音声を入れる

あとはmkvtoolnixのmkvmergeもしくはそのGUImmg(mkvmerge GUI)で(H.264ロスレス + Vorbis).mkv形式のファイルを作ればよい。

$ mkvmerge -o [出力ファイル].mkv --default-duration 0:[フレームレート]fps [映像].h264 -D [キャプチャしたファイル].ogv

mkvmerge GUIの場合はH.264の映像ファイルと元の.ogvファイルを開いてH.264の映像トラックの「フォーマット詳細オプション - FPS」にフレームレートを入力する必要があり(指定しないと25fpsになる)、また、これとVorbis以外のトラックはチェックを外す必要がある。
実際に色々と試していたときには一度(rawvideo + pcm_s16le).aviなファイルを書き出してから(音声ごと)MEncoderで(H.264ロスレス + pcm_s16le).aviの形式にエンコードしていたが、Vorbisの音声が元のまま使えるので上の方法のほうが好ましい。
これを編集ソフトに取り込むと特に問題は起こらずに編集ができるようになった。ただしファイルサイズは元の形式からかなり大きくなっているため、ディスク容量に余裕がなければ編集が済んだ後に消したほうがいいかもしれない。

関連:Fluxboxでウィンドウの装飾を消す

「ウィンドウサイズの関係か対象のウィンドウ(854x480)を指定してもキャプチャ領域がそれよりも広く(864x480)取られてしまっている」と書いたが、キャプチャの後から領域を指定して切り取ることはできるものの、ウィンドウマネージャの装飾が入っていると拡大したときに端の1ピクセルに色が付いてしまうことがあった。
そこでGIMPなどで黒一色の画像を作ってそれを背後のウィンドウで表示しつつ、ウィンドウ装飾を完全に消した状態でキャプチャすることにしたのだが、Openboxの機能では薄く線が出てくるのでダメだった。色々調べたところ、Fluxboxを用いると設定でルールに基づいて特定のウィンドウだけに対して「Deco」の値を「NONE」にすることで装飾を消せることが分かった。
今回はPingusというゲームでWM_CLASSが「pingus」となっているため
[追記]ファイル名: ~/.fluxbox/apps

[app] (pingus)
  [Deco] {NONE}
[end]

となった。WM_CLASSはxpropで調べることが可能で「CompizConfig Settings Managerのウィンドウ指定に使用する情報を簡単に取得・コピーする」のスクリプトではGUI上で表示もできる。

関連記事:

関連URL:

使用したバージョン:

  • recordMyDesktop 0.3.8.1
  • libtheora 1.1.1
  • Fluxbox 1.1.1
  • libx264 94, 104(自前ビルド)
  • MPlayer r31086(libx264 94とリンク), r32011(libx264 104とリンク・自前ビルド)
  • mkvtoolnix 3.3.0

*1:無圧縮な映像と無圧縮な音声をAVIコンテナに入れたもの