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: zoompanx='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への自動アップロードで詰まった件はこちらに書いています。撮影素材に個人情報が写り込んでいた件はこちらです。