pyvnc2swf

back [English]

ホームページ: http://www.unixuser.org/~euske/vnc2swf/
メーリングリスト: http://lists.sourceforge.net/lists/listinfo/vnc2swf-users

$Id: pyvnc2swf-j.html,v 1.2 2008/11/16 02:39:40 euske Exp $


Pyvnc2swf はクロスプラットフォームの画面録画ツールです。 これは VNC プロトコルを経由して画面の動きを記録し、Shockwave Flash (SWF) ムービーを生成します。 Pyvnc2swf は 3つの Python プログラムから構成されています:

ご質問がある方は、作者にメールを送る前にまず FAQ および メーリングリストのアーカイブ をご覧ください。

ライセンス: Pyvnc2swf は無保証のソフトウェアです。 これは GNU 一般公衆利用許諾契約書 (GPL) に従って配布されます。


インストール

すべてのプラットフォームで、以下のパッケージがあらかじめ必要です:

ほとんどの Linux ディストリビューションでは、 これらのパッケージはすぐにインストールできます。 Mac OS X では、Python はすでにインストールされていますが、 OS X 版の Pygame を インストールする必要があります。

また、VNC サーバが最低 1種類必要になります:


録画する

vnc2swf.py プログラムは VNC のセッションを記録し、これを SWF または VNCLog 形式で記録します。 これは VNC クライアントであり、VNC サーバと直接通信します。 ユーザはこのプログラムに先立って VNCサーバを開始させておく必要があります。

vnc2swf.py には 2つのモードがあります: GUI (グラフィカル・インターフェイス) モードと CLI (コマンドライン・インターフェイス) モードです。 GUI モードの場合、 "Start" ボタンを押すと録画が始まります。 その後 "File" メニューから "Save as..." を選び録画したムービーを保存します。 CLI モードの場合、ユーザは SWFムービーを保存するファイル名を コマンドラインから指定し、録画はすぐに始まります。 どちらの場合も、ユーザはサーバが要求した場合 (パスワードファイルを指定していない限り) VNCパスワードの入力が求められます。CLIモードでは、 録画を中止するにはControl-C を押してください。この後あらかじめ指定されたファイル名で .swf.html の 2つのファイルが生成されます。 この .html には適切な HTMLタグと、シークバー機能を提供する javascript コードが 含まれています。

vnc2swf.py では画像をエンコードするために 3つの方式が選べます: "swf5", "swf7" および "vnc" です。 最初の swf5エンコーディング (デフォルト) では、そこそこの大きさのムービーを生成します。 2番目の swf7エンコーディングは、より小さな SWF ムービーが生成できますが、 vnc2swf.py の中ではこの方式はおすすめできません。なぜなら、 1) このエンコーディングは Flash Player version 7以降でしかサポートされていない。 また、2) swf7 エンコーディングのムービー生成は遅いので、 フレーム落ちすることがある、といった理由からです。実際には、ムービーを録画したあとに edit.pyコマンドを使って swf5方式のムービーを swf7方式の ムービーに変換できるので、どのみち録画時にはこの方法は必要ありません。 3番目のエンコーディング方法は vnc です。 これは vncrec と互換である .vnc ファイル (VNCLogファイル) を生成します。このファイル自体は SWFムービーではありませんが、生成する速度はいちばん速く、 edit.py コマンドによって SWFムービーに変換することができます。

NOTE: Cバージョンの vnc2swf とは異なり、vnc2swf.py では 実際のクライアント画面を表示しません。VNC サーバのデスクトップを 制御したい場合は、vncviewer のようなものを個別に起動する必要があります。

構文

使用例

(仮想スクリーンを録画する)
$ vncserver -geometry 640x480
...
$ vnc2swf.py -o out.swf localhost:1

(現在の X11画面を録画する)
$ x11vnc -localhost -viewonly -wait 10 -defer 10 &
...
$ vnc2swf.py -o out.swf -S "arecord -r 22050 voice.wav" localhost:0

x11vnc を使っている場合は recordwin の説明もごらんください。 これはある特定のウィンドウだけを録画する簡素なスクリプトです。

録画のコツ

オプション

-n
コンソールモード (GUIなし) にします。

-o 生成ファイル名
生成するファイル名を指定します。CLIモードでは、このオプションはかならず必要です。 GUIモードでは、これが指定されない場合はユーザにファイル名の入力を促します。 ムービーのエンコーディング方式はふつうファイル名から決定されます。 このためには、ファイル名の拡張子は ".swf" または ".vnc" のどちらかである必要があります。 それ以外の拡張子の場合、ユーザはムービーのエンコーディング方式を -t オプション (下記参照) で指定する必要があります。

-C クリッピング
矩形のクリッピング領域を指定します。 領域は "widthxheight+left+top" のような形式で指定します (e.g. "400x300+120+0")。 他の X11アプリケーションと違い、すべての値を指定する必要があります。負の値はサポートされていません。

