見出し画像

アイドルを手首の上で踊らせるためのwatchfaceの解析

ばんじゅん🍓です。この記事はアイドルマスター Advent Calendar 2020
の15日目です。いちごの季節になりましたね。昨日はべ#3616さんで「(記事執筆は後ほどらしいが時間をいくらでも奪われそうな意味深なサービスのURLが書かれている)」でした。気になりますね。

~ ここから #imas_hack モード ~

アイマスハッカソンから始まったIM@Studyでは月1くらいでもくもく会が開催されている(→connpass)。今年は昼のお仕事がフルリモートになって極めて多忙になったものの、もくもく会もリモート開催になって参加しやすくなり、できる限り都合をつけて参加するようにしていた。WWDCでwatchOS 7が発表されたあとは、もくもく会のうち何回かにわたって、Watch Face Sharingで使われているwatchfaceファイル形式の解析と、それを扱うアプリとライブラリの開発をしていた。

Watch Face Sharing

Watch Face Sharingとは、自分のApple Watchの文字盤を他の人にシェアする機能である。シリアライズされたファイル形式は非公開フォーマットだが、watchfaceという拡張子のファイルそのものは取り出して受け渡したりWebからダウンロードさせることがAppleにより意図されている。

画像1

— 「文字盤を共有」 https://www.apple.com/jp/watchos/watchos-7/

ロック画面とか文字盤とかどうしてる?

ところでPのみなさんは文字盤に何を設定しているのだろう? iPhoneであればロック画面に担当アイドルを置いているかもしれない。わたしはmzp/LoveLiverを使ってデレステMVを切り出したライブフォトを置いている。ロック画面をぎゅっとするとアイドルが3秒間60fpsで踊ってくれる。任意の動画を切り出せるので15周年の動画の最もわたしたち寄りの部分を切り抜いて置くこともできる。

Watchの文字盤となるとシンプルすぎる「写真文字盤」を使っている人は少ないかもしれない。わたしはお絵描きしたイラストを写真文字盤にして並べて置いていることが多い。

任意のライブフォトを文字盤にしたい!

LoveLiverでiPhoneのロック画面にデレステMVを使うのは簡単になったものの、Watchの写真文字盤でライブフォトをまともに動かす方法はよくわかっていなかった。一見してWatchはライブフォトをサポートしているように見えるのだが、実際には動かないことがとても多かった。今年からはWatchの写真アプリをポチポチしなくとも、watchfaceファイルで内部構造を理解しながら試行錯誤できるようになるので、まずはwatchfaceを解析していた。その過程でできたwatchface編集アプリとその基礎となるライブラリはここ https://github.com/banjun/WatchFaceDumper/ に置いてあり、zennに書いたポエムでざっくり状況報告した。

解析の闇に飲まれる

LoveLiverのときのライブフォトそのものの解析のときもそうだったが、Appleの機能をAppleの用意していない経路から使うときは、天然もののファイルとフェイク人工物のファイルとの差でうまく動かないことがあり、その差を詰めていく地味な作業が発生する。天然のライブフォトはiPhoneの純正カメラアプリで撮影すると得られる。今回はそのライブフォトからしてデレステMVを切り出したLoveLiverによる合成物を使いたいので、フェイクにフェイクを重ねて解析が混沌とした。

2020年12月時点ではまだユニバーサルな正解を得てはいないのだが、解析のなかでいくつかの制約または制約から導かれる挙動が判明した。ライブフォトの写真文字盤は、本当にさまざまな影響を受けてうまく読み込まれなかったりあまり動かなかったりする。動画のサイズ(解像度)や、再生時間の長さや、fpsや、ライブフォトのキーフォトの位置や、watchOSのバージョンによるそもそもライブフォトの再生動作の違いや、最近のApple Watchに搭載されているAlways-Onディスプレイの機能が有効かどうかの影響を受ける。これらのうち互いに影響する要素もあり、いずれかの要素がミスっていると他の要素をいくら変動させてもまるで動かない。

実験、そして、理想に近く動くであろうパターン

WatchFaceDumperをパラメータ変えてビルドしつつ、いくつかのパターンを実験した。謎が多すぎたので、ストップウォッチを撮影した天然ライブフォトも使った。

画像2

いまのところ、理想に近く動くであろうパターンは、次のとおり。これらのいくつかを選択するとより良くなる。

