AVPro Videoで映像の再生ができなくなった時の調査したことまとめ
何もしてないのにこわれた!!()
ということでOculus Rift向けの動画アプリをUnityで作っていたのですが、急に動かなくなりました。
具体的には音声は聞こえるものの、映像は白一色で何も見えません。
Unityのシミュレータだけではなく、以前ビルドしたアプリも同様に見えなくなっていました。
環境
Unity: 5.3.6p1
Oculus Utilities: v1.7.0
asset: AVPro Video(Windows)
decoder: LAV Filters
movie format: H.264(mp4)
resolution: 4K
調査
わかってしまってからだから言える事ですが、大分遠回りしています
1から作り直してみた
create projectから作成しなおしてみた
- シミュレータでは動くようになったが、今度はRiftではずっとloading中で確認すらできなくなった
- 再起動するとRiftから確認が出来るようになったが、前と同じく白一色で映像は表示されず
しかし一点気になったのはAVProVideo(Windows)がまさに今日11/1にupdateしている点
AVProVideo側に問題があるのか・・・?
AVProVideo側からアプローチしてみた
hardware decoringのチェックを外してみた
動いた!けど当然高解像度の動画を再生するとガックガクになった
AVProVideoの無料試用版を使ってみた
動いた!けど当然WaterMarkが出現した
- この無料試用版はAsset Storeではなく、HPから直接unitypackageファイルをダウンロードしてきて、それをcustom importで取り込む形
- ちゃんと見てないけどたぶんこれはversion upに対応していちいちupdateはされていないんじゃなかろうか?
過去のavpro videoが動くということは、最新のavpro videoのUnityやutiliesに対する依存性に変更があったのかも・・・?
Unityのversionをあげてみた
現在の安定版最新のv5.4.2で試してみた
5.3系最新パッチのv5.3.6p8で試してみた
Utilityのversionをあげてみた
1.7.0から最新の1.8.0にあげてみた
decorderを変更してみた
LAV Filter
default
Oculus appをdowngradeしてみた(かった)
色々見ていると、Oculus Appの最新version(1.9.0)が2016/10/19にリリースされておいることに気づいた
現在更新の設定がデフォルト(自動update)になっていたため既に1.9.0になっていた
以前確認して、完全に動いているのを確認したのは2週間前くらい・・・怪しい・・・
とりあえずは1.8.0にダウングレード
- しようとしたけど方法がわからない
- PC SDKがそれにあてはまると思っていたのだがどうも違うっぽい。
- Oculus AppはSetupツール上でダウンロードするんだけど、それだと最新版がダウンロードされてしまう。
- 古いversionのsetupツールも提供されていない
- どっかのconfigファイルとかで指定できるんだろうか・・・
そういやOculus appだけじゃなくてWindows Updateも走ってたな・・・
再度AVProVideoの設定をいじってみる
前回Hardware Decordingのチェックを外したら動くことまでは確認したが、今回はdecorderの選択をDirectShowに変更してみた
動いた・・・
ちなみに以前の設定はこちら
- 前はこの設定で動いていたのだが、設定としては今回の設定の方が正しい気がする
(なんで黄色くなったの?ねぇなんで?)
これで解決と思いきや
1からアプリを動画アプリを作成してcodecもdirectshowにした
辛い・・・
とりあえず以前のアプリは動くようになったので一旦置いておこう・・・
検証十分じゃないし・・・
今日新versionでたばっかだし・・・
今は動いてるし・・・
まとめると・・・
推測ですが、
- AVProVideo(無印)からAVProVideo(Windows)に変えた際にForceDirectShowのチェック項目がなかったので、Windows環境専用のこのassetではデフォルトでDirectShowが使用されていると思っていた
- だけど実際はデフォルトではmediafoundationを利用していた。以前はこのAPI(decorder)でも偶然再生できたため、違いに気付かなかった
- しかしWindows updateでcodecに変更が入り、AVPro経由ではmedia foundationで再生できなくなった
- ここで設定を確認しなおすとDirectShowを利用する場合は明示的にVideoAPIの項目を変更しないといけないことに気づく
- 変更したところAVPro Video(無印)のときと同じ再生フローになり、正常に再生されるようになった
HMDスペックまとめ(Oculus Rift CV1/GearVR/HTC Vive/PSVR)
GPGPU用語集てきなもの
備忘録
CNN
- Convolutional Neural Network(畳み込みニューラルネットワーク)
- AlexNetのような畳み込み層とプーリング層を含む多層ニューラルネットワークのこと
OpenCV
- Computer Visionのためのライブラリ
- 画像の入出力や一部を切り抜く際などに利用されている
LevelDB
- KVS
- DB内部でよくアクセスされるデータを段階的に分けることでアクセス効率がよくなる
- Caffeでは学習データおよび評価データをそれぞれ一つのDBにまとめてから、それを利用してモデルの学習を行う
LMDB
- KVS
- LevelDBでは内部のデータにアクセスする際にロックがかかる仕様になっているため、複数のCaffeプロセスが単一のDBにアクセスすることが出来ない
- この問題を解決するために単一のDBへの同時アクセスできるLMDBが導入された
HDF5
- 大量の数値データをほぞんすることに適したファイルフォーマットとそれを操作する機能を提供するライブラリ
Blob
- Binary Large OBject
PCI Express
- I/Oシリアルインターフェイス
MPI
- Message Passing Interface
- 分散メモリ間のメッセージ通信APIの規格
- 実装でメジャーなものとしてOpen MPI とmpichがある
GPUDirect
RDMA
RDMAとは
Remote Direct Memory Access
DMA(Direct Memory Access)はCPUが介在することなくホストメモリへアクセスを行うデバイスの機能
RDMA(Remote DMA)はCPUが関与することなくネットワーク越しにリモート計算機上のメモリへアクセスする機能
RDMAをサポートするネットワークプロトコル
RDMAを使うには?
LInuxの主要なDistributionでRDMAをサポートしている
Unityのmetaファイルが持つguidを変更する
前提
- Unityでは各ファイルに対してメタファイルが自動で生成される
- このmetaファイルの中でguidというパラメータが設定されている
- 他のオブジェクトとの相関性などは、ファイル名ではなくこのguidをもとにして行われている
fileFormatVersion: 2 guid: 14f9hogehogehogehogefugaugasdfd7fc21a //<== これ timeCreated: 1467869181 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant:
問題
解決方法
- 上の方の問題に関してはそもそも該当のファイルを直接編集すればいいが、下のimport問題が少しやっかいで、この場合ファイルのguidを変えてやる必要がある
guidの変更
- 試しにmetaファイルを削除してUnityを起動してみたところ、新しく新規にmetaファイルが作成されたのでいけるかと思ったが、まさかの消したはずのguidと同じguidが再度生成されていた。
- なので現在は少し強引ではあるが、Duplicateで同じファイルを作成し(この時点で違うguidをもつmetaファイルが生成される)、これをもとにパッケージをexportすることにしている。
- もちろんmetaファイルを直接編集してもいいのだが、低い確率で他のファイルが既に利用しているguidにしてしまった場合、問題の発見が困難になってしまう
- DuplicateだとUnityの機能で行うので、Unityが重複のないguidをアサインしてくれる
他にいい方法があるような気がしないでもない・・・
Android端末で初回起動時にStreamingAssetsからPersistentDataディレクトリにデータをコピーする方法
UnityでStreamingAssetsに配置したファイルはアプリコンパイル時にも圧縮されないため、必要な情報の保存に利用できる。
しかしこのStreamingAssetsはアプリ内にStreamingAssetsという名前のディレクトリが作成されるわけではなく、いわゆるシムリンク的なもので、デバイス毎にどこに保存されるかは異なる。
その中でもAndroidの場合が少し曲者で、AndroidのStreamingAssets上のファイルはReadはできるがWriteができない。
なので通常は初回起動時にStreamingAssetsからPersistentDataディレクトリへファイルをコピーし、二回目以降はそちらを読み書きして使う方法がメジャーとなっている。
void Start(){ if (!File.Exists (Application.persistentDataPath + "/" + filename)) { FileCopyFromStreamingToPersistent(); } }
- 目的のファイルがpersistentDataディレクトリにない場合は初回起動とみなしてファイルをコピーする
void FileCopyFromStreamingToPersistent(){ string path = Application.streamingAssetsPath + "/" + filename; WWW www = new WWW (path); while (!www.isDone) { } string toPath = Application.persistentDataPath + "/" + filename; File.WriteAllBytes (toPath, www.bytes); }
- 実際にコピーをするメソッドはこちら
PlayerPrefsとStreamingAssetsにおけるファイルの扱いの違い
Player Prefs | StreamingAssets | |||
---|---|---|---|---|
Windows | Android | Windows | Android | |
デバイス上で保存される場所 | システムレジストリ | ShaderPreferences | コンパイルしたアプリのDataディレクトリ | - |
ファイル内容の修正に関して | regeditで編集可能 | 通常不可 | テキストエディタで編集可能 | 通常不可 |
アプリ初回起動時のファイルの扱い | あらかじめ作成しておくことは出来ない(初回起動時にはじめて作成される) | あらかじめ作成しておくことが可能 | ||
- | - | WriteもReadも可能 | Readのみ可能(編集したい場合は初回起動時にPersistentDataディレクトリにコピーし、二回目以降はそちらを利用する方法がメジャー) | |
特徴 | セーブデータの保存などに利用される | StreamingAssets以下に配置されたファイルはアプリのコンパイル時に圧縮されない |
Unityのオブジェクトをスクリプトから回転する方法
方法
YourObject.transform.Rotate (x, y, z); YourObject.transform.rotation = Quaternion.Euler (x, y, z);
例
using UnityEngine; using System.Collections; public class Nouziru : MonoBehaviour { public GameObject cube; void Start(){ cube.transform.Rotate (10, 20, 30); ### または cube.transform.rotation = Quaternion.Euler (10, 20, 30); } }