-r フレームレート
ムービーのフレームレートを fps (フレーム/秒) で指定します。 (default=12.0)

-t エンコーディング
生成するムービーのエンコーディング方式を指定します ("swf5" または "swf7" または "vnc")。 省略された場合、エンコーディング方式は生成するファイル名から自動的に決定されます (*.swf = swf5, *.vnc = vnc)。

-N
Cursor pseudo-encoding の使用を禁止します。Pyvnc2swf は通常 マウスカーソルの位置を取得するために Cursor pseudo-encoding を使おうとします。 これによりカーソルを画面イメージとは別個に動かすことが可能になり、 生成するムービーサイズが小さくなりますが、vnc サーバによっては この方法が使えないこともあります。このオプションはこの動作を禁止するのに使います。

-P パスワードファイル
パスワードファイルを指定します。これが指定された場合、VNCサーバがパスワードを要求したときに このファイルの内容が自動的にロードされ入力されます。このファイルは暗号化された パスワード文字列を含んでおり、vncpasswd を使って作ることができます。 ユーザはローカルな vnc サーバのパスワードを含んでいる ~/.vnc/passwd を直接指定することもできます。

-e vncエンコーディング
VNCの画像伝送に使うエンコーディング方式を指定します (これはムービーのエンコーディングとは異なります)。 ふつうこのオプションは指定する必要がありません。 エンコーディングはカンマで区切られた整数で (default="5,4,0")、 これを変更すると録画速度が改善される場合があります。

-S サブプロセス (Un*x でのみサポート、要Python 2.4 以上)
録画中に実行するコマンドを指定します。 このオプションは別のプログラムで音声を録音するときに便利です。 コマンドラインはスペースで区切られた引数のリストで、シェルのコマンドラインと同様、 この引数は子プロセスに渡されます。しかし、ここでは実際にはシェルは起動されないため、 ここでの引数の値は展開されずそのまま子プロセスに渡されます。 子プロセスは録画が始まった直後に開始され、録画が終了すると子プロセスには SIGINT が送られます。

-d
デバッグレベルを上げます。


編集する

edit.pyプログラムは、vnc2swf.pyで 生成したムービーファイル (ひとつまたは複数) を編集したり再構築するためのツールです。 このプログラムはまた .vnc ファイルを .swfムービーに変換したり、 エンコーディング方式を変えたり (swf5->swf7)、MP3音声ファイルを画像にのせたり、 ムービーからイメージを抽出したり、ムービーの画像を間引く/縮小/クリップする、などの操作ができます。

現在のところ、edit.pyがサポートするのはコマンドラインのみです。 ユーザはひとつ以上の入力ファイル名と、ひとつの出力ファイル名を指定する必要があります。 入力されるムービーは指定された順に連結され、その後要求された操作が実行されます。

構文

$ edit.py -o 出力ファイル.swf [オプション] 入力ファイル ...

使用例

(圧縮つき swf7 形式で、.vnc を .swf に変換する)
$ edit.py -o out.swf -c -t swf7 input.vnc

(mp3ファイルを .swf に添加する)
$ edit.py -o out.swf -a voice.mp3 in.swf

(2つのムービーを連結し、一部のフレームをとりだして別のムービーをつくる)
$ edit.py -o out.swf -f 100-200,350- movie1.swf movie2.swf

(ムービーの左上部分をとりだし、それを半分のサイズに縮小したムービーをつくる)
$ edit.py -o small.swf -C 320x240+0+0 -s 0.5 in.swf

(.swf 形式を MPEG に変換する)
$ edit.py -o out.mpg input.swf

(.swf 形式を FLV に変換する)
$ edit.py -o out.flv input.swf

オプション

-o 出力ファイル
出力ファイル名を指定します。このオプションはつねに指定する必要があります。

-c
zlib でムービーを圧縮します。圧縮は swf5 または swf7形式のエンコーディングで使えますが、 これは swf7エンコーディングに適用されたときにもっとも効率的に圧縮されます。

-t エンコーディング
ムービーを指定された出力方式でエンコーディングします。 このオプションが指定されていない場合、ムービーの形式は 出力するファイル名の拡張子によって決定されます。

エンコーディング拡張子説明
swf5.swfSWF ムービー (デフォルト)
swf7SWFムービー (video エンコーディングをサポートしているプレイヤー向け)
flv.flvFLV ムービー
mpeg.mpgMPEG ムービー (要PyMedia)
bmp.bmpBMP 画像の列
png.pngPNG 画像の列

注意: swf7方式は Flash Player version 7 以上でのみサポートされています。