1. Watchの画面設定でAlways-Onディスプレイをオフにする。これによって、腕を上げる動作でライブフォト再生がトリガーされるようになる。 refs https://discussions.apple.com/thread/251591954 
2. 写真を2枚以上含める。これによって、文字盤タップでライブフォト再生がトリガーされるようになる。
3. watchOS 7の初期バージョン、またはより前のバージョンを利用する。これによって、フォースのないロングタップ、または文字盤の左右端をロングタップすることでライブフォト再生がトリガーされるようになる。
4. 30fps以下の動画を使用する。60fpsになるとWatch上での再生時間が極端に短くなってしまう。
5. 動画の長さとwatchface内の再生時間メタデータはできるだけ揃える(差1秒以内?)
6. watchface内のキーフォトの位置(still image display time)は2秒~2.9秒付近にする。実は後ろのほうに置くことで再生時間を長くできる(文字盤のライブフォト再生にはフェードインアウトがないので、iPhone上の再生とはキーフォト位置の扱いが異なるのだろう...)。

実験から得られたケースをのせる。2.7秒のmov(天然)に対し、キーフォトの位置(iris still image display time)をずらして生成したときに、実機で動画が再生されている区間を目で拾ったもの。この動画に対しては、キーフォトが2.0秒までは単にその位置まで再生時間が伸びる挙動をする。この動画ではなぜか2.5秒以上に伸ばすと再生時間が短くなってしまった。

画像3

フェイクライブフォトのmov部分を再エンコードしてもよいことにし、ffmpegでh264でfpsを変えて読み込ませてみる。元の動画はデレステMVから抜き出した3秒。キーフォトの位置を2.0,2.5,2.9と変えつつ、60fps, 30fps, 15fpsで文字盤を作り実機再生を眺める。60fpsだけ再生時間が短くなってしまう。この例では前の例のような急に短くなるポイントはみられなかった。30fpsでキーフォト2.9秒というのはほぼ理想に近い再生時間を出している。

画像4

これら実験結果と上記「理想に近く動くであろうパターン」を踏まえると、デレステMVから作成したライブフォトをApple Watchで良く動かす戦略が見えてくる。Watchサイズにクロップ&リサイズし、30fpsにエンコードし、その長さをiris durationとし、それマイナス0.1秒をキーフォト位置(iris still image display time)とする。Always-OnのWatchでもタップで動かせるようにするために、1枚の文字盤のときは2枚に同じ内容を入れてwatchfaceをつくる。

フェイクライブフォトをiPhoneの写真アプリの機能でwatchfaceに変換したものは、iPhoneから取り出して元のiPhoneに書き戻すこともできない壊れたwatchfaceが作成されることがあるのだが、この戦略でいくと、そういうwatchfaceを再びiPhoneで読み込めるwatchfaceへとリカバリーすることもできる。天然ものより修正能力が高いロジックを得たことになる。

実験環境

watchOSやiOSや個体の状態の差に起因する問題が出ると厄介なので、実験装置はこのようになる。それぞれペアされたiPhoneとWatchを2ペア用意し、M1のMacBook Airで開発してAirからAirDropで2台のiPhoneに渡し、Watchに転送させた。

画像5

現状のLoveLiver生成ライブフォトの弱点

デレステのMVをLoveLiverで切り出して生成したライブフォトは、判明した振舞いを考慮すると、弱点が二つある。60fpsであることと、キーフォトの位置が0であること。現状ではこれらをなんらかの方法で、30fpsかつキーフォト位置を後ろにずらす必要がある。

いますぐ手首の上で踊ってもらえるようになるために

watchfaceとライブフォトの振舞いのかなりの部分を掌握したので、このフロー全体をうまく実装してしまえば、実証を兼ねて、デレステMVから切り出したライブフォトをいくらでもたくさん手首の上で動かせるようになるはず。個々の機能としては動いてはいる(成功すると下の図のようになり読み込める)。統一された体験は今後の課題とする・・・。ちなみにわたしは半分壊れたデータで実験をやりすぎたせいか、iPhoneに文字盤を追加しようとすると、文字盤自体とは無関係に、橘ありすが文字盤のサムネになるようになった。

画像6

写真アプリでライブフォトの写真文字盤を生成する機能自体はApple純正のものであるので、60fpsを回避しさえすれば(例えばこんなので十分 `ffmpeg -i crop済み.mov -r 30 -vcodec h264 -vb 500k -movflags +faststart -preset slow -color_primaries bt709 -an crop済み.r30.mov`)、iPhone上の操作のみでよく動くライブフォト文字盤を作ることはできる。

画像7

画像8

腕の持ち上げでアイドルが踊ってくれるのはとても楽しいので、ぜひAlways-Onディスプレイをオフにして、ライブフォト文字盤とともに生活してみてほしい。本当はAlways-Onディスプレイでも動くようになるとさらに実在性が上がるはずではある。Always-Onディスプレイでライブフォトを再生しない積極的な理由はないように思えるので、Appleにもフィードバックしておきたい。


おわりだよ〜

いかがでしたか?明日のアドベントカレンダーはみかみんさんです。期待大ですね!

この記事が気に入ったらサポートをしてみませんか?