Google Playのストア掲載ページには、動画を1本置けます。30秒程度の紹介動画です。
編集ソフトを開かずに作りました。入力は実機の画面録画だけ。あとは全部シェルスクリプトとffmpeg、BGMもPythonの標準ライブラリで波形合成しています。外部の素材はゼロです。
3本作ったので、再現できる形で書きます。
構成
ビルドは2段階です。
build_assets.sh 端末フレーム・角丸マスク・影・テロップ画像を生成
build_promo.sh シーンを並べて連結し、BGMを乗せる
make_bgm.py BGMを波形合成(標準ライブラリのみ)
シーン構成は6つ、合計30.2秒。日記アプリ版だとこうです。
1. フック「日記って、三日で終わる。」
2. 一行だけ書けばいい
3. 書いたらAIがひとこと返す
4. カレンダーに色がつく
5. 気持ちの変化がグラフでわかる
6. エンドカード
最初の2秒で「刺さらない人」を降ろすのが目的なので、フックには機能ではなく、その人が困っていることを置きます。
地雷1: zoompan の x='0' は画面の右端を切る
静止画をゆっくり寄せる(Ken Burns効果)ときに zoompan を使います。素直に書くとこうなります。
zoompan=z='min(zoom+0.0008,1.2)':x='0':y='0':d=200
これは左上を基準に寄せるので、画面の右側が切れます。スマホのスクリーンショットで右上にあるのは、時刻、電池、そしてプレミアムバッジでした。見せたいものが真っ先に消えます。
中央基準に直します。
x='iw*0.5-(iw/zoom*0.5)'
y='ih*0.5-(ih/zoom*0.5)'
地雷2: 素材にテスト広告が写り込んでいる
開発ビルドで画面録画すると、AdMobのテスト広告バナーがそのまま入ります。「Test Ad」と書かれた帯が公式ストアの掲載動画に載るのはさすがにまずい。
再撮影せずに、アプリの背景色で塗りつぶしました。
drawbox=x=68:y=770:w=584:h=102:color=0xF7F8FC:t=fill
ポイントが2つあります。
塗る色は黒ではなく、アプリの背景色にする。 黒い箱が乗っていると、それはそれで不自然です。
マスクは広告の実寸より少し大きく取る。 ぴったりのサイズで塗ると、バナーの外周の枠線が1px残ります。 一度これで失敗して、書き出してから気づきました。
地雷3: 広告だけ消して満足しない
絵本アプリの素材では、テスト広告を消した後にもう1つ見つかりました。
IMEの変換候補バーに、誤変換が写っていました。
公園で無視を見つけ
「虫」が「無視」になっています。入力の実演シーンなので、キーボードごと映っている。これも背景色で塗りました。
drawbox=x=0:y=1014:w=720:h=72:color=0xEAEEF2:t=fill
素材を1回チェックして終わりにしない。 消したいものの隣に、別の消したいものがあります。実機の録画は、こちらの意図と関係なく全部を記録しています。
地雷4: 途中で解像度が変わる動画
絵本アプリは、入力と生成中が縦画面、読み上げが横画面です。1本の録画ファイルの中で、解像度が 720x1600 から 1600x720 に変わります。
厄介なのは、ffprobe が先頭の解像度しか報告しないことです。縦だと思って処理を組むと、後半で破綻します。
コンタクトシート(素材の一覧画像)を作るときに hstack が失敗して気づきました。対処はサイズを揃えてから積むことです。
scale=480:480:force_original_aspect_ratio=decrease,pad=480:480:(ow-iw)/2:(oh-ih)/2
ちなみに、この縦横混在は最終的に残しました。 横画面で絵本を読む画面は、それ自体が絵本らしくて良い。縦用と横用で端末フレームを2種類作り、横シーンは中央に大きく置いてテロップを上に寄せています。素材の都合を、演出として引き受けたほうが早いことがあります。
地雷5: 関数の出力ファイル名を固定にすると2回目で壊れる
角丸マスクと影を作るシェル関数を、縦と横の両方で呼びました。
roundrect 1920 1080 out.png # 横
roundrect 1080 1920 out.png # 縦 ← 1回目を上書き
2回目が1回目を潰し、後段の alphamerge がサイズ不一致で落ちます。 エラーは合成処理の場所を指すので、原因が関数の出力先だと気づくまで遠回りしました。
呼び出しごとにサフィックスを付けて終わりです。中間ファイル名を固定にした関数は、2回呼ばれた瞬間に壊れます。
素材が足りないときは、静止画にする
日記アプリで、AIのコメントが表示される画面の実映像が1.4秒しかありませんでした。 録画の59.4秒から60.8秒まで。それ以降は別の画面に遷移しています。
見せたいシーンは6.6秒必要でした。再撮影せず、静止画を切り出して zoompan でゆっくり寄せました。 動きがあるので、静止画だと言われるまで気づきません。
同じ理由でグラフの画面も静止画にしています。実映像を使うと、途中で別画面へ遷移してしまうためです。「動いている必要があるか」を1シーンずつ問い直すと、撮り直しの大半は不要になります。
BGMは標準ライブラリで作れる
フリー素材のBGMはライセンスの確認が要るうえ、ストア掲載動画では商用利用の可否も見る必要があります。Pythonで作りました。
コード進行と音色を変えるだけで、3本それぞれの雰囲気になります。
| アプリ | BPM | 打楽器 | 音色 |
|---|---|---|---|
| 行列予測 | 112 | キックあり | 明るいパッド |
| 日記 | 100 | キックなし | 落ち着いたパッド |
| 寝かしつけ絵本 | 76 | なし(シェイカーも削除) | オルゴール寄りのプラック |
寝かしつけアプリのBGMからキックを抜いたのは正解でした。打楽器があると、寝かしつけの動画にならない。 76BPMは心拍より遅く、意図的にそうしています。
配色は、アプリごとに思想が逆になることがある
3本目を作るとき、1本目の設定を流用しようとして失敗しました。
- 行列予測アプリ: 濃紺のダークテーマ
- 日記アプリ: 薄いオレンジのライトテーマ(途中で変更)
- 絵本アプリ: 濃紺+紫と金のグロー
日記アプリだけ、明るい背景です。ここに暗いテーマ用の文字色をそのまま持ってくると全部読めません。文字色を全部反転させ、さらに端末が背景に沈むので、温かい茶色の影を専用に作りました。
暗い背景では影は自然に効きますが、明るい背景では影を意図的に設計しないと、要素が浮かずに沈みます。
注意書きは焼き込む
AIの生成にクレジットや無料枠を使うアプリなので、動画の中に一行入れています。
※無料プランは毎日1話。広告を見ると、もう1話つくれます。
アプリ内のペイウォールと同じ表現に揃えるのが重要です。動画とアプリで言い回しが違うと、それだけで不信感が出ます。
一方で、具体的なクレジット数は書きません。 数値を出すと悪用の誘因になり、仕様を変えるたびに掲載動画を作り直す羽目にもなります。
同じ素材から縦のShorts版も作りました。その話と、YouTubeへの自動アップロードで詰まった件はこちらに書いています。撮影素材に個人情報が写り込んでいた件はこちらです。