-f フレーム or
-F フレーム
出力するフレーム列を指定します。このオプションが指定されない場合は、 もとのムービーにあったフレームがすべてそのままの順序で出力されます (デフォルト)。 フレーム列はカンマで区切られた整数のリストです。 ある範囲を指定したいときは - (ハイフン) を使います。 たとえば、10,200,300-400 はフレーム番号 10 と 200 に加えて、 フレーム番号 300 から 400 までのすべてのフレームを指定します。 開始フレーム番号あるいは終了フレーム番号は省略することができます (e.g. -100 or 300-)。この場合、最初のフレーム (あるいは最後のフレーム) が もう一方の終端として使用されます。

-Fオプションと -fオプションの違いは、-F が 音声を切り取らないのに対して、 -fは音声も分断することです。 音声ファイルをムービーにのせたい場合、もし -fオプションと -aオプションを同時に使うと、これは与えられた mp3 ファイルを 選ばれたフレームに応じて自動的に切り分けます。しかし連続した音 (音楽など) をムービーに 載せたいときは、これは意図した結果とは違うことがあります。このような場合は -fのかわりに -F を使ってください。

-a mp3ファイル
mp3 ファイルをムービーに添加します。(現在FLV形式はサポートされていません。) 複数の mp3 ファイルが指定された場合、これらは指定された順序で連結されます。
注意: 複数の mp3 ファイルを指定する場合、 かならずすべてのファイルのビットレートが最初に指定したファイルと同じになるようにしてください。 また、 "ビットレート可変" (VBR) の mp3ファイルは SWF でサポートされていませんので 使わないようにしてください。

-s 比率
ムービー画像を縮小する比率を小数で指定します。
注意: 割り切れない比率 (0.7 など) を指定した場合、ノイズが出ることがあります。

-C クリッピング
ムービーを指定された矩形領域にクリッピングします。 矩形は "widthxheight+left+top" のようにして指定します (例: "400x300+120+0")。

-K キーフレーム間隔
指定された Nフレームごとに、キーフレームを挿入します。 キーフレームは Flash Player が長いムービーでフレームをシークする際の手がかりとして使用されます。 生成するムービーの合計フレーム数が 10,000 を超える場合、500フレームごとに 1枚のキーフレームを挿入するとよいでしょう (-K 500)。

-r フレームレート
ムービーのフレームレートを指定します。このオプション自体はフレームを間引くことはせず、 たんにムービーの速度を変更します。このオプションが省略された場合、edit.py は 元のムービーのフレームレートを使用します。

-R フレーム再サンプル頻度
ムービーのフレームを間引きます。指定した Nフレームごとに 1フレームが選ばれます。

-S mp3フレームスキップ
mp3フレーム (ムービーのフレームとは異なる概念です) で、最初の N個をスキップします。 数値のあとに s をつけた場合 (1.0s など)、これは フレーム数ではなく秒数を表します。 このオプションは録画された画像と音声の間にタイムラグがあるときに有用です。

-B ブロックサイズ
swf7およびflvエンコーディング方式における ブロックサイズを指定します (default=32)。この値は 16の倍数である必要があります。

-b
生成される HTML でシークバーをつけないようにします。

-l
生成される HTML でムービーがループしないようにします。

-d
デバッグレベルを上げます。


プレビュー

play.py は、.swfファイルまたは .vncファイルのための 単純なプレイヤーです。これは生成されたムービーのフレーム番号を見るのに有用です。 しかし、まだこのバージョンでは動きがぎこちないうえに、音声の出力ができません。 またこれは vnc2swfが生成したムービーだけを扱っており、一般的な SWF プレイヤーとしては使えません。

以下のようなキー操作を受け付けます:

構文

$ play.py [オプション] ムービーファイル ...

オプション

-r フレームレート
再生するフレームレートを指定します。

-s 比率
画像を縮小する比率を小数で指定します。

-C クリッピング
クリッピングの矩形領域を指定します。 矩形は "widthxheight+left+top" のようにして指定します (例: "400x300+120+0").

-d
デバッグレベルを上げます。


FAQ (よくある質問と回答)

録画したムービーにおかしなノイズが含まれている。どうやれば直る?
たぶん SWF ファイルをじかに再生したためです。 SWFムービーは、録画されたのと正確に同じサイズで再生する必要があります。 vnc2swf.py または edit.py ファイルが生成した HTMLファイルを使ってください。

音声つきのムービーをつくるにはどうやるの?
音声を別のプログラムで録音したあと Lame などで MP3 にエンコーディングし、edit.py-a オプションをつかってムービーに添加します。

シークバーを使うとブラウザが固まるんだけど。
数百フレームに 1枚、キーフレームを入れてください。edit.py-K オプションを使います。 ふつう、500フレームに 1枚 (-K 500) ほどキーフレームを入れるとそこそこましな結果になるようです。


プログラムの構造

このプログラムの動きを学習あるいは拡張したい方のために、 pyvnc2swf のオブジェクト間のデータの流れを説明する簡単な図 を描きました。


Yusuke Shinyama <yusuke at cs dot nyu dot edu>