ExoPlayerとSpatial Workstationの統合方法に関するメモ書きです。
まずAudioEngineを初期化し、SpatDecoderQueueを作成します。
// 以下、フィールドに保持する
engine = AudioEngine.create(SAMPLE_RATE, this);
spat = engine.createSpatDecoderQueue();
engine.start();
次に、Audio360Sinkを作成し、これを使ってOpusRendererを作成します。
audio360Sink = new Audio360Sink(spat, ChannelMap.TBE_8_2);
audioRenderer = new OpusRenderer(audio360Sink);
最後に、このOpusRendererを使うようにDefaultRenderersFactoryを改造してSimpleExoPlayerのインスタンスを作成します。
DefaultRenderersFactory defaultRenderersFactory = new DefaultRenderersFactory(this) {
@Override
protected void buildAudioRenderers(Context context, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, AudioProcessor[] audioProcessors, Handler eventHandler, AudioRendererEventListener eventListener, int extensionRendererMode, ArrayList<Renderer> out) {
out.add(audioRenderer);
}
};
player = ExoPlayerFactory.newSimpleInstance(defaultRenderersFactory, new DefaultTrackSelector());
そしてもう一つ、毎フレームのレンダリングループの中でユーザーの視線の向きをAudioEngine.setListenerRotation()で伝えるようにします。
engine.setListenerRotation(quat);
// or
engine.setListenerRotation(forward, up);
あとは通常通りExtractorMediaSourceとかを使って動画を再生するだけです!