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
とかを使って動画を再生するだけです!