Insta360 の「荒カット」を、画質もジャイロも落とさずに ― TrimFast を作った話

みなさん、こんにちは。

街中で360度カメラを使って撮影している人をみかける機会、かなり増えましたよね。

360度カメラは、撮影時にアングルやフレームを気にする必要がありません。あとから好きな位置でフレームを切り出せるので、「大事な場面を撮り逃がした…!」という失敗がなくなるのが本当に画期的です。

私も一昨年に Insta360 X2 を入手して、撮影に大活躍しています。

ですが、Linuxユーザーである私の大きな悩み……それは「公式ツール(Insta360 Studio)がLinuxに対応していないこと」でした。

スマホやタブレットでリフレーミングし、自宅のWindowsで編集するフロー自体は確立できたのですが、やはり普段使いしているLinuxをワークフローに入れたい気持ちが拭えません。また、撮影後の .insv ファイルの保存方法にも課題がありました。あとから別の角度で切り出したくなった時のために元データは残しておきたいものの、リフレーミング機能を保つには、使わない不要な部分まで丸ごと保存しておく必要があったのです。

「使いたい部分だけをサクッと無劣化でカット保存したい。できれば軽量な Haiku OS、難しければ Linux で!」――これが開発のスタートでした。


360度動画の「荒カット」問題

Insta360 のような360度カメラって、基本的に「とりあえず録画を回しっぱなしにする」使い方になりがちなんですよね。その結果、手元に残るのは数分〜数十分の長大な .insv ファイル。しかも Insta360 はレンズごとに1ファイル(_00_ と _10_)作成されるため、たとえば168秒の動画でも、約1GBのファイルが2本もできてしまいます。

本格的な編集に入る前に、「ここからここまでだけ残したい!」という作業(荒カット)をしたいだけなのですが、いざやろうとすると次のような壁にぶつかります。

  • 2本のファイルを「全く同じ範囲」で正確に切る必要がある
  • 再エンコードすると画質が落ちるし、時間もかかる
  • ffmpeg の stream copy(-c copy)で切るだけだと、末尾のカメラ固有データが消えて手ぶれ補正などが効かなくなる

「それなら、Insta360 の荒カットを完璧にこなす専用ツールを自分で作ろう!」と思い立ちました。


小さく、速く、キーボード操作でサクサクと

実は、もともとの動機は Haiku OS で動く軽快な無劣化トリマーが欲しかっただけでした。それが、単なるトリマーではつまらないとなり、Insta 360 対応を思いついたわけです。Insta360 対応するなら、普段使いのLinuxで活用しない手はありません。そのため、設計の方針を次のように固めました。

  • Haiku OS を最優先ターゲットにしつつ、Linux も正式サポートする
  • Qt 6 Widgets / C++20 を採用(Electron や Chromium などは使わず軽量に!)
  • 高機能な動画編集アプリではなく「撮影済み動画の整理」に特化(エフェクト、テロップ、AI機能、テレメトリなどは一切入れない)
  • キーボード操作を中心に(I で開始点、O で終了点、Ctrl+E で書き出し)
  • 必ず FFmpeg の stream copy を使う(コード内にも再エンコード処理そのものを作らない)

まずはコードを書く前に、画面のモックアップと設計書を作成しました。

モックアップ画面
モックアップ画面

その後、アーキテクチャ設計と7ステップの実装計画を立て、Haiku の仮想マシンと Linux の両方で実際に動かしながら開発を進めていきました。


無劣化カットの基本(ここまでは普通のツール)

stream copy は映像をデコードせずにパケットをそのままコピーするため、画質を一切落とさず超高速で処理できます。ただし、いくつかの制約もあります。

  • カットの開始点はキーフレームにしか置けない(TrimFast では IN 点を直前のキーフレームに自動吸着させ、ステータスバーに表示します)
  • 終了点はコーデックの並べ替え都合上、数フレームの誤差が出ることがある

また、書き出しの安全性にもこだわりました。処理中は一時ファイルとして書き出し、すべて成功した時だけ本来のファイル名にリネームします。失敗やキャンセルの場合は何も残さず、既存ファイルの上書き確認も徹底しました。

処理スピードは圧倒的で、実測だと 1時間分の動画から10分間を切り出すのに Linux で約1.7秒、Haiku の仮想マシンでも約4秒で完了します。アプリの起動速度も Linux で約25ms と爆速です!

Insta360 Studio のもっさりとした感覚に比べると、まさに羽が生えたようです!


Insta360 の .insv の中身を開けてみた

ここからが今回の開発のハイライトです!

.insv の構造どうなってる?

詳しく調べてみると、.insv は以下のような構造になっていました。

