みずぴー日記

陽気なプログラマが世界を廻す

📷 mov/jpegからのLive Photo生成

要約

MOV動画とJPEG画像からLive Photoを生成するLoveLiverというツールを作った。

f:id:mzp:20151011171740p:plain

Live Photos の仕組み

Live PhotosはQuickTimeフォーマット(mov)とJPEG画像を組合せすることで実現されている。 TechCrunchのReview: Apple’s iPhone 6s And 6s Plus Go ‘Tick’ | TechCrunchの図が分かりやすい。

f:id:mzp:20151011161325j:plain

(http://techcrunch.com/2015/09/22/review-apples-iphone-6s-and-6s-plus-go-tick/#.ngcoh9:5tnw より引用)

ただ、図では45フレーム固定のようになっているが、実際には固定されていない。 iPhone 6sで撮影すると45フレームになるが、Live Photos自体はもっと長時間再生できる。 また、AppleWatchに転送して文字盤に設定した場合は、先頭20フレームくらい*1しか再生されない。

Live Photo の作り方

iOS

iOS 9.1でLive Photoを操作するAPIの追加が予定されている。ベータ版のiOSで利用可能になっているため、LivePhotoDemoのようなデモアプリが作成されている。

ただ、LivePhotoの再生等はできるが、フォトアルバムに保存することは実現できていないらしい。 この問題については Saving to Camera Roll #3 で議論されている。 ボクもいくつか試してみたが、保存は実現できていない。

iOS 9.1が正式にリリースされることには保存もできるようになっていると思う。

MacOS X

El Capitan の Photos.app(写真アプリ)でmovとjpegをまとめてインポートすると、1つのLive Photo としてインポートできる。

このとき、結びつけられるmovとjpegは以下の条件を満す必要がある。

  • 拡張子を除いたファイル名が一致する。(例: IMG_0042.JPGIMG_0042.MOV)
  • JPEGとMOVのメタデータに共通のUUIDが保存されている。
    • JPEG: ExifのMakerNote内の kFigAppleMakerNote_AssetIdentifier ("17") に対する値として保存する。
    • MOV: mov自体のメタデータcom.apple.quicktime.content.identifier に対する値として保存する。
  • MOVのメタデータcom.apple.quicktime.still-image-time が保存されている。
    • metadataトラックとして保存する。
    • 値の意味はよくわかってない。

この条件については、先程のIssues内で報告されている。

また、LoveLiverもこの仕組みを使っている。

その他メモ

ffmpegによる変換

ffmpeg でLive Photos用のmovを作るには、以下のようにする。

ffmpeg -r 15 -i source.mov -r 15 -an -vcodec h264 -pix_fmt yuv420p composed.mov

フレームごとに選びたい場合は、いったん画像に分割して必要なものを選ぶとよい。

ffmpeg -i source.mov frame%d.png
# 必要な画像ファイルを45枚選ぶ
ffmpeg -r 15 -i frame%d.png -r 15 -an -vcodec h264 -pix_fmt yuv420p composed.mov

Live Photo に向いてる動画

  • 15fpsなので動きがおだやかなもの。
  • 縦長の動画。
  • 高解像度の動画。 ホーム画面・ロック画面は縦向きなのでフルHDでも若干不足である。

デレステのMVシネマグラフィクス(一部だけ動くGIF動画)などをためしたが、しっくりこなかったのでMMDで動画を作成した。

*1:厳密な数字は未確認