脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

UnityのApplication.Quit()がWindows環境でフリーズしたりしなかったりする

Application.Quit()によるアプリのフリーズ

Unityのversionを5.3.6p1にあげたところ、Application.quit()が動いたり動かなかったりするようになってしまいました
動かないときはアプリ自体がフリーズして最終的にはクラッシュしてしまいます

調べてみると色々なversionで多くの人が同じ問題に遭遇しているらしいのですが、根本的な原因に関しての記述は見つかりませんでした。

対応策も人によって様々なのですが、自分がうまくいった方法は、Application.quit()後すぐにreturnして、明示的にそれ以降の処理をスキップさせる方法です

void Update ()
{
    if (終了させるためのトリガー){
        Application.Quit();
	return;
    }

    // 以降いろんな処理
}

これでいまのところは正常に動いています。

GoPro6台で360動画を撮影して貼り合わせる方法(定点撮影)

GoPro6台でジグを利用して動画を撮影し、Kolorを利用してスティッチしてEquireqtangular形式の360動画を作成するまでの流れです

利用した機材・ツール

  • GoPro Hero4 Black Adventure × 6台

  • GoPro用ジグ

  • GoPro用リモートコントローラ(Smart Remote)

  • SDカード
  • Kolor Autopano Video

Kolor | Autopano Video - Video stitching software

手順

撮影

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を起動すると以下のようなウィンドウが表示されます
f:id:portaltan:20160905093714p:plain

D&Dで映像ファイルを6つまとめてAutopano Videoに取り込みます
f:id:portaltan:20160905094047p:plain

2. 動画のシンクロナイズ

撮影の項目で書きましたが、GoProで撮影した6つの動画ファイルは少しずつ(1秒以下ですが)再生開始時間がずれています。
まずはこのずれを修正します。
f:id:portaltan:20160905095550p:plain
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形式の画像が表示される
f:id:portaltan:20160905100952p:plain

4. レンダリング

最後は普通にRenderという項目を選択してレンダリングをすればEquirectangular形式のmp4ファイルがレンダリングされます。

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>
  • 64bit スタンドアロン Windows player をビルドする場合
  • quitをつけるとbuildが終わるとアプリを自動で終了する

オプションの指定

> 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

AVPro Windows Media

AVPro Video

その他AVPro

オールインワンのAVProVideoを対象デバイス毎にわけてお安くしたものが以下
(すべて$150)

  • AVPRO Video(Andorid)
  • AVPRO Video(iOS)
  • AVPRO Video(Windows)
  • AVPRO Video(OS X)

Unityでmp4の4K動画を再生する方法(AVProWindowsMedia)

AVProWindowsMediaでmp4の4K動画を再生できるようにする方法です

公式のドキュメントに方法があるので、それに沿って説明します。
http://downloads.renderheads.com/docs/UnityAVProWindowsMedia.pdf

Super High Resolution 4K / 8K Playback

f:id:portaltan:20160822130514p:plain

ここをざっくり訳すと...

高解像度の再生にはXVidかHapコーデックがいいよ。この二つは早いし、他のコーデックはCPUの負荷が高いからおすすめしないよ。

ただMP4に関してはちょっと別で、そもそも通常H.264は高解像度の動画再生には向かないんだけど、高スペックなマシンなら動くよ。
もしあなたが大人の事情でどうしてもH.264を使用しないといけないんだったら、このReadmeのH.264のセクションを参照してみてね。
軽くここで説明すると、そもそもDirectShowは通常1080p以上のH.264の再生はサポートしてないんだ。だから3rdParyのdecorderをインストールして、Codec Tweakerっていうツールでデフォルトで呼び出すCodecを変更するって流れだよ。
(詳しくはFAQセクションを見てね)

FAQ

で、FAQセクションを見てみると
f:id:portaltan:20160822131107p:plain

1. LAVっていうCodecをインストールする
2. Codec Tweakerっていうツールをインストールする
3. Codec Tweakerを起動して、Prefered Decoderを選択して、H.264の項目を"Microsoft"から"LAV Video"に変更する


実際にCodecTweakerを起動してPrefered Decorderを選択すると以下のような画面が出てくるので、H.264の該当の項目を変更します
f:id:portaltan:20160822131405p:plain

以上でmp4の4K動画が再生できるようになります。

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はできない