[ ftyp ][ mdat(映像・音声) ][ moov(索引など) ][ free(整列用) ]   ← ここまでは普通の MP4
[ Insta360 独自のデータ(トレーラ)                                   ]   ← MP4 の外側!

なんと、通常の MP4 構造の外側に、約9.3MB のカメラ固有データ(トレーラ)が付加されていました(168秒の録画例)。しかも、このトレーラは片方のレンズ(_00_)にしか存在しないという仕様です。

ffmpeg で普通に切ると何が起きる?

ffmpeg -c copy で単純に切り出すと、MP4 の外側にある末尾データは綺麗さっぱり削ぎ落とされてしまいます。さらに、MP4 内部の moov 内にあったベンダー独自アトム(AMBA / 107バイト)も消えてしまいました。

トレーラの中に眠っていたデータ

解析を進めると、以下のような構成になっていることが判明しました。

各レコード: [データ][id(2バイト)][長さ(4バイト)]
末尾 : 最後のレコードの見出し + 0 埋め 32 バイト + [サイズ][版][マジック 32 バイト]
レコード ID中身
0x0300ジャイロ・加速度データ(時刻+6軸の数値。500Hzで約8万5千個!)
0x0400露出の変化データ(時刻+値)
0x0101機種情報、レンズのキャリブレーション、動画の長さなど
0x0200 / 0x0500各レンズの高解像度スチル画像(約2MB と 2.5MB)
その他用途不明(そのまま保持)

ジャイロデータにはカメラのタイムスタンプが記録されており、これが後の手ぶれ補正の大きな鍵となります。


泥臭い失敗と発見の記録

Insta360 Studio の内部仕様は非公開のため、「推測して実装し、実機の Studio で開いて結果を確かめる」という地道なトライ&エラーを繰り返しました。

失敗1. 左右の動画がバラバラに認識される!

最初のバージョン(v0.1.0)では、出力名を VID_…_00_082_trim.insv のようにしていました。しかし、これを Studio で開くと「2本の別々の動画」として認識されてしまったのです。

ファイル内部を調べてもペアを示すID等は見当たらなかったため、同じ内容でファイル名だけ変えた3パターンを用意してテストしてみました。

テストファイル名Studio での認識結果
A元と同じ名前(別フォルダに配置)1本の360度動画〇
Bファイル名の中の時刻を 1秒進める1本の360度動画〇
Cファイル名の中の連番を変える1本の360度動画〇
現行末尾に _trim をつける別々の動画×

原因は単純に「ファイル名ルール」でした!

Studio は VID_日付_時刻_00_連番 と …_10_連番 という命名規則だけを頼りにペア判定を行っていたのです。

この検証結果を受け、TrimFast では接尾辞をつけるのをやめ、ファイル名の中の時刻を1秒進めて出力する仕様に変更しました。

失敗2. 手ぶれ補正が全く効かない!

ファイル名を修正した v0.1.1 では、無事に1本の動画として開け、水平補正も機能しました。しかし、手ぶれ補正だけが機能せず、画角が広角状態(補正オフの状態)になっていました。

原因を探ると、切り出した数秒の動画に対して、TrimFast が末尾に元動画全体(170秒分)のジャイロデータをそのまま付与していたことが分かりました。動画フレームとジャイロデータの時刻がずれていたわけです。

そこで、修正アプローチを変えた4つのテストパターンを作成しました。

テスト変更点手ぶれ補正
V1メタデータ内の「動画長」等の数値だけ修正効かない
V2ジャイロと露出データを切り出し範囲に合わせて切り詰める効いた!
V3V1 と V2 の両方を適用効いた!
V4V3 に加え、埋め込みスチル画像を空にする効いた!

手ぶれ補正が効かない最大の原因は、ジャイロデータの時刻範囲のズレでした。「最初の露出データの時刻=動画の先頭フレーム」と仮定して切り詰めるロジックを組んだところ、見事に手ぶれ補正が復活しました!

最終的に V4 を採用し、出力バイナリが検証用ファイルとバイト単位で完全一致することを確認できました。

驚きの発見. 切り捨てたはずの「過去の画像」が残っていた…!?

V4 のテストで埋め込み写真(0x0200 / 0x0500)を空にしても Studio の挙動に影響がないことが判明したのですが、この写真の中身を調べて驚きました。

なんと、各レンズ 2880×2880 の高解像度写真(撮影開始時の人の顔などが写ったサムネイル用画像)だったのです。

つまり、動画の冒頭部分をトリムしてカットしたつもりでも、従来の切り出し方では見せたくない冒頭の静止画がファイルの末尾にそのまま残っていたことになります! プライバシー的にも見過ごせないポイントだったため、現在の TrimFast ではこの埋め込み写真を自動で除去して書き出すようにしています。


