X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;ds=sidebyside;f=app%2Fsrc%2Fmain%2Fjava%2Fai%2Fsuanzi%2Frtmpclient%2FMainActivity.java;h=4080ee2525361d270e46cd3a2e48c7406cb44417;hb=b7202442677d0cf41e6e59870cd6c34e5619b8b9;hp=31fcbf30cbff3899c687698a98c59e9765e0fb3c;hpb=214619593e74f6a04fa25f3614a99cf6b9704da5;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 31fcbf3..4080ee2 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -1,18 +1,454 @@ 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.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; +import android.view.SurfaceHolder; +import android.hardware.Camera; +import android.view.SurfaceView; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.AsyncTask; -public class MainActivity extends AppCompatActivity { +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; + +public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{ private static final String TAG = "PENG"; - private Ffmpeg ffmpeg = new Ffmpeg(); + private Ffmpeg ffmpeg;// = Ffmpeg.getInstance(); + private Camera mCamera ;//= getCameraInstance(); + private StreamTask mStreamTask; + private SurfaceHolder mHolder; + 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 void configLog(){ + try { + final LogConfigurator logConfigurator = new LogConfigurator(); + //logConfigurator.setFileName(Environment.getExternalStorageDirectory() + File.separator + "myc" + File.separator + "log" + File.separator + "test.log"); + 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(); + } + } + + + + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion()); + configLog(); + //Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion()); + + gLogger.debug("#######################################"); + ffmpeg = Ffmpeg.getInstance(); + + gLogger.debug(" this ia argument " + 3 + "fjeiofjei"); + + final Button btn = findViewById(R.id.button); + btn.setText("Start"); + /*btn.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"); + } + });*/ + + /*this.mCamera = getCameraInstance(); + if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras()); +*/ + final SurfaceView surfaceView = findViewById(R.id.surfaceView); + mHolder = surfaceView.getHolder(); + mHolder.addCallback(this); + + intent.setPackage(this.getPackageName()); + intent.setAction("ai.suanzi.rtmpclient.service"); + + + final Button btn2 = findViewById(R.id.button); + + + btn2.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View view){ + Log.e(TAG, "onclick2"); + //ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv"); + //ffmpeg.push(mHolder.getSurface()); + //ffmpeg.preview(mHolder.getSurface()); + // intent.putExtra("cmd",0);//0,开启前台服务,1,关闭前台服务 + // startService(intent); + ffmpeg.getVersion(); + } + + }); + + /*btn2.post(new Runnable(){ + @Override + public void run() { + btn2.performClick(); + + } + }); + + 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); + + usbCamera = device; + } + + //Log.e(TAG, device.) + //device.getInterface() + } + +*/ + + + + } + + //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();//获取文件描述符 + ffmpeg.test(fd); + 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"); + } + + @Override + protected void onResume() { + super.onResume(); + Log.e(TAG, "OnResume"); + } + + @Override + protected void onStop() { + super.onStop(); + Log.e(TAG,"onStop"); + } + + @Override + protected void onStart(){ + super.onStart(); + Log.e(TAG,"onStart"); + } + + @Override + protected void onDestroy(){ + super.onDestroy(); + Log.e(TAG,"onDestroy"); + } + + @Override + protected void onRestart(){ + super.onStart(); + Log.e(TAG,"onRestart"); + } + + // class StreamTask AsyncTask + private class StreamTask extends AsyncTask{ + private byte[] data; + + StreamTask(byte[] data){ + this.data = data; + } + + @Override + protected Void doInBackground(Void... params) { + + if (this.data != null){ + Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate()); + ffmpeg.process(this.data); + } + return null; + } + } + + // 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()); + }*/ + } + + @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); + + //try{ + //Thread.sleep(10000); + /*Log.e(TAG, "xxxxxxxxxxxxxx"); + mExecutor.execute(new Runnable() { + @Override + public void run() { + mCamera.startPreview(); + final Button btn = findViewById(R.id.button); + Camera.Parameters params = mCamera.getParameters(); + ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + } + });*/ + + //btn.performClick(); + //} catch (InterruptedException e){ + // e.printStackTrace(); + //} + + + + //Camera.Parameters params = mCamera.getParameters(); + //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + /*Thread t = new Thread(new Runnable() { + @Override + public void run() { + ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv"); + + } + });*/ + + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder){ + 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){ + switch (mStreamTask.getStatus()){ + case RUNNING: + Log.e(TAG, "onPreviewFrame Running"); + return; + case PENDING: + Log.e(TAG,"OnPreviewFrame Pending"); + mStreamTask.cancel(false); + break; + } + } + 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;*/ + + } + + // private + 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(0); + Camera.Parameters params = c.getParameters(); + Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height); + 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"); + } + + + + Camera.Parameters parameters = c.getParameters(); + + 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); + } + catch (Exception e){ + e.printStackTrace(); + } + return c; + } + +// private void changeCameraPermission(){ +// Log.e(TAG, "change /dev/video0 permission"); +// try{ +// /*Process sh = Runtime.getRuntime().exec("su", null,null); +// OutputStream os = sh.getOutputStream(); +// os.write(("chmod 666 /dev/video0").getBytes("ASCII")); +// os.flush(); +// os.close(); +// sh.waitFor();*/ +// +// Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); +// sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"}); +// sh.waitFor(); +// } catch (Exception e){ +// e.printStackTrace(); +// } +// } + + private void switchToBackground(){ + Intent i = new Intent(); + i.setAction(Intent.ACTION_MAIN); + i.addCategory(Intent.CATEGORY_HOME); + this.startActivity(i); + } + }