RICOH THETA Vでビデオ通話pluginを作ってみました
概要
RICOH THETA はAndroidベースのOSを採用しているとのことです。
agora.ioにはAndroid用のVideoSDKがありますので、ビデオ通話(THETA側は音声の受信のみ)を実装してみました。
参考
実装についてはこちらを参考に致しました。
実装内容
MainActivity.javaに追記していきます。
まずはTHETAのお作法部分を追記します。
このあたりは他の方が詳しく説明されていますので詳細な内容は割愛します。
・カメラに関する設定
sendBroadcast(new Intent("com.theta360.plugin.ACTION_MAIN_CAMERA_CLOSE"));
Camera myCamera = Camera.open();
Camera.Parameters parameters = myCamera.getParameters();
parameters.set("RIC_SHOOTING_MODE", "RicMoviePreview3840");
parameters.set("RIC_PROC_STITCHING", "RicStaticStitching");
parameters.set("recording-hint", "false");
myCamera.setParameters(parameters);
myCamera.startPreview();
・マイクに関する設定
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setParameters("RicUseBFormat=false");
次にAgoraSDKに関する実装です。
try {
mRtcEngine = RtcEngine.create(getBaseContext(), APPID, mRtcEventHandler);
}catch(Exception e){}
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING);
mRtcEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER);
mRtcEngine.enableWebSdkInteroperability(true);
mRtcEngine.setParameters(" {\"che.video.captureFormatNV21\":true}");
mRtcEngine.enableVideo();
mRtcEngine.setVideoProfile(1280,640,5,5000);
FrameLayout container = (FrameLayout) findViewById(R.id.local_video_view);
SurfaceView surfaceView = RtcEngine.CreateRendererView(getBaseContext());
surfaceView.setZOrderMediaOverlay(true);
container.addView(surfaceView);
mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, 0));
mRtcEngine.startPreview();
AgoraSDKのイベントハンドラの実装です。
多拠点が入室した際の処理になります。
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
@Override
public void onFirstRemoteVideoDecoded(final int uid, int width, int height, int elapsed) {
runOnUiThread(new Runnable() {
@Override
public void run() {
setupRemoteVideo(uid);
}
});
}
@Override
public void onJoinChannelSuccess(String channel, int uid, int elapsed ){
joinStatus = 2;
}
@Override
public void onLeaveChannel(RtcStats stats){
joinStatus = 1;
}
@Override
public void onWarning(int warn){
//多拠点が入室時にTHETAのマイク入力が0になってしまう為、再入室処理
if(warn == 1031 || warn == 1019){
mRtcEngine.leaveChannel();
mRtcEngine.joinChannel(null, "room1", "Extra Optional Data", 100);
}
}
};
onWaringイベント発生時にTHETA用の処理が入っています。
現在も原因が不明ですが、多拠点が入室してきた際に、THETAのマイク入力が0になってしまいます。
その為、一度だけ退室、入室の処理を入れています。
agora.io SDKとの相性で何かしら問題がおきていそうです。
最後にTHETAがAgoraIOのチャネルに接続する処理です。
カメラボタンが押された際にチャネルに接続するようにしています。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setAutoClose(true);
setKeyCallback(new KeyCallback() {
@Override
public void onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyReceiver.KEYCODE_CAMERA) {
if(joinStatus == 1) {
mRtcEngine.joinChannel(null, "room1", "Extra Optional Data", 100);
}else if(joinStatus == 2){
mRtcEngine.leaveChannel();
}
}
}
});
}
結果
ブラウザを多拠点として入室しています。2:1の映像が受信できています。
又、ブラウザ-THETA間での音声通話も可能です。