関連記事(5月26日)Chromeで正常再生させる後処理について
FFmpeg でパソコン操作画面の動画キャプチャを行う件、前ブログで書いた手順を自分なりに改善したのでメモ。今回はまず無劣化で MKV 形式に録画、続いて WebM 形式にエンコードします。前の方法は録画と同時に MP4 保存していて画質が余り綺麗でなく、それをスマートフォンのFirefoxで見れるようにWebMに変換することで、さらに劣化していました。 今回は無劣化の動画からエンコードし、圧縮率も良いので画質やファイルサイズを基本的に気にしなくて済みます。WebM は一部のブラウザがまだ対応していませんが、Firefox 最新版ならPC・スマホともに問題なく再生でき、ブラウザで駄目でもダウンロードしてもらえば各種動画プレーヤで見れるので、このブログでは WebM に一本化する予定。 無劣化録画については、Arch Linux Japan - FFmpeg のスクリーンキャストの項に「ロスレスエンコード」コマンド例があって知りました。m(_)m 下は、今回の方法でキャプチャし 2015/05/032015/05/09 に載せた動画の再掲です。(5月26日追記:Chromeで正常再生できる動画に差し替えました)
準備
以下 Windows 7 32bit で行った例です。まず http://ffmpeg.zeranoe.com/builds/ からコンパイル済みの FFmpeg を入手。これを書いている時点の最新版は ffmpeg-20150428-git-b410c69-win32-static.7z でした。このうち今回必要なのは bin フォルダ内にある ↓ ffmpeg.exe だけで、適当な作業用フォルダに解凍します。 ↓ 解凍した ffmpeg と同じ場所にバッチファイル二つと、場所はどこでもいいですが録画範囲確認用の HTML を置きます。後者は先月作ったものと同じで、JavaScript でブラウザの左上位置とサイズを表示するもの。これを目安に FFmpeg の録画範囲オプションを設定します。Firefox 37, Chromium 42, IE10 で動作確認しました。 ↓ 一つ目のバッチがスクリーンの無劣化録画で、やり直しし易いよう一実行ごとに press [s] to start, [q] for quit のプロンプトを出して待機します。この待機中にファイル内のオプション設定を変えて保存すれば、次の実行時に即反映されます(自分自身を再帰呼び出しするから)。 ↓ 二つ目のバッチがエンコード用。多少時間かかりますが二パスにしました。
使用例
まず録画範囲確認用 HTML をブラウザで読み込むと、下のように FFmpeg に渡すオプションの形式で表示されます。今回の JavaScript は単純に 0.1 秒ごとに再実行するので、テキスト選択してもすぐ解除され、コピペに使えません。まぁ目安用なのでいいかなと。 ↓ 録画用バッチを起動した様子。これが待機状態で、s 打鍵で開始、q で終了します。終了したらコンソールが自動的にクリアされ、再び同じプロンプトに戻ります。FFmpeg のオプションで -loglevel quiet になっているため、録画中は一切表示が出ません。loglevel を変更すれば録画中の情報をいろいろ表示できます。 ↓ 保存先に指定したファイルが既にあると、s 打鍵で録画開始を指示した後、FFmpeg がそれを検知して「上書きしますか」と聞いてきます。この時点で録画自体は始まっており、上書きを指示すると、既存の動画の後方につなげて保存する意外な挙動でした(文字通りの上書きではない)。環境によって違うかもしれません。混乱を避けるためには、常に新規ファイルへの保存がいいかも。 ↓ 録画結果のファイル例。無劣化なので、わずか14秒の動画が62MB、1分超えただけで数百MBになります。 ↓ WebM へのエンコードバッチを起動し、保存先ファイルが既存だった場合。未存ならメッセージは一切なく自動的に開始し、終わり次第コンソールが消えます。 ↓ エンコード結果の一例。圧縮率は動画の内容によって変わりますが、先ほどの14秒・62MBから241KBになりました。1分でも約1MB程度で済み、画質も良好です。 録画したうち先頭や末尾に不要部分があれば、エンコード時のオプション指定でカット可能。「-ss 秒数」が開始時間なので先頭スキップ、「-t hh:mm:ss」がエンコード時間指定なので末尾スキップに使えます。(情報源 : それマグで!- ffmpeg で指定時間だけエンコード