テストによる品質の確保

手探りの開発だったからこそ、自動テストをかなり手厚く構築しました。

  • 26個のテストケース(実際の FFmpeg を動かす結合テストや異常系テスト)を Linux / Haiku 両環境で実施
  • AddressSanitizer と UBSan を有効化した状態でも全テストをクリア
  • Studio で動作確認できた V4 ファイルをゴール(基準値)とし、「ジャイロ2,811個、露出135個、トレーラ 213,746バイト」といった具体的数値をアサーションに設定
  • あえてコードにバグを仕込んでテストが正しく失敗するか検証(境界値テストの不足を発見して追加したことも!)

日本語・空白・絵文字を含むパスや、権限のないフォルダ、壊れた入力ファイルなど、エッジケースの対策もバッチリです。


配布パッケージ(Haiku & Linux)

【Haiku OS】

専用の .hpkg パッケージを作成しました(自作HVIFアイコン付き。Tracker の「Open With」にも対応)。

【Linux】

Qt6環境を同梱した AppImage を用意しました。Docker 上で Ubuntu 22.04 / 24.04、Debian 12 のクリーン環境を作成し、動かない依存関係(libOpenGL の不足など)もしっかり潰してあります。


TrimFast の使い方

使い方はとっても簡単です!

  1. 撮影した .insv の片方(VID_…_00_….insv)を TrimFast で開く(もう片方の _10_ は自動認識されます)。
  2. 動画を再生しながら、キーボードの I で開始点、O で終了点をセット。
  3. Ctrl+E で書き出し! 両方のレンズファイルが全く同じ範囲で瞬時に生成されます。
  4. あとは出来上がったファイルを Insta360 Studio で開くだけ。1本の360度動画として認識され、手ぶれ補正も水平補正もバッチリ効きます!

開発の舞台裏(AIとの二人三脚)

今回の開発は、AI コーディングアシスタント(Claude Code)と対話しながら進めました。 設計、実装、テスト作成、パッケージングまでアシスタントが素早くコードに落とし込んでくれましたが、「実際に Insta360 Studio で開いて動作確認する」ことだけは人間にしかできません。

「ペア認識されたか?」「手ぶれ補正は効いているか?」を私がテストしてフィードバックし、AI がその結果から次の仮説を立てる――この短サイクルな二人三脚があったからこそ、非公開仕様の壁を突破できたと感じています。


現時点での制限事項

念のため、現在の制限事項も明記しておきます。

  • 動作確認は Insta360 ONE X2 のデータでのみ行っています(現行品なら Insta360 X5 となりますが、動作未検証です。他機種ではトレーラ構造が異なる可能性があり、その場合は安全のためデータを無加工で残して警告を出します)。
  • Studio での確認は「1本の動画として開けるか」「手ぶれ補正・水平補正が効くか」「リフレーミングできるか」までで、本格的な編集作業自体は未検証です。
  • Ricoh Theta や GoPro Max の360度メタデータには対応していません。
  • stream copy の仕様上、終了点には数フレームの誤差が生じます。
  • Haiku 環境での音声再生は、VM上の挙動が不安定だったためデフォルトでオフにしています。

重い360度動画の整理に困っている方へ

最初は「シンプルな無劣化カットツール」を作るつもりでしたが、Insta360 のファイルを扱い始めた途端、ファイル命名規則、ジャイロのタイムスタンプ、隠れた埋め込み写真など、興味深い発見と課題の連続でした。

結果として、「重い360度動画を、編集前にサクサク荒カットして軽量化する」というピンポイントな悩みを解決するツールに仕上がりました!

Insta360 の動画整理に困っている方や、Haiku OS / Linux で動画ツールを探している方は、ぜひ使ってみてください。フィードバックや他機種での報告もお待ちしております!

(※TrimFast は個人による独立したプロジェクトであり、Insta360 公式とは関係ありません。)

本日も最後までお読みいただきありがとうございました。

それでは、快適な動画編集ライフを!


「自分も何か作ってみたい」と思われた方、そのアイデア、頭の中で寝かせておくのはもったいないかもしれません。

ビューローみかみでは、構想段階の壁打ちからPoC・実装・現場導入まで、現場で「使い続けられる」ものづくりを支援しています。

アイデアを短期間で「動くもの」にし、PoCで終わらせず、実運用まで伴走します。まずは「これ、作る価値ありますか?」という壁打ちからでも大歓迎です。

▶ PoC・MVP開発サービスの詳細はこちら

気になることがあればお気軽にご相談ください。

カテゴリ: その他

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

上部へスクロール