X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fai%2Fsuanzi%2Frtmpclient%2FMainActivity.java;h=5c2e2f9e3d6aa43d684a4371ccbd66b78ec72c7f;hb=831cc09829bc6e18d8d0d8bb78063e89ea565ce9;hp=c309797dcb3b5586399263b9fb1231aa91950196;hpb=791f24bb2d6f4faa5ff14e29c518ca078e9743eb;p=rtmpclient.git diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java index c309797..5c2e2f9 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -1,9 +1,18 @@ package ai.suanzi.rtmpclient; +import android.app.Activity; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.IntentFilter; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.os.Environment; +import android.support.design.widget.TextInputEditText; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.view.SurfaceHolder; import android.hardware.Camera; @@ -14,116 +23,292 @@ import android.widget.Toast; import android.content.Context; import android.content.pm.PackageManager; import android.os.AsyncTask; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.io.IOException; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import android.content.Intent; +import java.io.OutputStream; +import android.hardware.usb.UsbManager; +import android.hardware.usb.UsbDeviceConnection; +import de.mindpipe.android.logging.log4j.LogConfigurator; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import android.net.wifi.WifiManager; +import android.net.wifi.WifiInfo; +//"rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid"; public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{ private static final String TAG = "PENG"; - private Ffmpeg ffmpeg = new Ffmpeg(); - private Camera mCamera ;//= getCameraInstance(); + private Ffmpeg ffmpeg; + private Camera mCamera ; private StreamTask mStreamTask; private SurfaceHolder mHolder; + private SurfaceView mSufaceView; + private UVCCamera uvcCamera; ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + //Intent it = new Intent(getApplicationContext(), MyService.class); + Intent intent = new Intent(); + + private UsbManager usbManager; + private UsbDevice usbCamera; + + private Logger gLogger; + + private Button mBtnStart; + private TextInputEditText mTextServer; + private TextInputEditText mTextUser; + private TextInputEditText mTextCamera; + private String mMacAddr = ""; + + private void configLog(){ + try { + final LogConfigurator logConfigurator = new LogConfigurator(); + String fname = getExternalFilesDir(null) + File.separator + "log.txt"; + logConfigurator.setFileName(fname); + Log.e(TAG, "Log file is located at: " + fname); + logConfigurator.setRootLevel(Level.DEBUG); + logConfigurator.setLevel("org.apache", Level.ERROR); + logConfigurator.setMaxFileSize(1024 * 1024 * 10); + logConfigurator.configure(); + gLogger = Logger.getLogger(getClass()); + } catch (Exception e){ + e.printStackTrace(); + } + } + + private void init(){ + configLog(); + gLogger.debug("#######################################"); + UserInfo.setConfigPath(getExternalFilesDir(null) + File.separator + "config"); + this.mMacAddr = getMacAddr(); + + ffmpeg = Ffmpeg.getInstance(); + uvcCamera = new UVCCamera(); + + mBtnStart = findViewById(R.id.button); + mTextServer = findViewById(R.id.textServer); + mTextUser = findViewById(R.id.textUser); + mTextCamera = findViewById(R.id.textCamera); + loadConfig(); + + // init service + intent.setPackage(this.getPackageName()); + intent.setAction("ai.suanzi.rtmpclient.service"); + + // init surface view + mSufaceView = findViewById(R.id.surfaceView); + mHolder = mSufaceView.getHolder(); + mHolder.addCallback(this); + + // camera + mCamera = getCameraInstance(); + configCamera(mCamera); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion()); + init(); - final Button btn = findViewById(R.id.button); - btn.setText("Start"); - btn.setOnClickListener(new View.OnClickListener() { + mBtnStart.setOnClickListener(new View.OnClickListener(){ @Override - public void onClick(View v) { - Log.e(TAG, "Button " + btn.getText() + " onClick"); - if (mCamera == null) return; - if(btn.getText().equals("Start")){ - mCamera.startPreview(); - Camera.Parameters params = mCamera.getParameters(); - //params.setPreviewFpsRange(30000, 30000); - //params.setPictureSize(320, 240); - //params.setPictureFormat(ImageFormat.NV21); - //mCamera.setParameters(params); - - - - - ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); - } else { - mCamera.setPreviewCallback(null); - Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show(); - ffmpeg.flush(); - ffmpeg.close(); - } - btn.setText(btn.getText().equals("Start") ? "Stop" : "Start"); + public void onClick(View view){ + String url = mTextServer.getText().toString() + "/" + mTextUser.getText().toString() + "_" + mMacAddr + "_" + mTextCamera.getText().toString(); + gLogger.error("----------> onClick, Url is: " + url); + intent.putExtra("url", url); + startService(intent); + saveConfig(); + //changePermission(); } }); - this.mCamera = getCameraInstance(); - if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras()); + /*btn2.post(new Runnable(){ + @Override + public void run() { + btn2.performClick(); - final SurfaceView surfaceView = findViewById(R.id.surfaceView); - mHolder = surfaceView.getHolder(); - mHolder.addCallback(this); + } + }); + + switchToBackground();*/ + + /* + usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); + HashMap deviceList = usbManager.getDeviceList(); + Log.e(TAG, "device list size : " + deviceList.size()); + Iterator deviceIterator = deviceList.values().iterator(); + PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); + + IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED); + registerReceiver(mUsbReceiver, filter); + filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED); + registerReceiver(mUsbReceiver, filter); + filter = new IntentFilter(ACTION_USB_PERMISSION); + registerReceiver(mUsbReceiver, filter); + + while(deviceIterator.hasNext()){ + UsbDevice device = deviceIterator.next(); + Log.e(TAG, device.toString()); + Log.e(TAG, device.getDeviceName() + " manufacture name: " + device.getManufacturerName() + " " + device.getSerialNumber() + " " + device.getDeviceId()); + + if (device.getVendorId() == 6257){ + usbManager.requestPermission(device, mPermissionIntent); + Log.e(TAG,"XXXXXXXXXXXXXXXXXXXXXXXXXXX"); + Log.e(TAG, device.getVendorId() + "\n" + device.getProductId() + "\n" + device.getProductName() + "\n" + + device.getManufacturerName() + "\n" + device.getDeviceId() + "\n" + device.getSerialNumber() + "\n" + + device.getDeviceName()); + + final String name = device.getDeviceName(); + final String[] v = name.split("/"); + int busnum = 0; + int devnum = 0; + if (v != null) { + busnum = Integer.parseInt(v[v.length-2]); + devnum = Integer.parseInt(v[v.length-1]); + } + //mBusNum = busnum; + //mDevNum = devnum; + uData.vid = device.getVendorId(); + uData.pid = device.getProductId(); + uData.busNum = busnum; + uData.devNum = devnum; + + String result = null; + final String[] vv = name.split("/"); + if ((vv != null) && (vv.length > 2)) { + final StringBuilder sb = new StringBuilder(vv[0]); + for (int i = 1; i < vv.length - 2; i++) + sb.append("/").append(vv[i]); + result = sb.toString(); + } + uData.usbFsName = result; - // - mCamera.setPreviewCallback(this); - /*try{ - mCamera.setPreviewTexture(st); - }catch (IOException e){ - e.printStackTrace(); - }*/ + uData.print(); + + usbCamera = device; + } + //Log.e(TAG, device.) + //device.getInterface() + }*/ } - SurfaceTexture st = new SurfaceTexture(0); + /*private UsbData uData = new UsbData(); + + private class UsbData { + public int vid; + public int pid; + public int fd; + public int busNum; + public int devNum; + public String usbFsName; + public void print(){ + Log.e(TAG, "vid=" + vid + ". pid=" + pid + ". fd=" + fd + ". busnum=" + busNum + ". devNum=" + devNum + ". usbFsName=" + usbFsName); + } + }*/ + + //SurfaceTexture st = new SurfaceTexture(0); + + /*private static final String ACTION_USB_PERMISSION = + "com.android.example.USB_PERMISSION"; + private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { + + public void onReceive(Context context, Intent intent) { + 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){ + Log.e(TAG, "extra permission granted"); + //call method to set up device communication + + + new Thread(new Runnable() { + @Override + public void run() { + Log.e("device","MyThread3");//bhw + UsbDeviceConnection connection = usbManager.openDevice(usbCamera); + int fd = connection.getFileDescriptor();//获取文件描述符 + uData.fd = fd; + //ffmpeg.test(fd); + int ret = uvcCamera.open(uData.vid, uData.pid, uData.fd, uData.busNum, uData.devNum, uData.usbFsName); + Log.e(TAG, "uvcCamera open return code:" + ret); + + Log.e("device","MyThread3 "+fd); + } + }).start(); + + } + } + else { + Log.e(TAG, "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){ + Log.e(TAG, "==== device out"); + } + } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { + Log.e(TAG, "==== device in ====="); + } + } + };*/ + + @Override protected void onPause(){ super.onPause(); - Log.e(TAG, "OnPause"); - //ffmpeg.flush(); - //ffmpeg.close(); + gLogger.debug("OnPause"); } @Override protected void onResume() { super.onResume(); - Log.e(TAG, "OnResume"); + gLogger.debug("OnResume"); } @Override protected void onStop() { super.onStop(); - Log.e(TAG,"onStop"); + gLogger.debug("onStop"); } @Override protected void onStart(){ super.onStart(); - Log.e(TAG,"onStart"); + gLogger.debug("onStart"); } @Override protected void onDestroy(){ super.onDestroy(); - Log.e(TAG,"onDestroy"); + gLogger.debug("onDestroy"); } @Override protected void onRestart(){ super.onStart(); - Log.e(TAG,"onRestart"); + gLogger.debug("onRestart"); } + // class StreamTask AsyncTask private class StreamTask extends AsyncTask{ private byte[] data; @@ -143,26 +328,25 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal } } + + + // SurfaceHolder.Callback implementation @Override public void surfaceCreated(final SurfaceHolder holder){ - Log.e(TAG,"SurfacedCreated"); - try { - mCamera.setPreviewDisplay(holder); - //mCamera.startPreview(); - } catch (IOException e) { - Log.d(TAG, "Error setting camera preview: " + e.getMessage()); - } + gLogger.error("SurfacedCreated"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){ - Log.e(TAG, "surfaceChanged"); - //if(mCamera==null) return; - //Camera.Parameters parameters=mCamera.getParameters(); - //parameters.setPreviewSize(640,480); - //parameters.setPictureSize(640,480); - //mCamera.setParameters(parameters); + gLogger.error("surfaceChanged"); + try { + mCamera.setPreviewDisplay(holder); + mCamera.startPreview(); + } catch (Exception e){ + gLogger.error("Error starting camera previewe: " + e.getMessage()); + Toast.makeText(this, "Camera Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } } @Override @@ -170,13 +354,10 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal Log.e(TAG, "surfaceDestroyed"); } - private long encodeCount = 0; - private long count = 0; - private long previewTime; - // Camera.PreviewCallback @Override public void onPreviewFrame(final byte[] data, Camera camera){ - /*if (null != mStreamTask){ + gLogger.error("onPreviewFrame"); + if (null != mStreamTask){ switch (mStreamTask.getStatus()){ case RUNNING: Log.e(TAG, "onPreviewFrame Running"); @@ -188,21 +369,21 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal } } mStreamTask = new StreamTask(data); - mStreamTask.execute((Void)null);*/ - - - long endTime = System.currentTimeMillis(); - mExecutor.execute(new Runnable() { - @Override - public void run() { - long encodeTime = System.currentTimeMillis(); - ffmpeg.process(data); - Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime)); - } - }); - Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:" - + (endTime - previewTime) + " " + Thread.currentThread().getName()); - previewTime = endTime; + mStreamTask.execute((Void)null); + + +// ong endTime = System.currentTimeMillis(); +// mExecutor.execute(new Runnable() { +// @Override +// public void run() { +// //long encodeTime = System.currentTimeMillis(); +// ffmpeg.process(data); + //Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime)); +// } +// }); + //Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:" +// + (endTime - previewTime) + " " + Thread.currentThread().getName()); +// previewTime = endTime;*/ } @@ -215,34 +396,88 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal Camera c = null; try { Log.e(TAG, "Open Camera"); - c = Camera.open(0); - Camera.Parameters params = c.getParameters(); - Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height); - // NV21 : 17, JPEG 256 - Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat()); - List fps = params.getSupportedPreviewFpsRange(); - for(int[] i : fps){ - Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n"); - } + 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); + } - Camera.Parameters parameters = c.getParameters(); - //List sizes = parameters.getSupportedPreviewSizes(); - List sizes = parameters.getSupportedPictureSizes(); - for (Camera.Size cc : sizes){ - Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height); - } - Camera.Size cs = sizes.get(3); - params.setPreviewSize(cs.width, cs.height); - params.setPictureSize(cs.width, cs.height); - params.setPictureFormat(ImageFormat.NV21); - c.setParameters(params); + private void switchToBackground(){ + Intent i = new Intent(); + i.setAction(Intent.ACTION_MAIN); + i.addCategory(Intent.CATEGORY_HOME); + this.startActivity(i); + } + + private String getMacAddr() { + WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); + WifiInfo info = manager.getConnectionInfo(); + return info.getMacAddress().replace(":", ""); //02:00:00:00:00:00 - 020000000000 + } + + private void loadConfig() { + UserInfo info = UserInfo.getConfig(); + mTextServer.setText(info.server.equals("") ? "rtmp://gpussh.suanzi.ai:1935/myapp" : info.server); + mTextUser.setText(info.user.equals("") ? "suanzi" : info.user ); + mTextCamera.setText(info.cameraId.equals("") ? "001" : info.cameraId); + mMacAddr = info.macAddr.equals("") ? this.mMacAddr : info.macAddr; + gLogger.debug("loadConfig " + info.toString()); + } + + private void saveConfig() { + UserInfo info = UserInfo.getConfig(); + info.update(mTextServer.getText().toString(), mTextUser.getText().toString(), mMacAddr, mTextCamera.getText().toString()); + if(info.saveConfig()) { + Toast.makeText(getApplicationContext(), "Config saved", Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getApplicationContext(), "Error: config saved", Toast.LENGTH_LONG).show(); } - catch (Exception e){ + gLogger.error("saveConfig: " + info.toString()); + } + + 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(); } - return c; } - }