# 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 プログラムから構成されています:

- `vnc2swf.py` - 録画ツール
- `edit.py` - 編集ツール (これは vnc2swf によって生成された SWF のみをサポートしており、一般的な SWFエディタではありません)
- `play.py` - 再生ツール

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

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

### インストール

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

- Python (2.4 以上)
- Pygame (1.6 以上)
- オプション: PyMedia (1.3.5 以上 - MPEG エンコーディングに必要)

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

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

- RealVNC or TightVNC (Unix, Linux or Windows)
- x11vnc (Unix/Linux、現在のデスクトップを録画する場合)
- OSXVnc (Mac OS X)
- GNOME Vino (これは独立したパッケージではありませんが、「リモートデスクトップ」機能が塔載されている GNOME環境をお持ちの場合、このプログラムはインストールされています)

### 録画する

`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 のようなものを個別に起動する必要があります。

#### 構文

- (GUI) `$ vnc2swf.py [-o ファイル名] [オプション] [ホスト[:display] [ポート番号]]`
- (CLI) `$ vnc2swf.py -n -o ファイル名 [オプション] [ホスト[:display] [ポート番号]]`

#### 使用例

>     (仮想スクリーンを録画する)
>     $ 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 の説明もごらんください。 これはある特定のウィンドウだけを録画する簡素なスクリプトです。

#### 録画のコツ

- なるべく小さい画面サイズを使うか、クリッピング領域を指定してください。 画面サイズが大きいと、VNC の画面スキャンも遅くなり、vnc2swf もまた 大きな画像を変換するために遅くなります。また、小さい画面を使うと ムービーのサイズも小さくなります。
- フレームレートを落とすと、ムービーのサイズが削減できることがあります。 生成されたムービーがそれでも大きい場合、 `edit.py` でフレームを間引くか、 画像を縮小してみてください。
- 長い動画 (20分以上) を録画する場合、使用可能な形式は flv (あるいは PyMedia がある場合は mpeg) だけです。 `swf5` または `swf7` ファイルには制限があって、 最大16000フレーム (約22分) までの動画にしか使えません。
- コマ落ちがある場合は、VNCサーバ側の検出オプションを (もしあれば) 変更してみてください。 `x11vnc` を使っている場合は `-wait 10 -defer 10` を追加します。
- `flv`動画では、出力ファイル名として '`-`' を指定することにより 動画ストリームを標準出力に送ることができます。(なんに使うんだ?)

#### オプション

`-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` | `.swf` | SWF ムービー (デフォルト)
  `swf7` |  | SWFムービー (video エンコーディングをサポートしているプレイヤー向け)
  `flv` | `.flv` | FLV ムービー
  `mpeg` | `.mpg` | MPEG ムービー (要PyMedia)
  `bmp` | `.bmp` | BMP 画像の列
  `png` | `.png` | PNG 画像の列

  注意: `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 プレイヤーとしては使えません。

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

- Space または Enter または マウスクリック: 再生/停止の切り換え。
- カーソルキー またはシークバーをドラッグ: フレームをシークする。
- "`q`" キーまたは Escキー: 終了する。
- "`s`": スナップショットを取る。 このときの画像は "`inputfile-frameno.bmp`" のような名前で保存されます。

#### 構文

`$ 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 のオブジェクト間のデータの流れを説明する簡単な図 を描きました。