From 410441c06aa4257d7d9dcb1b581abb4017c67c50 Mon Sep 17 00:00:00 2001 From: Peng Li Date: Tue, 22 May 2018 22:34:35 +0800 Subject: [PATCH 1/1] Add UsbMonitor --- .../java/ai/suanzi/rtmpclient/MainActivity.java | 250 ++++++++++++--------- .../main/java/ai/suanzi/rtmpclient/MyService.java | 85 ++++--- .../main/java/ai/suanzi/rtmpclient/UsbMonitor.java | 108 +++++++++ .../main/java/ai/suanzi/rtmpclient/UserInfo.java | 11 +- app/src/main/jni/FfmpegHelper.cpp | 8 + app/src/main/jni/FfmpegHelper.h | 1 + 6 files changed, 325 insertions(+), 138 deletions(-) diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java index 320e2bb..14b8d5e 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -10,6 +10,7 @@ import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Environment; import android.support.design.widget.TextInputEditText; +import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; @@ -51,9 +52,9 @@ import android.net.ConnectivityManager; //"rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid"; -public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{ +public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback, MyService.MyServiceEventListener{ - private static final String TAG = "PENG"; + private static final String TAG = "MainActivity"; //private Ffmpeg ffmpeg; //private Camera mCamera ; //private StreamTask mStreamTask; @@ -62,7 +63,7 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal //private UVCCamera uvcCamera; //ExecutorService mExecutor = Executors.newSingleThreadExecutor(); //Intent it = new Intent(getApplicationContext(), MyService.class); - Intent intent = new Intent(); + //Intent intent = new Intent(); //private UsbManager usbManager; //private UsbDevice usbCamera; @@ -77,11 +78,14 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal //private CameraView mCameraView; private String mRtmpUrl; private NetworkMonitor networkMonitor; + private UsbMonitor mUsbMonitor; boolean mBounded; MyService mServer; Intent mIntent; + // private ServiceReceiver mServiceReceiver; + private void configLog(){ try { final LogConfigurator logConfigurator = new LogConfigurator(); @@ -112,8 +116,55 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal mSufaceView = findViewById(R.id.surfaceView); mHolder = mSufaceView.getHolder(); mHolder.addCallback(this); - //intent.setPackage(this.getPackageName()); // init service - //intent.setAction("ai.suanzi.rtmpclient.service"); + + mIntent = new Intent(this, MyService.class); + mUsbMonitor = new UsbMonitor(new UsbMonitor.UsbListener() { + @Override + public void onCameraConnected() { + gLogger.error("onCameraConnected, current Usb Camera count: " + mUsbMonitor.getUsbCameraCount()); + doUnbindService(); + if(mUsbMonitor.hasUsbCamera()){ + doBindService(); + } + } + + @Override + public void onCameraDisconnected() { + gLogger.error("onCameraDisconnected, current camera count: " + mUsbMonitor.getUsbCameraCount()); + doUnbindService(); + if(mUsbMonitor.hasUsbCamera()){ + doBindService(); + } + + } + }, this); + + networkMonitor = new NetworkMonitor(new NetworkMonitor.NetworkListener() { + @Override + public void onWifiConnected() { + gLogger.error("onWifiConnected"); + doBindService(); + } + + @Override + public void onWifiDisconnected() { + gLogger.error("onWifiDisconnected"); + doUnbindService(); + } + + @Override + public void onWifiEnabled() { + gLogger.error("onWifiEnabled"); + } + + @Override + public void onWifiDisabled() { + gLogger.error("onWifiDisabled"); + } + }); + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + registerReceiver(networkMonitor, filter); } @@ -133,14 +184,15 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal mBounded = true; LocalBinder mLocalBinder = (LocalBinder)service; mServer = mLocalBinder.getServiceInstance(); - if(mServer.setRtmpUrl(UserInfo.getConfig().toUrl())){ + mServer.setServiceEventListener(MainActivity.this); + if(mServer.setRtmpUrl(UserInfo.getConfig().toUrl(mMacAddr))){ mServer.startPreview(mHolder); } } }; private void doBindService(){ - if(!mBounded) { + if(!mBounded && canStartService()) { gLogger.debug("doBindService"); bindService(mIntent, mConnection, BIND_AUTO_CREATE); } @@ -162,9 +214,7 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal init(); loadConfig(); - //startService(intent); - mIntent = new Intent(this, MyService.class); - if(NetworkMonitor.isNetworkAvailable(this)){ + if(NetworkMonitor.isNetworkAvailable(this) && mUsbMonitor.hasUsbCamera()){ gLogger.error("Current network is available"); doBindService(); } else { @@ -178,38 +228,8 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal gLogger.error("----------> onClick"); saveConfig(); doUnbindService(); - } }); - - if ( networkMonitor == null) { - networkMonitor = new NetworkMonitor(new NetworkMonitor.NetworkListener() { - @Override - public void onWifiConnected() { - gLogger.error("onWifiConnected"); - doBindService(); - } - - @Override - public void onWifiDisconnected() { - gLogger.error("onWifiDisconnected"); - doUnbindService(); - } - - @Override - public void onWifiEnabled() { - gLogger.error("onWifiEnabled"); - } - - @Override - public void onWifiDisabled() { - gLogger.error("onWifiDisabled"); - } - }); - } - IntentFilter filter = new IntentFilter(); - filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - registerReceiver(networkMonitor, filter); } @Override @@ -288,7 +308,7 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal mTextUser.setText(info.user); mTextCamera.setText(info.cameraId); //mMacAddr = info.macAddr.equals("") ? this.mMacAddr : info.macAddr; - gLogger.error("loadConfig - url is :" + info.toUrl()); + gLogger.error("loadConfig - url is :" + info.toUrl(mMacAddr)); } private void saveConfig() { @@ -299,73 +319,103 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal } else { Toast.makeText(getApplicationContext(), "Error: config saved", Toast.LENGTH_LONG).show(); } - gLogger.error("saveConfig - url: " + info.toUrl()); + gLogger.error("saveConfig - url: " + info.toUrl(mMacAddr)); } - private void changePermission(){ - try { - Log.e(TAG, "change permission"); - //Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "chmod 666 /dev/video0"}); - - Process sh = Runtime.getRuntime().exec("/system/xbin/su", null,null); - //Process sh = Runtime.getRuntime().exec("su", null,null); - - OutputStream os = sh.getOutputStream(); - os.write(("/system/bin/chmod 666 /dev/video0").getBytes("ASCII")); - //os.write(("/system/bin/echo 'wowo' >> /data/local/test").getBytes("ASCII")); - os.flush(); - os.close(); - sh.waitFor(); - - - }catch (Exception e){ - e.printStackTrace(); - } + private boolean canStartService(){ + //gLogger.debug("canStartService - Camera: " + mUsbMonitor.hasUsbCamera() + ". Network: " + NetworkMonitor.isNetworkAvailable()); + return mUsbMonitor.hasUsbCamera() && NetworkMonitor.isNetworkAvailable(this); } - private boolean checkCameraHardware(Context context) { - return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); + // MyServiceEventListener + @Override + public void onCameraError(String msg){ + gLogger.error("onCameraEvent " + msg); } - private static Camera getCameraInstance(){ - Camera c = null; - try { - Log.e(TAG, "Open Camera"); - c = Camera.open(1); - } catch (Exception e){ - e.printStackTrace(); - } - return c; + @Override + public void onEncoderError(String msg){ + gLogger.error("onEncoderEvent: " + msg); } - private void configCamera(Camera camera){ - Camera.Parameters paras = camera.getParameters(); - gLogger.error("Supported Picture Sizes:"); - for (Camera.Size cc : paras.getSupportedPictureSizes()){ - gLogger.error(cc.width + "x" + cc.height); - } - gLogger.error("Supported Preview fps range:"); - for(int[] i : paras.getSupportedPreviewFpsRange()){ - gLogger.error("[" + i[0] + "," + i[1] + "]"); - } - gLogger.error("Set parameters"); - camera.setParameters(paras); - camera.setDisplayOrientation(0); - gLogger.error("Preview Format: " + paras.getPreviewFormat() + ". Size: " + paras.getPreviewSize().width + "x" + paras.getPreviewSize().height); - gLogger.error("Picture Format: " + paras.getPictureFormat() + ". Size: " + paras.getPictureSize().width + "x" + paras.getPictureSize().height); - - try { - camera.setPreviewDisplay(mHolder); - } catch (IOException e){ - e.printStackTrace(); - } - //camera.setPreviewCallback(this); + @Override + public void onIsPreviewing(String msg){ + gLogger.error("onIsPreviewing: " + msg); } - private void switchToBackground(){ - Intent i = new Intent(); - i.setAction(Intent.ACTION_MAIN); - i.addCategory(Intent.CATEGORY_HOME); - this.startActivity(i); - } + +// class ServiceReceiver extends BroadcastReceiver{ +// @Override +// public void onReceive(Context context, Intent intent) { +// String value = intent.getStringExtra("extra_data"); +// gLogger.error("ServiceReceiver onReceive - " + value); +// } +// } + +// private void changePermission(){ +// try { +// Log.e(TAG, "change permission"); +// //Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "chmod 666 /dev/video0"}); +// +// Process sh = Runtime.getRuntime().exec("/system/xbin/su", null,null); +// //Process sh = Runtime.getRuntime().exec("su", null,null); +// +// OutputStream os = sh.getOutputStream(); +// os.write(("/system/bin/chmod 666 /dev/video0").getBytes("ASCII")); +// //os.write(("/system/bin/echo 'wowo' >> /data/local/test").getBytes("ASCII")); +// os.flush(); +// os.close(); +// sh.waitFor(); +// +// +// }catch (Exception e){ +// e.printStackTrace(); +// } +// } +// +// private boolean checkCameraHardware(Context context) { +// return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); +// } +// +// private static Camera getCameraInstance(){ +// Camera c = null; +// try { +// Log.e(TAG, "Open Camera"); +// c = Camera.open(1); +// } catch (Exception e){ +// e.printStackTrace(); +// } +// return c; +// } +// +// private void configCamera(Camera camera){ +// Camera.Parameters paras = camera.getParameters(); +// gLogger.error("Supported Picture Sizes:"); +// for (Camera.Size cc : paras.getSupportedPictureSizes()){ +// gLogger.error(cc.width + "x" + cc.height); +// } +// gLogger.error("Supported Preview fps range:"); +// for(int[] i : paras.getSupportedPreviewFpsRange()){ +// gLogger.error("[" + i[0] + "," + i[1] + "]"); +// } +// gLogger.error("Set parameters"); +// camera.setParameters(paras); +// camera.setDisplayOrientation(0); +// gLogger.error("Preview Format: " + paras.getPreviewFormat() + ". Size: " + paras.getPreviewSize().width + "x" + paras.getPreviewSize().height); +// gLogger.error("Picture Format: " + paras.getPictureFormat() + ". Size: " + paras.getPictureSize().width + "x" + paras.getPictureSize().height); +// +// try { +// camera.setPreviewDisplay(mHolder); +// } catch (IOException e){ +// e.printStackTrace(); +// } +// //camera.setPreviewCallback(this); +// } +// +// private void switchToBackground(){ +// Intent i = new Intent(); +// i.setAction(Intent.ACTION_MAIN); +// i.addCategory(Intent.CATEGORY_HOME); +// this.startActivity(i); +// } } diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MyService.java b/app/src/main/java/ai/suanzi/rtmpclient/MyService.java index 45aedcc..cba2c42 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MyService.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MyService.java @@ -2,43 +2,37 @@ package ai.suanzi.rtmpclient; import android.app.Service; import android.content.Intent; -import android.graphics.SurfaceTexture; import android.hardware.Camera; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; -import android.os.Looper; -import android.util.Log; import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.WindowManager; import android.widget.Toast; import android.support.v4.app.NotificationCompat; import android.graphics.BitmapFactory; import android.app.Notification; -import android.os.Message; -import org.apache.log4j.Level; import org.apache.log4j.Logger; -import android.hardware.Camera.PreviewCallback; -import android.os.IBinder; import android.os.Binder; -import android.content.Context; -import android.graphics.PixelFormat; -import java.io.IOException; -import android.view.Gravity; -public class MyService extends Service implements Camera.PreviewCallback { - private static Logger gLogger = Logger.getLogger("MyService"); - private static String TAG = "MyService"; - //private Ffmpeg ffmpeg = Ffmpeg.getInstance(); - private Boolean isRunning = false; +public class MyService extends Service implements Camera.PreviewCallback, Camera.ErrorCallback { + + private static Logger gLogger = Logger.getLogger("MyService"); private Camera mCamera = null; IBinder mBinder = new LocalBinder(); private String rtmpUrl; private long frameCount = 0; + // Preferred picture Size of the camera; + private int width = 0; + private int height = 0; + + + private MyServiceEventListener mListener; + public void setServiceEventListener(MyServiceEventListener listener){ + mListener = listener; + } public class LocalBinder extends Binder { public MyService getServiceInstance(){ @@ -53,9 +47,6 @@ public class MyService extends Service implements Camera.PreviewCallback { mThread.openCamera(); } } - if (mCamera == null){ - gLogger.error("getCameraInstance, camera is null"); - } return mCamera; } @@ -65,6 +56,7 @@ public class MyService extends Service implements Camera.PreviewCallback { mCamera = Camera.open(1); } catch (Exception e) { gLogger.error("camera is not available. error: " + e.getMessage()); + if(mListener != null) mListener.onCameraError("openCamera - error: " + e.getMessage()); } } @@ -122,9 +114,13 @@ public class MyService extends Service implements Camera.PreviewCallback { super.onCreate(); gLogger.error("onCreate ---> "); createNotification(); - Toast.makeText(this, "Video stream pushed to " + this.rtmpUrl, Toast.LENGTH_LONG).show(); + //Toast.makeText(this, "Started to Publish!", Toast.LENGTH_LONG).show(); mCamera = getCameraInstance(); - configCamera(mCamera); + if(mCamera != null){ + configCamera(mCamera); + mCamera.setErrorCallback(this); + } + } @Override @@ -137,7 +133,6 @@ public class MyService extends Service implements Camera.PreviewCallback { mCamera.stopPreview(); mCamera.release(); } - FfmpegHelper.close(); } @@ -158,49 +153,49 @@ public class MyService extends Service implements Camera.PreviewCallback { 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("FfmpegHelper.processFrame error, close"); FfmpegHelper.close(); + if(mListener != null) mListener.onEncoderError("processFrame"); } } public void startPreview (SurfaceHolder holder){ gLogger.error("startPreview"); - if (mCamera == null){ - gLogger.error("startPreview - error: camera is null"); - return; - } try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (Exception e){ gLogger.error("startPreview - error: " + e.getMessage()); e.printStackTrace(); + if(mListener != null) mListener.onCameraError("setPreviewDisplay - " + e.getMessage()); } } public boolean setRtmpUrl (String url){ this.rtmpUrl = url; - Camera.Parameters param = mCamera.getParameters(); - int width = param.getPictureSize().width; - int height = param.getPictureSize().height; + if(mCamera == null) return false; gLogger.error("setRtmpUrl - size: " + width + "x" + height + ". url: " + url); int ret = FfmpegHelper.initEncoder(width, height, url); return ret == 0 ? true : false; } private void configCamera(Camera camera){ - if(mCamera == null){ - gLogger.error("configCamera - camera is null"); + Camera.Parameters paras = null; + try { + paras = camera.getParameters(); + } catch (RuntimeException e){ + gLogger.error("configCamera - " + e.getMessage()); + if(mListener != null) mListener.onCameraError("getParameters - " + e.getMessage()); return; } - Camera.Parameters paras = camera.getParameters(); gLogger.error("Supported Picture Sizes:"); Camera.Size preferredSize = paras.getSupportedPictureSizes().get(0); for (Camera.Size cc : paras.getSupportedPictureSizes()){ - if (cc.width == 640) + if (cc.width == 640) // chose 640 x 480 if exists preferredSize = cc; gLogger.error(cc.width + "x" + cc.height); } @@ -208,6 +203,8 @@ public class MyService extends Service implements Camera.PreviewCallback { for(int[] i : paras.getSupportedPreviewFpsRange()){ gLogger.error("[" + i[0] + "," + i[1] + "]"); } + width = preferredSize.width; + height = preferredSize.height; paras.setPictureSize(preferredSize.width, preferredSize.height); // use 640x480 preferred camera.setParameters(paras); camera.setDisplayOrientation(0); @@ -215,4 +212,20 @@ public class MyService extends Service implements Camera.PreviewCallback { gLogger.error("Picture Format: " + paras.getPictureFormat() + ". Size: " + paras.getPictureSize().width + "x" + paras.getPictureSize().height); camera.setPreviewCallback(this); } + + // Camaer.onError callback + @Override + public void onError(int error, Camera camera){ + //if(error == CAMERA_ERROR_SERVER_DIED) + gLogger.error("onError, " + error); + if(mListener != null) mListener.onCameraError("OnError, " + error); + } + + + 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; + } } diff --git a/app/src/main/java/ai/suanzi/rtmpclient/UsbMonitor.java b/app/src/main/java/ai/suanzi/rtmpclient/UsbMonitor.java index fc8bbdd..f1e06f0 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/UsbMonitor.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/UsbMonitor.java @@ -1,4 +1,112 @@ package ai.suanzi.rtmpclient; +import android.hardware.usb.UsbManager; +import android.content.Context; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.ListIterator; +import java.util.List; +import org.apache.log4j.Logger; +import android.app.PendingIntent; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.BroadcastReceiver; + public class UsbMonitor { + + private UsbListener mListener; + private Context mContext; + private UsbManager mUsbManager; + private List mUsbCameraList = new ArrayList<>(); + + private static Logger gLogger = Logger.getLogger("UsbMonitor"); + + public UsbMonitor(UsbListener listener, Context context){ + mListener = listener; + mContext = context; + mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); + + HashMap deviceList = mUsbManager.getDeviceList(); + gLogger.error("device list size : " + deviceList.size()); + Iterator deviceIterator = deviceList.values().iterator(); + //PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0); + IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED); + mContext.registerReceiver(mUsbReceiver, filter); + filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED); + mContext.registerReceiver(mUsbReceiver, filter); + filter = new IntentFilter(ACTION_USB_PERMISSION); + mContext.registerReceiver(mUsbReceiver, filter); + + while (deviceIterator.hasNext()) { + UsbDevice device = deviceIterator.next(); + gLogger.error(device.toString()); + if(isUvcCamera(device)) mUsbCameraList.add(device); + } + //mUsbManager.requestPermission(device, mPermissionIntent); + } + + private boolean isUvcCamera(UsbDevice device){ + return (device.getDeviceProtocol() == 1 && device.getProductName().contains("Camera")); + } + + public boolean hasUsbCamera(){ + gLogger.error("hasUsbCamera - size: " + mUsbCameraList.size()); + return (mUsbCameraList.size() > 0 ? true : false); + } + + public int getUsbCameraCount(){ + return mUsbCameraList.size(); + } + + private static final String ACTION_USB_PERMISSION = "ai.suanzi.rtmpclient.UsbMonitor.USB_PERMISSION"; + + private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { + + public void onReceive(Context context, Intent intent) { + gLogger.error("onReceive"); + String action = intent.getAction(); + if (ACTION_USB_PERMISSION.equals(action)) { + synchronized (this) { + UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) { + if(device != null){ + gLogger.error( "extra permission granted"); + //call method to set up device communication + } + } + else { + gLogger.error("permission denied for device. " + device); + } + } + } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){ + UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if (device != null){ + gLogger.error("Device plug out"); + gLogger.error(device.toString()); + if(isUvcCamera(device)) { + mUsbCameraList.remove(device); + mListener.onCameraConnected(); + } + } + } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { + UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + gLogger.error("Device plug in"); + gLogger.error(device.toString()); + if(isUvcCamera(device)) { + mUsbCameraList.add(device); + mListener.onCameraDisconnected(); + } + } + } + }; + + public interface UsbListener { + void onCameraConnected(); + void onCameraDisconnected(); + } } diff --git a/app/src/main/java/ai/suanzi/rtmpclient/UserInfo.java b/app/src/main/java/ai/suanzi/rtmpclient/UserInfo.java index 9d95894..8009127 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/UserInfo.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/UserInfo.java @@ -1,5 +1,8 @@ package ai.suanzi.rtmpclient; +import android.content.Context; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; import android.widget.Toast; import java.io.BufferedReader; @@ -23,6 +26,8 @@ public class UserInfo { private static String configPath; private static Logger gLogger = Logger.getLogger("UserInfo"); + private static String DEFAULT_SERVER = "rtmp://gpussh.suanzi.ai:1935/myapp"; + private static String DEFAULT_USER = "yunzhi"; private static UserInfo instance = null; private UserInfo () {} @@ -132,9 +137,11 @@ public class UserInfo { } } - public String toUrl () { + public String toUrl (String mac) { //rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid - return server + "/" + user + "_" + macAddr + "_" + cameraId; + //return server + "/" + user + "_" + macAddr + "_" + cameraId; + return (server.equals("") ? DEFAULT_SERVER : server) + "/" + (user.equals("") ? DEFAULT_USER : user) + "_" + mac; + } public String getValue(String key){ diff --git a/app/src/main/jni/FfmpegHelper.cpp b/app/src/main/jni/FfmpegHelper.cpp index 1df52e5..3bd2f10 100644 --- a/app/src/main/jni/FfmpegHelper.cpp +++ b/app/src/main/jni/FfmpegHelper.cpp @@ -7,6 +7,7 @@ FfmpegHelper* FfmpegHelper::singleton = NULL; bool FfmpegHelper::isInit = false; +bool FfmpegHelper::isEncoderReady = false; FfmpegHelper::FfmpegHelper(JavaVM *vm, jclass cls) @@ -79,6 +80,7 @@ void FfmpegHelper::init() FLOGE("avformat_network_init, error:%s(%d)", av_err2str(ret), ret); } isInit = true; + isEncoderReady = false; } int FfmpegHelper::initEncoder(int width, int height, const char* outpath) @@ -146,12 +148,17 @@ int FfmpegHelper::initEncoder(int width, int height, const char* outpath) } startTime = av_gettime(); frameCnt = 0; + isEncoderReady = true; return 0; } int FfmpegHelper::processFrame(uint8_t* data) { + if(!isEncoderReady){ + FLOGE("processFrame - isEncoderReady is false."); + return 0; + } int ret = 0; int y_length = pWidth * pHeight; pFrameYUV = av_frame_alloc(); @@ -236,6 +243,7 @@ int FfmpegHelper::close() avformat_free_context(formatCtx); } FLOGE("<----------- FfmpegHelper::close "); + isEncoderReady = false; return 0; } diff --git a/app/src/main/jni/FfmpegHelper.h b/app/src/main/jni/FfmpegHelper.h index 9c95cda..c79512c 100644 --- a/app/src/main/jni/FfmpegHelper.h +++ b/app/src/main/jni/FfmpegHelper.h @@ -47,6 +47,7 @@ private: int pHeight; unsigned int frameCnt; int64_t startTime; + static bool isEncoderReady; }; #endif /* __FFMPEG_HELPER_H__ */ -- 2.11.0