RICOH THETA V의 플러그인에 agora.io SDK 포함

RICOH THETA V에서 화상 통화 플러그인을 만들어 보았습니다.



개요



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에 관한 문의는 이쪽으로부터

좋은 웹페이지 즐겨찾기