• スポンサードリンク

UVC4UnityAndroidにUAC対応とUVCコントロール機能対応を追加したのじゃ

Android NDK UAC Unity USB UVC

Experimental機能なのじゃm(__)m

リポジトリはこちらなのじゃUVC4UnityAndroid

主な更新内容なのじゃ

今回(v0.3.0)の主な更新内容は次の通りなのじゃ。

  • C#とネイティブ側の依存ライブラリを更新(今回からオ・ト・ナの事情でターゲットAPI>=33なのじゃ)
  • UAC(USB Audio Class)対応をプラグイン側に公開
  • UVCコントロール機能(露出調整やコントラスト等)をプラグイン側に公開

UACとUVCコントロール機能自体はバックエンドのオレオレライブラリとしてはずっと前から存在してたんだけど面倒くさくて放置しててスマンのじゃ。

UAC機能とはなんなのじゃ?

UAC(USB Audio Class)機能とはぶっちゃけていえばwebカメラ等マイクから音声を取得する機能なのじゃ。
手持ちのロジクールのWebカメラでマイク搭載だったりHDMIキャプチャ等で音声入力に対応してると明示してあるようなのはだいたい大丈夫みたいなのじゃ。

バックエンドライブラリ側ではサンプリング周波数をアップサンプリング/ダウンダウンサンプリングする機能(例えばサンプリング周波数32KHzを44.1KHzに変換)も実装してあるけどUnity側へはUACから受け取ったオーディオストリームをそのまま(バッファリング有り)引き渡しているのじゃ。なので実際に音声が再生できるかどうかはUnityとAndroid端末の仕様に依存するのじゃ(Androidのフレームワーク的に音声再生が保証されているのは44100Hzだけじゃった記憶が)
あっあとUACからの音声データはPCM16だけに対応してるのじゃ。

ただし残念なことに世の中は世知辛いのじゃ…

  • バギーなUVC/UAC機器が多すぎるのじゃ
  • Unityのオーディオシステムはレイテンシーが長すぎるのじゃ
バギーなUVC/UAC機器が多すぎるのじゃ

デバイスディスクリプタではUAC対応!と返してくるくせに実際にUACとしてアクセスするとストールするゴミが多すぎるのじゃ。
なので個々のUVC/UAC機器で実際に動くかどうかは知らんのんじゃ。

Unityのオーディオシステムはレイテンシーが長すぎるのじゃ

手持ちのwebカメラ等で試した限りでは映像表示から少なくとも100-200ミリ秒ぐらい遅れて音声が再生されるのじゃ。

UnityではなくピュアAndroidアプリとして作って録画したのを見る限りではほぼリップシンクするのでバックエンドのライブラリ側の問題ではなくUnity側の問題なのじゃ。

ちなみにProject Settings>Audio>DSP Buffer Size設定をBest latencyにするともしかすると万が一ちょびっとは改善するかもしれない気がするかもしれないけど大差ないのじゃ。

UVC側の映像はバックエンドのオレオレライブラリで頑張って頑張ってるので、Unity側で重い画像処理をしなければほぼMJPEGの展開分(今時の端末だとフルHDで20-25ミリ秒+α)ぐらいの遅延で表示できるのじゃが、UACからの音声のの再生の遅延は今のところ改善する策がないのじゃ。

UnityのAudioClip.Createでちと苦労したのじゃ

UnityのAudioClip.Createにはstreamフラグがというのがあって音声ファイルからの再生時間の決まった音声の再生ではなく連続的に音声を再生するすることができるのじゃ。
しかぁ〜し、stream=trueAudioClip.Createを呼び出した場合でもlengthSamplesで指定したサンプリング数を超えて再生することがでけんのじゃ。
つまり今回のようなライブ音声ストリームを再生するにはlengthSamples=Int32.MaxValueとして可能な限り多くのサンプリングできるようにするしかないのじゃ。
stream=trueならlengthSamplesを無視してくれよと思うのはさきちゃんだけじゃないはずなのじゃ。

元々はプッシュタイプだったのじゃ…

元々バックエンドのオレオレライブラリ のUAC部分ではUACから受け取った音声ストリームをバッファリングしてワーカースレッドで(必要に応じてアップサンプリング/ダウンサンプリングして)コールバックへプッシュする仕様だったのじゃ。
まぁフレームワークのAudioRecordと処理を共通化したり、FFTしてビジュアライザで表示するのと(AACの)エンコーダーへ同時に入力したりするのに都合がよかったってだけなのじゃけど。

