1 package ai.suanzi.rtmpclient;
3 import android.app.Activity;
4 import android.app.PendingIntent;
5 import android.content.BroadcastReceiver;
6 import android.content.IntentFilter;
7 import android.graphics.ImageFormat;
8 import android.graphics.SurfaceTexture;
9 import android.hardware.usb.UsbDevice;
10 import android.hardware.usb.UsbManager;
11 import android.os.Environment;
12 import android.support.v7.app.AppCompatActivity;
13 import android.os.Bundle;
14 import android.util.Log;
15 import android.view.SurfaceHolder;
16 import android.hardware.Camera;
17 import android.view.SurfaceView;
18 import android.view.View;
19 import android.widget.Button;
20 import android.widget.Toast;
21 import android.content.Context;
22 import android.content.pm.PackageManager;
23 import android.os.AsyncTask;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.io.IOException;
30 import java.util.concurrent.Executor;
31 import java.util.concurrent.ExecutorService;
32 import java.util.concurrent.Executors;
33 import android.content.Intent;
34 import java.io.OutputStream;
35 import android.hardware.usb.UsbManager;
36 import android.hardware.usb.UsbDeviceConnection;
38 import de.mindpipe.android.logging.log4j.LogConfigurator;
39 import org.apache.log4j.Level;
40 import org.apache.log4j.Logger;
42 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
44 private static final String TAG = "PENG";
45 private Ffmpeg ffmpeg;// = Ffmpeg.getInstance();
46 private Camera mCamera ;//= getCameraInstance();
47 private StreamTask mStreamTask;
48 private SurfaceHolder mHolder;
49 ExecutorService mExecutor = Executors.newSingleThreadExecutor();
50 //Intent it = new Intent(getApplicationContext(), MyService.class);
51 Intent intent = new Intent();
53 private UsbManager usbManager;
54 private UsbDevice usbCamera;
56 private Logger gLogger;
57 private void configLog(){
59 final LogConfigurator logConfigurator = new LogConfigurator();
60 //logConfigurator.setFileName(Environment.getExternalStorageDirectory() + File.separator + "myc" + File.separator + "log" + File.separator + "test.log");
61 String fname = getExternalFilesDir(null) + File.separator + "log.txt";
62 logConfigurator.setFileName(fname);
63 Log.e(TAG, "Log file is located at: " + fname);
64 logConfigurator.setRootLevel(Level.DEBUG);
65 logConfigurator.setLevel("org.apache", Level.ERROR);
66 logConfigurator.setMaxFileSize(1024 * 1024 * 10);
67 logConfigurator.configure();
68 gLogger = Logger.getLogger(getClass());
69 } catch (Exception e){
79 protected void onCreate(Bundle savedInstanceState) {
80 super.onCreate(savedInstanceState);
81 setContentView(R.layout.activity_main);
83 //Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
85 gLogger.debug("#######################################");
86 ffmpeg = Ffmpeg.getInstance();
88 gLogger.debug(" this ia argument " + 3 + "fjeiofjei");
90 final Button btn = findViewById(R.id.button);
92 /*btn.setOnClickListener(new View.OnClickListener() {
94 public void onClick(View v) {
95 Log.e(TAG, "Button " + btn.getText() + " onClick");
96 if (mCamera == null) return;
97 if(btn.getText().equals("Start")){
98 mCamera.startPreview();
99 Camera.Parameters params = mCamera.getParameters();
100 //params.setPreviewFpsRange(30000, 30000);
101 //params.setPictureSize(320, 240);
102 //params.setPictureFormat(ImageFormat.NV21);
103 //mCamera.setParameters(params);
108 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
110 mCamera.setPreviewCallback(null);
111 Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
115 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
119 /*this.mCamera = getCameraInstance();
120 if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
122 final SurfaceView surfaceView = findViewById(R.id.surfaceView);
123 mHolder = surfaceView.getHolder();
124 mHolder.addCallback(this);
126 intent.setPackage(this.getPackageName());
127 intent.setAction("ai.suanzi.rtmpclient.service");
130 final Button btn2 = findViewById(R.id.button);
133 btn2.setOnClickListener(new View.OnClickListener(){
135 public void onClick(View view){
136 Log.e(TAG, "onclick2");
137 //ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv");
138 //ffmpeg.push(mHolder.getSurface());
139 //ffmpeg.preview(mHolder.getSurface());
140 // intent.putExtra("cmd",0);//0,开启前台服务,1,关闭前台服务
141 // startService(intent);
147 /*btn2.post(new Runnable(){
155 switchToBackground();*/
158 usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
160 HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
161 Log.e(TAG, "device list size : " + deviceList.size());
162 Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
163 PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
165 IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
166 registerReceiver(mUsbReceiver, filter);
167 filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
168 registerReceiver(mUsbReceiver, filter);
169 filter = new IntentFilter(ACTION_USB_PERMISSION);
170 registerReceiver(mUsbReceiver, filter);
172 while(deviceIterator.hasNext()){
173 UsbDevice device = deviceIterator.next();
174 Log.e(TAG, device.toString());
175 Log.e(TAG, device.getDeviceName() + " manufacture name: " + device.getManufacturerName() + " " + device.getSerialNumber() + " " + device.getDeviceId());
177 if (device.getVendorId() == 6257){
178 usbManager.requestPermission(device, mPermissionIntent);
183 //Log.e(TAG, device.)
184 //device.getInterface()
193 //SurfaceTexture st = new SurfaceTexture(0);
195 private static final String ACTION_USB_PERMISSION =
196 "com.android.example.USB_PERMISSION";
197 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
199 public void onReceive(Context context, Intent intent) {
200 String action = intent.getAction();
201 if (ACTION_USB_PERMISSION.equals(action)) {
202 synchronized (this) {
203 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
205 if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
207 Log.e(TAG, "extra permission granted");
208 //call method to set up device communication
211 new Thread(new Runnable() {
214 Log.e("device","MyThread3");//bhw
215 UsbDeviceConnection connection = usbManager.openDevice(usbCamera);
216 int fd = connection.getFileDescriptor();//获取文件描述符
218 Log.e("device","MyThread3 "+fd);
225 Log.e(TAG, "permission denied for device. " + device);
228 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
229 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
231 Log.e(TAG, "==== device out");
233 } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
234 Log.e(TAG, "==== device in =====");
243 protected void onPause(){
245 Log.e(TAG, "OnPause");
249 protected void onResume() {
251 Log.e(TAG, "OnResume");
255 protected void onStop() {
261 protected void onStart(){
263 Log.e(TAG,"onStart");
267 protected void onDestroy(){
269 Log.e(TAG,"onDestroy");
273 protected void onRestart(){
275 Log.e(TAG,"onRestart");
278 // class StreamTask AsyncTask
279 private class StreamTask extends AsyncTask<Void, Void, Void>{
282 StreamTask(byte[] data){
287 protected Void doInBackground(Void... params) {
289 if (this.data != null){
290 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
291 ffmpeg.process(this.data);
297 // SurfaceHolder.Callback implementation
299 public void surfaceCreated(final SurfaceHolder holder){
300 Log.e(TAG,"SurfacedCreated");
302 mCamera.setPreviewDisplay(holder);
303 mCamera.startPreview();
304 } catch (IOException e) {
305 Log.d(TAG, "Error setting camera preview: " + e.getMessage());
310 public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
311 Log.e(TAG, "surfaceChanged");
312 //if(mCamera==null) return;
313 //Camera.Parameters parameters=mCamera.getParameters();
314 //parameters.setPreviewSize(640,480);
315 //parameters.setPictureSize(640,480);
316 //mCamera.setParameters(parameters);
319 //Thread.sleep(10000);
320 /*Log.e(TAG, "xxxxxxxxxxxxxx");
321 mExecutor.execute(new Runnable() {
324 mCamera.startPreview();
325 final Button btn = findViewById(R.id.button);
326 Camera.Parameters params = mCamera.getParameters();
327 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
331 //btn.performClick();
332 //} catch (InterruptedException e){
333 // e.printStackTrace();
338 //Camera.Parameters params = mCamera.getParameters();
339 //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
340 /*Thread t = new Thread(new Runnable() {
343 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
351 public void surfaceDestroyed(SurfaceHolder holder){
352 Log.e(TAG, "surfaceDestroyed");
355 private long encodeCount = 0;
356 private long count = 0;
357 private long previewTime;
358 // Camera.PreviewCallback
360 public void onPreviewFrame(final byte[] data, Camera camera){
361 /*if (null != mStreamTask){
362 switch (mStreamTask.getStatus()){
364 Log.e(TAG, "onPreviewFrame Running");
367 Log.e(TAG,"OnPreviewFrame Pending");
368 mStreamTask.cancel(false);
372 mStreamTask = new StreamTask(data);
373 mStreamTask.execute((Void)null);*/
376 /*long endTime = System.currentTimeMillis();
377 mExecutor.execute(new Runnable() {
380 long encodeTime = System.currentTimeMillis();
381 ffmpeg.process(data);
382 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
385 Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
386 + (endTime - previewTime) + " " + Thread.currentThread().getName());
387 previewTime = endTime;*/
392 private boolean checkCameraHardware(Context context) {
393 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
396 private static Camera getCameraInstance(){
399 Log.e(TAG, "Open Camera");
401 Camera.Parameters params = c.getParameters();
402 Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
403 Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
404 List<int[]> fps = params.getSupportedPreviewFpsRange();
406 Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n");
411 Camera.Parameters parameters = c.getParameters();
413 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
414 for (Camera.Size cc : sizes){
415 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
417 Camera.Size cs = sizes.get(3);
418 //params.setPreviewSize(cs.width, cs.height);
419 params.setPictureSize(cs.width, cs.height);
420 //params.setPictureFormat(ImageFormat.NV21);
421 c.setParameters(params);
429 // private void changeCameraPermission(){
430 // Log.e(TAG, "change /dev/video0 permission");
432 // /*Process sh = Runtime.getRuntime().exec("su", null,null);
433 // OutputStream os = sh.getOutputStream();
434 // os.write(("chmod 666 /dev/video0").getBytes("ASCII"));
439 // Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
440 // sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"});
442 // } catch (Exception e){
443 // e.printStackTrace();
447 private void switchToBackground(){
448 Intent i = new Intent();
449 i.setAction(Intent.ACTION_MAIN);
450 i.addCategory(Intent.CATEGORY_HOME);
451 this.startActivity(i);