# osv2insv — DJI Osmo 360 .OSV → Insta360 Studio 可開的 .insv（實驗性）

```
python3 osv2insv.py INPUT.OSV OUTPUT_DIR [--seconds N] [--num NNN] [--shift-ms -10]
```

影像/音訊直接 stream copy（10-bit HEVC 原封不動，Studio 6.0.6 可解），檔尾用真 X5 檔的 Metadata 當範本（`template_x5_metadata.bin`），
鏡頭校正、陀螺儀、曝光由 OSV 的 `djmd` 軌換算。輸出檔名 `VID_YYYYMMDD_HHMMSS_00_NNN.insv`（要照 X5 命名，副檔名前不可加字）。

## 實測定案（2026-10-06，Insta360 Studio 6.0.6，Osmo 360 fw 10.00.25.29）
- 鏡頭：DJI Kannala-Brandt 5 項 → Insta360 MEI(ξ=2) 最小平方擬合，誤差 <1 px；參考座標用 7680×3840、crop 3840→3840（恆等，避開 X5 的 5376/5312 縮放歧義）。
- 兩鏡頭 yaw/pitch/roll 都填 (0,0,90)（X5 慣例），0.52° 的相對 roll 殘差未填（正負號慣例未知）。
- DJI 姿態四元數：欄位順序 (w,x,y,z)、body→world、座標是航空式 **x 前 y 右 z 下**（不是校正用的 x 右 y 前 z 上）；
  對應 stream-0 影像座標 I(x右,y下,z前)：I.x=−q.y, I.y=q.z, I.z=−q.x。由影片幀間位移與姿態增量的相關分析定出。
- Insta360 X5 IMU 軸向（gyro/accel 同一套）：imu=(I.y, I.z, I.x)，由真 X5 檔的畫面位移 vs 陀螺儀、重力 vs 地平線定出。
- 陀螺儀寫成 raw u16（gyro_range 2000 dps、acc_range 32 g），重新取樣到整數 1 ms；時間戳整體**提早 10 ms**（0 很晃、−16/−22 比 −10 差）。
- 未做：縮圖紀錄、AAA/Anchors 等紀錄；Studio 的「方向鎖定／傾斜還原」呈灰色，原因未查。

## 工具
- `dump_insv.py FILE [extra_info.rs]`：列出檔尾紀錄與 Metadata 欄位。
- `osvmeta.py FILE`：列出 OSV 校正與姿態摘要。
- `residual.py / lagcheck.py / gyrosign.py / level_check.py / seamcheck.py`：驗證用（畫面位移 vs 陀螺儀、重力水平、接縫對齊）。
- 真 X5 樣本：`~/dji/_insv_test/x5_sample_VID_20250416_143628_00_005.insv`（公開下載，Bennetts 評測）。
