Apple Vision Pro の Spatial Videoについて調べてみた

## はじめに
Apple Vision ProのSpatial Videoについて調べてみました。

## Spatial Videoについて
* 右目用、左目用の映像を動画にしたステレオ立体視映像
* <b>メタデータ</b>により、Vision Proでの再生時に空間的に最適な表示を行う
* フォーマットはMV-HEVC(Multiview High Efficiency Video Encoding)

### メタデータについて

* Baseline
    * ステレオカメラの撮影時の距離。例:64cm
* Field of view
    * カメラの視野角。例:60°
* Display adjustment
    * 視差調整値。正の値だと背面に、負の値だと正面に飛び出て見える。例:+2%

こちらのWWDC24の動画で詳細まで説明されています。

https://developer.apple.com/videos/play/wwdc2024/10166/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/c8566c01-e6d8-6d43-8848-9781f615398e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/63e93130-b5a2-0ee6-b734-5584fd220707.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/01386874-044e-2ba2-b714-e0ce3de5f153.png)

## Spatial Videoを撮影する
Spatial Videoの撮影方法は、現状以下のデバイスで可能です。
* Apple Vision Pro
* iPhone 15Pro/ProMax
* iPhone 16全モデル

#### メタデータの調べ方
Vision Proで撮影したSpatial Videoをffprobeで解析したところ、以下の情報が出力されました。

```
   Side data:
        stereo3d: unspecified, view: packed, primary eye: none, baseline: 19240, horizontal_disparity_adjustment: 0.0200, horizontal_field_of_view: 63.400     
```
* baseline: 19240
* horizontal_disparity_adjustment: 0.0200
* horizontal_field_of_view: 63.400     

baselineが19240というのは良くわかりませんが、display adjustmentとfovはそれらしい値が取れました。

## Spatial Videoを再生する方法
Spatial Videoの再生方法は公式にはApple Vision ProのPhotoアプリで再生可能です。
他にもSpatial Videoを再生可能なアプリはあるようです（未調査）


## Spatial Videoのプレイヤーを作る
### Xcodeで再生する
先に紹介したWWDC24の[Build compelling spatial photo and video experiences](https://developer.apple.com/videos/play/wwdc2024/10166/)の動画で実装方法が紹介されています。

### Unityで再生する
VisionOSVideoComponentで再生可能です。
注意点として、動画ファイルはvideo clipとして設定し、同じファイルを/StreamingAssets/VisionOSVideoClips/に配置する必要があります。
URL指定は出来ません。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/VideoComponent.html

https://discussions.unity.com/t/spatial-video-support/354108

#### 余談
display adjustmentでの調整により、左目の画像は左にずらし、右目の画像は逆に右にずらしています。
ずらして余白ができる部分には端の映像が引き伸ばされるような形になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/01ad7ab9-2ed1-3ebf-ef9e-f23e7050036e.png)

この辺り、公式のPhotoアプリは端をぼかしていて見せ方が上手いなと思いました。

## Spatial Videoを作る

### Apple 公式のConverter
Side By Sideの videoを MV-HEVCに変換するサンプルプロジェクト

https://developer.apple.com/documentation/avfoundation/converting-side-by-side-3d-video-to-multiview-hevc-and-spatial-video

Spatial Videoにする場合は実行時引数で`--spatial...`を有効にする必要があります。
また、動画の音は無くなるので、別途audio部分を合成する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/61aacdac-2400-420a-4dac-ef5853d95ffd.png)


### Spatial Video Tool
Spatial Video ⇔ SBS or OU Stereo Video相互変換ツール ( Mac command line tool )
https://blog.mikeswanson.com/spatial/

こちらは音がなくなる事もなく、便利です。
Macでのみ動作します。

#### Spatial Video → SBS動画変換
```
./spatial export -i spatial_test.mov -f sbs  -o side_by_side.mov
```
##### 補足：Spatial 画像もSBS画像に変換できます。
```
./spatial export -i spatial_test.HEIC -f sbs  -o side_by_side.png
```

#### SBS動画 → Spatial Video変換
```
./spatial make -i side_by_side.mov -f sbs  -o new_spatial.mov  --cdist 19.24 --hfov 63.4 --hadjust 0.02  --primary right --projection rect
```

### メタデータを変更して見た目を比較する
メタデータを変更した動画で見た目を比較してみました。

FoVを60-90で比較した場合
Photoアプリのwindowモードでは違いがなく、Immersiveモードにすると、90°の方が大きく表示されました。
数値を変更してみましたが、Photoアプリでは最小60°、最大90°でそれを超えた値を指定しても変化はありませんでした。

https://x.com/afjk01/status/1838749169869295749

## 参考

https://developer.apple.com/videos/play/wwdc2023/10071/?time=320

https://developer.apple.com/videos/play/wwdc2024/10166/

#### Xcodeでのプレイヤーサンプル
[GitHub - mikeswanson/SpatialPlayer: An example spatial/immersive MV-HEVC video player for Apple Vision Pro](https://github.com/mikeswanson/SpatialPlayer)