GoPro6台で360動画を撮影して貼り合わせる方法(定点撮影)
GoPro6台でジグを利用して動画を撮影し、Kolorを利用してスティッチしてEquireqtangular形式の360動画を作成するまでの流れです
利用した機材・ツール
- GoPro Hero4 Black Adventure × 6台
- GoPro用ジグ
- GoPro用リモートコントローラ(Smart Remote)
- SDカード
- Kolor Autopano Video
手順
撮影
1. GoPro設定
水中ケースからGoProを外して設定を行います
各種設定項目は以下を参照してください
http://freedom360.us/camera-settings/
注意点としては、6台用のジグを利用する場合アスペクト比は4:3でないとうまくスティッチができません
2. Wifiリモコンとのペアリング
GoPro本体側の設定
GoPro用のリモコンであるSmart Remoteとペアリングをします
GoPro左側面にあるボタンを押して、設定画面を表示させます
『Wifi』の項目からペアリングモードを開始できます。
(3分間ペアリング状態になり、3分経ってもペアリングしないと終了します)
リモコン側の設定
この状態でリモコンの赤い丸ボタンを押しながら、電源ボタンを一度押します
リモコンがペアリングモードで起動し、GoPro本体とペアリングが開始します
無事ペアリングが完了すると6CAM/READYという表示がリモコン側に表示されます
3. ジグに装着する
設定の完了したGoProをジグに取り付けます
4. 撮影
リモコンの赤い丸ボタンを押すとペアリングされているGoPro全台で録画が開始します。
ただし一台のリモコンから同時に信号を送ったとしても、各GoProが録画を開始するタイミングには若干のラグがあります。
あとでタイミングを合わせるための目印として、撮影の最初か最後のに手を叩いて音を出しておきます。
撮影が終わったらもう一度赤いボタンを押せば録画終了です。
5. 動画の取り込み
SDカードから、もしくはUSBケーブルをGoPro本体へ接続して撮影したmp4データをPCに取り込みます
貼り合わせ
ここからはkolor社のAutopano Videoというツールを利用し、6台分の映像データを貼り合わせて一つの360動画にしていきます
1. AutoPano Video起動&動画読み込み
AutoPano Videoを起動すると以下のようなウィンドウが表示されます
D&Dで映像ファイルを6つまとめてAutopano Videoに取り込みます
2. 動画のシンクロナイズ
撮影の項目で書きましたが、GoProで撮影した6つの動画ファイルは少しずつ(1秒以下ですが)再生開始時間がずれています。
まずはこのずれを修正します。
1. 下半分の秒数が表示されている項目から、手を叩いたのがおおよそ何秒くらいだったか調べます
2. 次にSychroという項目を選択します
3. Search range around current timeに、上記で調べた手を叩いたおおよその秒数を入力します
4. Use audio to synchronizeをクリックします
(目印となる音がない場合は、隣のUse motion to synchronizeを選択します)
5. autopano videoが指定された秒数の前後から目印となる音を自動で探し出してくれます
6. Nearrest frameにそれぞれのGoProのずれが表示されるので、あまりにも大きな数字がなければ、右下のApplyを選択して、自動で検出した目印を基にシンクロナイズします
3. 簡易スティッチ(貼り合わせ)
次に動画を貼り合わせます
シンクロの隣のStichという項目を選択します
スティッチの設定画面が出てきます
- 一番上の項目(Stitch as)が『GoProHero3+/4』になっていることを確認します
- 中段の項目(Stich at)が『Current position』になっていることを確認
- current position: 現在の再生ポジションのみを参考にスティッチを行う(カメラを固定した定点撮影のときのみ利用)
- current selection: 設定した数だけランダムにframeを抜き出して、それらをもとにスティッチを行う(最大99frame)
スティッチが完了すると上段の一番右にRealtime previewという名前でEquirectangular形式の画像が表示される
5. 確認
作成した360動画をOculusなどのHMDで見る方法はいくつかありますが、同じくkolor社のGoPro VR Playerを使うのが一番簡単かと思います。
Kolor | GoPro VR Player - Watch 360-degree videos and images offline
注意点とか
- AutoPano Videoによる自動スティッチは精度があまり高くありません。きちんとやる場合はAutopano Gigaというツールで手動でスティッチする必要があります
- (ただしこちらは少し使い方が難しく、もう少し詳しくなったらまた別でブログに書きたいと思います)
- 6台で撮影する際は、メインの被写体がカメラとカメラのつなぎ目に位置しないように注意した方がいいです
- (3台のカメラに跨って映っていたりするとスティッチがかなり面倒くさくなります)
- 今回は手を叩いた音でシンクロナイズをしましたが、motionによってシンクロナイズすることも可能です。
Unityをコマンドラインからオプションを指定して起動する
通常Unityは立方体のUnityのアイコンをクリックして立ち上げるが、コンソールから実行するとコマンドライン引数としてオプションを指定することができる
Unity - マニュアル: コマンドライン引数
Windows環境の場合はコマンドプロンプトで以下のように実行する
起動
> cd "\Program Files\Unity\Editor" > Unity.exe
ビルド
> cd "\Program Files\Unity\Editor" > Unity.exe -quit -buildWindows64Player <pathname>
オプションの指定
> cd "\Program Files\Unity\Editor" > Unity.exe <option> > Unity.exe -force-d3d11-no-singlethreaded ### example
ちなみにここで指定したオプションはビルド時には反映されないが、ビルドされたアプリケーションもコマンドラインから起動することで上記のオプションを指定することができる
> ${buildしたアプリ}.exe -force-d3d11-no-singlethreaded
AVProVideo/AVProWIndowsMedia/AVProQuickTime
AVProシリーズはプロダクトが色々あって当初結構混乱したのでまとめ
AVPro QuickTime
- http://renderheads.com/product/av-pro-quicktime/
- すでにUnity AssetStoreからは提供終了
- 以下に置き換えられている
- AVPro Video
- AVPRO Video(iOS)
AVPro Windows Media
- http://renderheads.com/product/av-pro-windows-media/
- すでにUnity AssetStoreからは提供終了
- 以下に置き換えられている
AVPro Video
Unityでmp4の4K動画を再生する方法(AVProWindowsMedia)
AVProWindowsMediaでmp4の4K動画を再生できるようにする方法です
公式のドキュメントに方法があるので、それに沿って説明します。
http://downloads.renderheads.com/docs/UnityAVProWindowsMedia.pdf
Super High Resolution 4K / 8K Playback
ここをざっくり訳すと...
高解像度の再生にはXVidかHapコーデックがいいよ。この二つは早いし、他のコーデックはCPUの負荷が高いからおすすめしないよ。
ただMP4に関してはちょっと別で、そもそも通常H.264は高解像度の動画再生には向かないんだけど、高スペックなマシンなら動くよ。
もしあなたが大人の事情でどうしてもH.264を使用しないといけないんだったら、このReadmeのH.264のセクションを参照してみてね。
軽くここで説明すると、そもそもDirectShowは通常1080p以上のH.264の再生はサポートしてないんだ。だから3rdParyのdecorderをインストールして、Codec Tweakerっていうツールでデフォルトで呼び出すCodecを変更するって流れだよ。
(詳しくはFAQセクションを見てね)
C#でcharをASCIIコードに変換したり戻したりする方法
ASCIIコードにする方法
(int)変換したい文字
ASCIIから戻したい場合
(char)ASCIIコード
例
char foo = 'A'; Debug.Log ((int)foo); // ==> 65 char bar = ((char)65); Debug.Log (bar); // ==> A
C#でファイルの読み書きの方法
Read
StreamWriter writer = new StreamWriter(path); writer.Write(value); writer.Close();
- pathは保存したいファイルのパス
- Unityとかだと『Application.streamingAssetsPath + "/" + filename』みたいな
- valueは保存したいデータ
Write
StreamReader reader = new StreamReader(path); string value = reader.ReadToEnd(); reader.Close();
- 上記と同じ
- ファイルが隠しファイル(Hidden属性をもっている場合)はReadはできるがWriteはできない
EasyMovieTextureで動画をポーズ/再開させる
前回のポストの続きになります
portaltan.hatenablog.com
前回は起動したら単純に一回だけ再生するというシンプルすぎるアプリでしたが、今回は自前のスクリプトを貼りつけて、ユーザの入力に応じてポーズなどの処理をできるようにしましょう
1. デフォルトのスクリプトの再生設定を削除
- Sphere100のMedia Player CtrlのInspector上でStr File Nameの項目を削除します
(これで自動再生されなくなります)
2. 自前のスクリプトの作成
- 今回はEasyTest.csという名前にしました
using UnityEngine; using System.Collections; public class EasyTest : MonoBehaviour { public MediaPlayerCtrl EasyMovieTex; void Start () { EasyMovieTex.Load ("slider.mp4"); EasyMovieTex.Play (); } }
3. スクリプトをSphere100へ貼りつけます
- EasyTest.csスクリプトをhierarchyビューのSphere100へD&Dで貼りつけます
- Inspector上のEasyTest(Script)で、Easy Movie TexにSphere100をアサインします
ここまでで以前同様に起動したら一回だけ再生する状態になりました
4. ポーズ処理の追加
再生中にスペースを押したらポーズし、ポーズ中にスペースを押すと再開するような処理をUpdate内に書いていきます
using UnityEngine; using System.Collections; public class EasyTest : MonoBehaviour { public MediaPlayerCtrl EasyMovieTex; void Start () { EasyMovieTex.Load ("slider.mp4"); EasyMovieTex.Play (); } void Update () { if (EasyMovieTex.GetCurrentState ().ToString () == "NOT_READY") { Debug.Log ("Preparing"); } else if (EasyMovieTex.GetCurrentState ().ToString () == "END") { Debug.Log ("Finished"); } if (Input.GetKeyUp (KeyCode.Space)) { switch (EasyMovieTex.GetCurrentState ().ToString ()) { case "PLAYING": EasyMovieTex.Pause (); break; case "PAUSED": EasyMovieTex.Play (); break; } } } }
以上です。
最初の4行は再生の準備中と終了時にはログを表示させています