package com.cagneymoreau.video; import android.app.Activity; import android.content.Context; import android.util.Log; import com.cagneymoreau.commchannel.R; import com.cagneymoreau.network.RobotPoint; import com.cagneymoreau.video.AvccEncoder; import com.cagneymoreau.videoencoding.TransferEncodedH264; import com.github.piasy.videocre.VideoSink; import com.github.piasy.videocre.VideoSource; import org.webrtc.Camera1Enumerator; import org.webrtc.CameraEnumerator; import org.webrtc.EglBase; import org.webrtc.Logging; import org.webrtc.SurfaceTextureHelper; import org.webrtc.SurfaceViewRenderer; import org.webrtc.VideoCapturer; import org.webrtc.VideoFrame; import org.webrtc.VideoRenderer; import java.util.List; public class VideoCaptureAndroid { private static final String TAG = "VideoCaptureAndroid"; Context context; VideoCapturer videoCapturer; //this is the object representing the physical camera private SurfaceTextureHelper surfaceTextureHelper; private final static String CAPTURE_THREAD_NAME = "videocapturethread"; private EglBase eglBase; private SurfaceViewRenderer videoView; Activity mActivity; AvccEncoder avccEncoder; //convert to h264 boolean videoCaptureStopped = true; public VideoCaptureAndroid(Context context, Activity activity, RobotPoint robotPoint) { Log.d(TAG, "VideoCaptureAndroid: "); this.context = context; mActivity = activity; videoView = (SurfaceViewRenderer) mActivity.findViewById(R.id.mVideoView1); //get physical video hardware videoCapturer = createCameraCapturer(new Camera1Enumerator(true)); // create h264 encoder avccEncoder = new AvccEncoder(robotPoint); initCapture(); videoView.init(eglBase.getEglBaseContext(), null); avccEncoder.start(eglBase); start(); } //this method sets up are camera hardware on the front facing camera private static VideoCapturer createCameraCapturer(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 videoCapturer = enumerator.createCapturer(deviceName, null); if (videoCapturer != null) { return videoCapturer; } } } // 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 videoCapturer = enumerator.createCapturer(deviceName, null); if (videoCapturer != null) { return videoCapturer; } } } return null; } //this method starts our video capture and provides callbacks to alert us to incoming camera data private void initCapture() { eglBase = EglBase.create(); final EglBase.Context eglContext = eglBase.getEglBaseContext(); surfaceTextureHelper = SurfaceTextureHelper.create(CAPTURE_THREAD_NAME, eglContext); videoCapturer.initialize(surfaceTextureHelper, context, new VideoCapturer.CapturerObserver() { @Override public void onCapturerStarted(boolean b) { Log.d(TAG, "onCapturerStarted: "); } @Override public void onCapturerStopped() { Log.d(TAG, "onCapturerStopped: "); } @Override public void onByteBufferFrameCaptured(byte[] bytes, int i, int i1, int i2, long l) { } @Override public void onTextureFrameCaptured(int width, int height, int texId, float[] tranformMatrix, int rotation, long timestamp) { //Log.d(TAG, "onTextureFrameCaptured: ->"); VideoRenderer.I420Frame frame = new VideoRenderer.I420Frame(width, height, rotation, texId, tranformMatrix, 0,timestamp); avccEncoder.renderFrame(frame); videoView.renderFrame(frame); surfaceTextureHelper.returnTextureFrame(); } @Override public void onFrameCaptured(VideoFrame videoFrame) { } }); } public void start() { videoCaptureStopped = false; videoCapturer.startCapture(320,240, 30); } public void stop() { if(videoCapturer != null && !videoCaptureStopped) { try{ videoCapturer.stopCapture(); }catch (Exception e) { Log.e(TAG, "stop: ", e); } videoCaptureStopped = true; videoCapturer.dispose(); surfaceTextureHelper.dispose(); eglBase.release(); avccEncoder.destroy(); } } }