でもこれが今回のUnityのAudioClipへの音声入力には都合が悪かったのじゃ。
やつはAudioClip.PCMSetPositionCallbackで音声データをプル(ポーリングで音声データを取得)しないといけんのじゃ。

元々はプッシュタイプ、AudioClipはプルタイプということはそのままだともう一度FIFOのバッファを噛ますことになってしまう…
なので今回のUVC4UnityAndroidへのUAC機能追加にあたってバックエンドのオレオレライブラリ側もそれように改修することになってしまって面倒くさかったのじゃ、軽い気持ちで始めるのではなかったと反省なのじゃ。

UVCコントロール機能

まだどうするかなにも決めてないし実際に作るかどうかわからんのじゃけど、なにかUVCコントローラーみたいなゲームオブジェクト/スクリプト/UI用パネルを作るかもしれんのじゃ。
ただし今のところはUVCManager.GetAttachedDevicesCameraInfoオブジェクトを取得してCameraInfoオブジェクトのGetCtrls, GetValue, SetValue関数でアクセスすればUVCコントロール機能が使えるのじゃ、一応、たぶん、知らんけど。

バックエンドのオレオレライブラリが対応しているカメラコントロール系は次の通りなのじゃ。

  • CTRL_SCANNING(Scanning Mode)
  • CTRL_AE(Auto-Exposure Mode)
  • CTRL_AE_PRIORITY(Auto-Exposure Priority)
  • CTRL_AE_ABS(Exposure Time (Absolute))
  • CTRL_AE_REL(Exposure Time (Relative))
  • CTRL_FOCUS_ABS(Focus (Absolute))
  • CTRL_FOCUS_REL(Focus (Relative))
  • CTRL_IRIS_ABS(Iris (Absolute))
  • CTRL_IRIS_REL(Iris (Relative))
  • CTRL_ZOOM_ABS(Zoom (Absolute))
  • CTRL_ZOOM_REL(Zoom (Relative))
  • CTRL_PANTILT_ABS(PanTilt (Absolute))
  • CTRL_PAN_ABS(PanTilt (Absolute))
  • CTRL_TILT_ABS(PanTilt (Absolute))
  • CTRL_PANTILT_REL(PanTilt (Relative))
  • CTRL_PAN_REL(PanTilt (Relative))
  • CTRL_TILT_REL(PanTilt (Relative))
  • CTRL_ROLL_ABS(Roll (Absolute))
  • CTRL_ROLL_REL(Roll (Relative))
  • CTRL_FOCUS_AUTO(ocus, Auto)
  • CTRL_PRIVACY(Privacy)
  • CTRL_FOCUS_SIMPLE(Focus, Simple)
  • CTRL_WINDOW(Window)
  • CTRL_ROI(ROI)

バックエンドのオレオレライブラリが対応しているカメラコントロール系は次の通りなのじゃ。

  • PU_BRIGHTNESS(Brightness)
  • PU_CONTRAST(Contrast)
  • PU_HUE(Hue)
  • PU_SATURATION(Saturation)
  • PU_SHARPNESS(Sharpness)
  • PU_GAMMA(Gamma)
  • PU_WB_TEMP(White Balance Temperature)
  • PU_WB_COMPO(White Balance Component)
  • PU_BACKLIGHT(Backlight Compensation)
  • PU_GAIN(Gain)
  • PU_POWER_LF(Power Line Frequency)
  • PU_HUE_AUTO(Hue, Auto)
  • PU_WB_TEMP_AUTO(White Balance Temperature, Auto)
  • PU_WB_COMPO_AUTO(White Balance Component, Auto)
  • PU_DIGITAL_MULT(Digital Multiplier)
  • PU_DIGITAL_LIMIT(Digital Multiplier Limit)
  • PU_AVIDEO_STD(Analog Video Standard)
  • PU_AVIDEO_LOCK(Analog Video Lock Status)
  • PU_CONTRAST_AUTO(Contrast, Auto)

まぁぶっちゃけUVC規格に記載の機能は網羅しているのじゃ。
ただし相対系(_REL)や設定が難しい系は無効にしてあるのじゃ。

もちろんUVC機器側が対応している場合のみ動作するのじゃ。

ただ面倒くさいことに露出に関係するあれやこれやのように相互依存したり特定の条件でないとエラーになったりとUVC機器毎に挙動が異なるのが多いので、実際に使う機器に合わせてどの設定項目のどの設定値とどの設定項目のどの設定値の組み合わせがOKなのかを調べて頑張って欲しいのじゃ。

ということでホワイトデーには間に合わんかったけど興味があれば使ってくれなのじゃ〜(^^)/~~~

«

  • スポンサードリンク