X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fai%2Fsuanzi%2Frtmpclient%2FMyService.java;h=ff2c182377b05e792e7b607ce5e5d4d0da489977;hb=390f2fc2d835c37fb5c078fea795ae28cffc088e;hp=cba2c42f88d0d99c551bc4886e6afd6f2d18ec6f;hpb=410441c06aa4257d7d9dcb1b581abb4017c67c50;p=rtmpclient.git diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MyService.java b/app/src/main/java/ai/suanzi/rtmpclient/MyService.java index cba2c42..ff2c182 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MyService.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MyService.java @@ -21,12 +21,11 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer private static Logger gLogger = Logger.getLogger("MyService"); private Camera mCamera = null; IBinder mBinder = new LocalBinder(); - private String rtmpUrl; + //private String rtmpUrl; private long frameCount = 0; // Preferred picture Size of the camera; - private int width = 0; - private int height = 0; + private Camera.Size mPreferredSize; private MyServiceEventListener mListener; @@ -53,9 +52,28 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer private void openCameraOriginal() { try { gLogger.error("openCameraOriginal"); + Camera.CameraInfo info = new Camera.CameraInfo(); + int numCameras = Camera.getNumberOfCameras(); + int backId = -1; + int frontId = -1; + int camerId = 0; + gLogger.debug("Number of Cameras is " + numCameras); + for(int i = 0; i < numCameras; i++){ + Camera.getCameraInfo(i, info); + if(info.facing == Camera.CameraInfo.CAMERA_FACING_BACK){ + gLogger.debug("CAMERA_FACING_BACK id is " + i); + backId = i; + } else if(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){ + gLogger.debug("CAMERA_FACING_FRONT id is " + i); + frontId = i; + } + } + if(frontId != -1) camerId = frontId; + else if(backId != -1) camerId = backId; + gLogger.debug("openCameraOriginal - camera id " + camerId); mCamera = Camera.open(1); } catch (Exception e) { - gLogger.error("camera is not available. error: " + e.getMessage()); + gLogger.error("openCameraOriginal - camera is not available. error: " + e.getMessage()); if(mListener != null) mListener.onCameraError("openCamera - error: " + e.getMessage()); } } @@ -72,6 +90,7 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer synchronized void notifyCameraOpened() { notify(); + gLogger.debug("notifyCameraOpened"); } void openCamera() { @@ -85,7 +104,7 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer try { wait(); } catch (InterruptedException e) { - gLogger.error("wait was interrupted"); + gLogger.error("wait was interrupted, " + e.getMessage()); } } } @@ -114,7 +133,7 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer super.onCreate(); gLogger.error("onCreate ---> "); createNotification(); - //Toast.makeText(this, "Started to Publish!", Toast.LENGTH_LONG).show(); + Toast.makeText(this, "Started to Publish!", Toast.LENGTH_LONG).show(); mCamera = getCameraInstance(); if(mCamera != null){ configCamera(mCamera); @@ -130,8 +149,14 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer gLogger.error( "onDestroy --------->"); Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show(); if(mCamera != null){ - mCamera.stopPreview(); - mCamera.release(); + try { + mCamera.stopPreview(); + mCamera.release(); + mCamera = null; + } catch (Exception e){ + gLogger.error("onDestroy - error " + e.getMessage()); + e.printStackTrace(); + } } } @@ -153,18 +178,25 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer public void onPreviewFrame(final byte[] data, Camera camera){ if(frameCount % (15 * 60) == 0) { gLogger.error("onPreviewFrame"); - if(mListener != null) mListener.onIsPreviewing("onPreviewFrame "); } - frameCount++; if(FfmpegHelper.processFrame(data) != 0){ - gLogger.error("FfmpegHelper.processFrame error, close"); + gLogger.error("onPreviewFrame, processFrame close"); FfmpegHelper.close(); if(mListener != null) mListener.onEncoderError("processFrame"); + } else { + if(frameCount % (15 * 60) == 0){ + if(mListener != null) mListener.onPublishing("processFrame OK"); + } } + frameCount++; } public void startPreview (SurfaceHolder holder){ - gLogger.error("startPreview"); + gLogger.debug("startPreview"); + if(mCamera == null){ + gLogger.error("startPreview - error: camera is null"); + return; + } try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); @@ -175,11 +207,27 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer } } + public void reopenCamera() { + gLogger.debug("reopenCamera"); + if(mCamera != null){ + mCamera.stopPreview(); + mCamera.release(); + mCamera = null; + } + openCameraOriginal(); + } + public boolean setRtmpUrl (String url){ - this.rtmpUrl = url; - if(mCamera == null) return false; - gLogger.error("setRtmpUrl - size: " + width + "x" + height + ". url: " + url); - int ret = FfmpegHelper.initEncoder(width, height, url); + //this.rtmpUrl = url; + if(mCamera == null || mPreferredSize == null){ + gLogger.error("setRtmpUrl, error mCamera or PreferredSize is null"); + return false; + } + gLogger.error("setRtmpUrl - size: " + mPreferredSize.width + "x" + mPreferredSize.height + ". url: " + url); + int ret = FfmpegHelper.initEncoder(mPreferredSize.width, mPreferredSize.height, url); + if(ret != 0){ + gLogger.error("setRtmpUrl, initEncoder error"); + } return ret == 0 ? true : false; } @@ -203,8 +251,7 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer for(int[] i : paras.getSupportedPreviewFpsRange()){ gLogger.error("[" + i[0] + "," + i[1] + "]"); } - width = preferredSize.width; - height = preferredSize.height; + mPreferredSize = preferredSize; paras.setPictureSize(preferredSize.width, preferredSize.height); // use 640x480 preferred camera.setParameters(paras); camera.setDisplayOrientation(0); @@ -213,11 +260,23 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer camera.setPreviewCallback(this); } + public Camera.Size getBestPictureSize(){ + return mPreferredSize; + } + // Camaer.onError callback @Override public void onError(int error, Camera camera){ - //if(error == CAMERA_ERROR_SERVER_DIED) - gLogger.error("onError, " + error); + gLogger.error("Camera.OnError, " + error); + switch (error) { + case Camera.CAMERA_ERROR_SERVER_DIED: + gLogger.error("CAMERA_ERROR_SERVER_DIED"); + break; + case Camera.CAMERA_ERROR_UNKNOWN: + gLogger.error("CAMERA_ERROR_UNKNOWN"); + break; + } + if(mListener != null) mListener.onCameraError("OnError, " + error); } @@ -225,7 +284,7 @@ public class MyService extends Service implements Camera.PreviewCallback, Camer public interface MyServiceEventListener { void onCameraError(String err); void onEncoderError(String msg); - void onIsPreviewing(String msg); // notify mainActivity if preview is running well -// void onIsPublishing(String msg); // notify main activity if encoder is running well; + //void onIsPreviewing(String msg); // notify mainActivity if preview is running well + void onPublishing(String msg); // notify main activity if encoder is running well; } }