テレワークで日本を変える|Web会議・テレビ会議(TV会議)のブイキューブ

テレワークで日本を変える|テレビ会議(TV会議)・Web会議・電話会議のブイキューブ

RICOH THETA V のpluginにagora.io SDKを組み込み

  • WebRTC
  • THETAPlugin
  • Agora.io

RICOH THETA Vでビデオ通話pluginを作ってみました

概要

RICOH THETA はAndroidベースのOSを採用しているとのことです。
agora.ioにはAndroid用のVideoSDKがありますので、ビデオ通話(THETA側は音声の受信のみ)を実装してみました。

参考

実装についてはこちらを参考に致しました。

実装内容

MainActivity.javaに追記していきます。

まずはTHETAのお作法部分を追記します。
このあたりは他の方が詳しく説明されていますので詳細な内容は割愛します。

・カメラに関する設定

MainActivity.java
    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();

・マイクに関する設定

MainActivity.java
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setParameters("RicUseBFormat=false");

次にAgoraSDKに関する実装です。

MainActivity.java
    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のイベントハンドラの実装です。
多拠点が入室した際の処理になります。

MainActivity.java
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のチャネルに接続する処理です。
カメラボタンが押された際にチャネルに接続するようにしています。

MainActivity.java
@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間での音声通話も可能です。

agora.io SDK イメージ
agora.io SDK

大規模・安価・すぐに使える
ライブ配信・ビデオ通話・音声通話SDK

 

先頭へ戻る