ファイルメーカーでメディア管理システムを作る話の小ネタの一つ「僕にもできた動画サムネイルかんたん作成術」です。
オマケ:サムネイルを無理矢理作成
画像と違ってムービーファイルにはサムネイルが付きません。自分で作るしかありません。動画ファイルから静止画を作成するアプリなんてのもあるみたいですね。一般のメディア管理ソフトを使用すると動画を登録した際にサムネイルを作ってくれます。そういうアプリケーションのライブラリ内を探れば生成されたthumbnailファイルを見つけることもできます。それを流用するという手もあります。
でもそんなのめっちゃ面倒くさい!もっと楽に快適にムービーのサムネイルを作れないかと、少し考えました。思いつきました。
楽々スクリーンショット
一番簡単なのはプレビューしながらスクリーンショットを撮ることです。ムービーを再生して、エリア指定のスクリーンショットを撮るとファイルとして保存されます。これをサムネイルとして取り込めばいいですね。
いやいや、いやいや。まだ面倒です。保存されたファイルをまたわざわざ取り込むなんて、その行為が面倒すぎてぞっとします。
良いこと思いついた。スクリーンショットを撮るとき、ファイルではなくクリップボードに収めればいいんじゃないか。そして、FileMakerメディア管理のサムネイルフィールドにペタっとペーストする。これが最短、理想の道ですよ。おれって天才。よしこれで行きましょう。
クリップボードにスクリーンショット
AppleScriptではキーストロークが使えました。スクリプトの書き方が判らなくてもショートカットを登録すればいろんな事ができます。スクリーンショットをクリップボードにコピーするキーストロークをまずは走らせましょう。
Macのデフォルトでは確か command+shift+4 がエリアスクリーンショット、これに control を足すとエリアのスクリーンショットをクリップボードにコピーしてくれます。
tell application "System Events" key code 21 using {control down, command down} end tell
エリア選択したスクリーンショットをクリップボードに格納するAppleScriptの例ですが・・・。でもこれコントロール+コマンド+4になってます。私ショートカットをカスタマイズしていました。そのまま載せんなよ。すいません。普通はこれに shift down が加わります。コピペ非推奨。
「4」のキーコードは「21」ですが、「キーコード」などで検索していただきますとキーボードとコードの一覧なんかを書いてくれているページがいろいろヒットします。ありがとうございます。
特定ファイルに対して処理を行うわけではないので、FileMakerではそのままスクリプトステップに加えてボタンに仕込んでクリックすれば発動するようにしています。コマンド+シフト+コントロール+4 などというアクロバティックなショートカットを行うより、FileMakerの書類上でボタンをポンと押すのが想像以上に楽ちんです。
試しましょう。ムービープレビューが含まれるレイアウトにボタンを置いてスクリプトを割り当てます。ブラウズモードでムービーを再生、いいところでボタンクリック。カーソルが十字に変わって準備完了、プレビュー画面内でドラッグしてやればカシャッとスクリーンショットが撮れてクリップボードに格納されました。いいですね。
プレビューしながらかんたん便利にスクリーンショットをコピーできました。
目的フィールドにペースト
次にやることはコピーされたスクリーンショットを目的のサムネイルフィールドにペーストすることです。スクリプトステップ「貼り付け」を書き足します。よしできた。簡単すぎます〜。
・・・と、しかしこれでは駄目なんです。テストすればわかりますが、スクリーンショットを撮り終えるまで貼り付けステップを待ってくれないのです。すでにあるクリップボード内容が速攻でサムネイルフィールドにペーストされてしまいました。そりゃそうなりますわな。ここはスクリーンショットを撮り終えるまでスクリプトを一時停止して待機させなければなりません。
スクリプト一時停止はファイルメーカーで最も嫌いな措置です。ポーズボタンもキー操作も厭なので時間で待機します。1秒か?3秒か?もたもたできないすね。かといって10秒?待ってられないですね。いずれにしてもスクリプト一時停止で秒数を指定することは困難です。使い勝手も甚だ悪いです。クリップボードに格納されたら次のステップみたいな条件指定できませんし。何とかしてコピーし終えてからペーストするまでステップを待ってほしい。どうすればいいでしょうか。いい手はないでしょうか。考えます。思いつきました。それはこうです!
Loop使っちゃえ
スクリプトの最初から少し見直します。
まず最初にどうでもいいテキスト情報、例えばそのレコードのファイル名でもいいですね。それを「コピー」します。次のステップはサムネイルフィールドにペーストします。同時に、変数例えば$itemに同じものを仕込みます。
この段階で、クリップボードにファイル名、サムネイルフィールドにもファイル名、変数$itemにもファイル名が格納されました。
次のスクリプトステップでAppleScriptを実行させます。エリアスクリーンショット開始です。
さて次です。次のステップはLoopです。
Loop スクリプト一時停止[ 0.5秒 ] 貼り付け[ サムネイル ] Exit Loop If [ サムネイル ≠ $item ] end Loop
クリップボードの内容がサムネイルフィールドにペーストされ続けます。
Exit Loop If はループを抜ける条件です。変数とサムネイルフィールドの内容が異なっていればループは終わります。
スクリーンショットがクリップボードに格納されれば、次のタイミングでサムネイルフィールドに画像がペーストされます。変数$itemとサムネイルフィールドの内容が異なりましたから、そこでループから抜けます。
どうですこれ。力技過ぎますか。ブラウズや編集していて、おっとこの動画にサムネイルが欲しいな、カシャ。と、軽い気持ちでサムネイル生成できてとっても快適です。
こんなやり方がベストかどうかわかりませんが、そうやって動画サムネイルは日々少しずつ充実していってます。
大量の動画ファイルのサムネイルを一気に取り込みたいときは全く別のアプローチを思いつけばいいでしょう。最初に言ったように、一般の写真管理ソフトが生成するサムネイル画像を上手に使うのもいい手かもしれません。
このスクリプトステップは動画のスクリーンショットを撮るだけのためにあるわけではありません。実はいろんな曲面でこの仕組みを使った処理を行っています。例えばウェブサイトからちょっとしたものをスクリーンショットしておくとか、いろいろ使い道があります。これの発展系についてはまたいつか何か書くかもしれません。
AppleScript を高度に使うスクリーンショットを撮る必殺技
さてこの記事を書いてから結構な年月が流れました。ループでペースト待ちをする技は定番として使い続けています。それより、スクリーンショットを撮るそのやり方ですが、もっとスマートでカッコいい方法を会得しました。
ここではAppleScript にショートカットを擬似的に割り当てていますが、ストレートに命じることができると知ったんです。それはこうです。
"do shell script \"screencapture -c -i &\""
「AppleScriptを実行」でこの一文を命じます。たったこれだけです。エリアを選択するタイプのスクリーンキャプチャがクリップボードに収まります。
do shell script を理解するまでどれほどの期間を要したでしょう。あほなわたしにもついに出来ました。
この方法自体は自分でも気に入っていて、思いついて以来ずっと使っています。ただし、AppleScript の部分は後にもっとスマートかつシンプルな良い方法に改良されました。いずれ、この投稿の内容を書き換えます。