package com.caprusit.capv.webrtc; import android.content.Context; import android.os.Build; import com.caprusit.capv.service.WebSocketForVideoCall; import org.webrtc.AudioSource; import org.webrtc.AudioTrack; import org.webrtc.Camera1Enumerator; import org.webrtc.Camera2Enumerator; import org.webrtc.CameraEnumerator; import org.webrtc.Logging; import org.webrtc.MediaConstraints; import org.webrtc.MediaStream; import org.webrtc.PeerConnection; import org.webrtc.PeerConnectionFactory; import org.webrtc.VideoCapturer; import org.webrtc.VideoSource; import org.webrtc.VideoTrack; import java.util.LinkedList; public class WebRtcClient { private final static String TAG = WebSocketForVideoCall.class.getCanonicalName(); private final static int MAX_PEER = 100; private static final int CALLSTATE_IN_CALL = 3; private boolean[] endPoints = new boolean[MAX_PEER]; public PeerConnectionFactory factory; private AudioSource audioSource; public LinkedList iceServers = new LinkedList<>(); private NBMWebRTCPeer.NBMPeerConnectionParameters pcParams; public MediaConstraints pcConstraints = new MediaConstraints(); public MediaStream localMS; private VideoSource videoSource; public RtcListener mListener; VideoCapturer videoCapturer; private AudioTrack audioTrack; private VideoTrack videoTrack; private NBMWebRTCPeer nbmWebRTCPeer; private Context context; public static int id = 1; public static String roomId = ""; public static final String MESSAGE_TYPE = "MessageType"; private boolean isAudioMuted = false; private boolean isVideoMuted = false; private boolean videoCaliing; private int callState; private String loginUserId; private static final int CALLSTATE_NO_CALL = 0; private static final int CALLSTATE_POST_CALL = 1; private static final int CALLSTATE_DISABLED = 2; public WebRtcClient(Context context, RtcListener listener , NBMWebRTCPeer.NBMPeerConnectionParameters params,boolean videoCalling) { this.context = context; mListener = listener; pcParams = params; this.videoCaliing = videoCalling; PeerConnectionFactory.initializeAndroidGlobals(context, true, true, params.videoCodecHwAcceleration); factory = new PeerConnectionFactory(); iceServers.add(new PeerConnection.IceServer("stun:77.72.174.163:3478")); iceServers.add(new PeerConnection.IceServer("turn:183.82.101.53478")); /* iceServers.add(new PeerConnection.IceServer("stun:77.72.174.163:3478")); iceServers.add(new PeerConnection.IceServer("turn:183.82.101.3478") );*/ if(videoCalling){ pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true")); }else{ pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "false")); } pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true")); pcConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true")); pcConstraints.optional.add(new MediaConstraints.KeyValuePair("RtpDataChannels", "true")); } public void setWebPeer(NBMWebRTCPeer nbmWebRTCPeer) { this.nbmWebRTCPeer = nbmWebRTCPeer; } public void setCamera() { localMS = factory.createLocalMediaStream("ARDAMS"); if (pcParams.videoCallEnabled) { getVideoCapturer(); videoSource = factory.createVideoSource(videoCapturer); videoCapturer.startCapture(pcParams.videoWidth,pcParams.videoHeight,pcParams.videoFps); videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource); videoTrack.setEnabled(true); localMS.addTrack(videoTrack); } audioSource = factory.createAudioSource(new MediaConstraints()); audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource); localMS.addTrack(audioTrack); mListener.onLocalStream(localMS,true); } public void setAudio(){ Thread t = new Thread(new Runnable() { public void run() { // your code goes here... localMS = factory.createLocalMediaStream("ARDAMS"); if (pcParams.videoCallEnabled) { MediaConstraints videoConstraints = new MediaConstraints(); videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxHeight", Integer.toString(pcParams.videoHeight))); videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxWidth", Integer.toString(pcParams.videoWidth))); videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxFrameRate", Integer.toString(pcParams.videoFps))); videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("minFrameRate", Integer.toString(pcParams.videoFps))); getVideoCapturer(); videoSource = factory.createVideoSource(videoCapturer, videoConstraints); videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource); localMS.addTrack(videoTrack); } audioSource = factory.createAudioSource(new MediaConstraints()); audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource); localMS.addTrack(audioTrack); mListener.onLocalStream(localMS,false); } }); t.start(); } public void releaseCameraResouces(){ if (videoSource != null) videoSource.stop(); if (videoSource != null)videoSource.dispose(); if (audioSource != null) audioSource.dispose(); if (factory != null)factory.dispose(); if (videoCapturer != null) videoCapturer.dispose(); } public void releaseAudioResources(){ if (videoSource != null) videoSource.stop(); if (videoSource != null)videoSource.dispose(); if (audioSource != null)audioSource.dispose(); if (factory != null)factory.dispose(); if (videoCapturer != null) videoCapturer.dispose(); } public void removeAudioTrack(){ localMS.removeTrack(audioTrack); } public void addAudioTrack(){ localMS.addTrack(audioTrack); } public void addVideoTrack(){ localMS.addTrack(videoTrack); } public void removeVideoTrack(){ //localMS.removeTrack(videoTrack); LinkedList videoTracks = localMS.videoTracks; for(VideoTrack videoTrack : videoTracks){ localMS.removeTrack(videoTrack); } } private void getVideoCapturer() { String cameraDeviceName; if (Build.VERSION.SDK_INT >= 23) { createCapturer(new Camera2Enumerator(context)); //cameraDeviceName = CameraEnumerationAndroid.getNameOfBackFacingDevice(); } else { createCapturer(new Camera1Enumerator(false)); //cameraDeviceName = CameraEnumerationAndroid.getNameOfFrontFacingDevice(); } //return VideoCapturerAndroid.create(cameraDeviceName); } public void toggleAudioMute() { if (localMS.audioTracks.size() == 0) { System.out.println("No local audio available."); return; } if (isAudioMuted) { for (int i = 0; i < localMS.audioTracks.size(); i++) { localMS.audioTracks.get(i).setEnabled(true); } System.out.println("Audio unmuted."); } else { for (int i = 0; i < localMS.audioTracks.size(); i++) { localMS.audioTracks.get(i).setEnabled(false); } System.out.println("Audio muted."); } isAudioMuted = !isAudioMuted; } public void toggleVideoMute() { if (localMS.videoTracks.size() == 0) { System.out.println("No local video available."); return; } if (isVideoMuted) { for (int i = 0; i < localMS.videoTracks.size(); i++) { localMS.videoTracks.get(i).setEnabled(true); } System.out.println("Video unmuted."); } else { for (int i = 0; i < localMS.videoTracks.size(); i++) { localMS.videoTracks.get(i).setEnabled(false); } System.out.println("Video muted."); } isVideoMuted = !isVideoMuted; } private void createCapturer(CameraEnumerator enumerator) { final String[] deviceNames = enumerator.getDeviceNames(); // First, try to find front facing camera Logging.d(TAG, "Looking for front facing cameras."); for (String deviceName : deviceNames) { if (enumerator.isFrontFacing(deviceName)) { Logging.d(TAG, "Creating front facing camera capturer."); videoCapturer = enumerator.createCapturer(deviceName, null); if (videoCapturer != null) { System.out.println("deviceName = " + deviceName); return; } } } // Front facing camera not found, try something else Logging.d(TAG, "Looking for other cameras."); for (String deviceName : deviceNames) { if (!enumerator.isFrontFacing(deviceName)) { Logging.d(TAG, "Creating other camera capturer."); videoCapturer = enumerator.createCapturer(deviceName, null); if (videoCapturer != null) { return; } } } } }