4080ee2525361d270e46cd3a2e48c7406cb44417
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / MainActivity.java
1 package ai.suanzi.rtmpclient;
2
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;
24
25 import java.io.File;
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;
37
38 import de.mindpipe.android.logging.log4j.LogConfigurator;
39 import org.apache.log4j.Level;
40 import org.apache.log4j.Logger;
41
42 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
43
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();
52
53     private UsbManager usbManager;
54     private UsbDevice usbCamera;
55
56     private Logger gLogger;
57     private void configLog(){
58         try {
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){
70             e.printStackTrace();
71         }
72     }
73
74
75
76
77
78     @Override
79     protected void onCreate(Bundle savedInstanceState) {
80         super.onCreate(savedInstanceState);
81         setContentView(R.layout.activity_main);
82         configLog();
83         //Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
84
85         gLogger.debug("#######################################");
86         ffmpeg = Ffmpeg.getInstance();
87
88         gLogger.debug(" this ia argument " + 3 + "fjeiofjei");
89
90         final Button btn = findViewById(R.id.button);
91         btn.setText("Start");
92         /*btn.setOnClickListener(new View.OnClickListener() {
93             @Override
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);
104
105
106
107
108                     ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
109                 } else {
110                     mCamera.setPreviewCallback(null);
111                     Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
112                     ffmpeg.flush();
113                     ffmpeg.close();
114                 }
115                 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
116             }
117         });*/
118
119         /*this.mCamera = getCameraInstance();
120         if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
121 */
122         final SurfaceView surfaceView = findViewById(R.id.surfaceView);
123         mHolder = surfaceView.getHolder();
124         mHolder.addCallback(this);
125
126         intent.setPackage(this.getPackageName());
127         intent.setAction("ai.suanzi.rtmpclient.service");
128
129
130         final Button btn2 = findViewById(R.id.button);
131
132
133         btn2.setOnClickListener(new View.OnClickListener(){
134             @Override
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);
142                 ffmpeg.getVersion();
143             }
144
145         });
146
147         /*btn2.post(new Runnable(){
148             @Override
149             public void run() {
150                 btn2.performClick();
151
152             }
153         });
154
155         switchToBackground();*/
156 /*
157
158         usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
159
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);
164
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);
171
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());
176
177             if (device.getVendorId() == 6257){
178                 usbManager.requestPermission(device, mPermissionIntent);
179
180                 usbCamera = device;
181             }
182
183             //Log.e(TAG, device.)
184             //device.getInterface()
185         }
186
187 */
188
189
190
191     }
192
193     //SurfaceTexture st = new SurfaceTexture(0);
194
195     private static final String ACTION_USB_PERMISSION =
196             "com.android.example.USB_PERMISSION";
197     private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
198
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);
204
205                     if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
206                         if(device != null){
207                             Log.e(TAG, "extra permission granted");
208                             //call method to set up device communication
209
210
211                             new Thread(new Runnable() {
212                                 @Override
213                                 public void run() {
214                                     Log.e("device","MyThread3");//bhw
215                                     UsbDeviceConnection connection = usbManager.openDevice(usbCamera);
216                                     int fd = connection.getFileDescriptor();//获取文件描述符
217                                     ffmpeg.test(fd);
218                                     Log.e("device","MyThread3  "+fd);
219                                 }
220                             }).start();
221
222                         }
223                     }
224                     else {
225                         Log.e(TAG, "permission denied for device. " + device);
226                     }
227                 }
228             } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
229                 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
230                 if (device != null){
231                     Log.e(TAG, "==== device out");
232                 }
233             } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
234                 Log.e(TAG, "==== device in =====");
235             }
236         }
237     };
238
239
240
241
242     @Override
243     protected void onPause(){
244         super.onPause();
245         Log.e(TAG, "OnPause");
246     }
247
248     @Override
249     protected void onResume() {
250         super.onResume();
251         Log.e(TAG, "OnResume");
252     }
253
254     @Override
255     protected void onStop() {
256         super.onStop();
257         Log.e(TAG,"onStop");
258     }
259
260     @Override
261     protected void onStart(){
262         super.onStart();
263         Log.e(TAG,"onStart");
264     }
265
266     @Override
267     protected void onDestroy(){
268         super.onDestroy();
269         Log.e(TAG,"onDestroy");
270     }
271
272     @Override
273     protected void onRestart(){
274         super.onStart();
275         Log.e(TAG,"onRestart");
276     }
277
278     // class StreamTask AsyncTask
279     private class StreamTask extends AsyncTask<Void, Void, Void>{
280         private byte[] data;
281
282         StreamTask(byte[] data){
283             this.data = data;
284         }
285
286         @Override
287         protected Void doInBackground(Void... params) {
288
289             if (this.data != null){
290                 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
291                 ffmpeg.process(this.data);
292             }
293             return null;
294         }
295     }
296
297     // SurfaceHolder.Callback implementation
298     @Override
299     public void surfaceCreated(final SurfaceHolder holder){
300         Log.e(TAG,"SurfacedCreated");
301         /*try {
302             mCamera.setPreviewDisplay(holder);
303             mCamera.startPreview();
304         } catch (IOException e) {
305             Log.d(TAG, "Error setting camera preview: " + e.getMessage());
306         }*/
307     }
308
309     @Override
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);
317
318         //try{
319             //Thread.sleep(10000);
320             /*Log.e(TAG, "xxxxxxxxxxxxxx");
321             mExecutor.execute(new Runnable() {
322                 @Override
323                 public void run() {
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);
328                 }
329             });*/
330
331             //btn.performClick();
332         //} catch (InterruptedException e){
333          //   e.printStackTrace();
334         //}
335
336
337
338         //Camera.Parameters params = mCamera.getParameters();
339         //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
340         /*Thread t = new Thread(new Runnable() {
341             @Override
342             public void run() {
343                 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
344
345             }
346         });*/
347
348     }
349
350     @Override
351     public void surfaceDestroyed(SurfaceHolder holder){
352         Log.e(TAG, "surfaceDestroyed");
353     }
354
355     private long encodeCount = 0;
356     private long count = 0;
357     private long previewTime;
358     // Camera.PreviewCallback
359     @Override
360     public void  onPreviewFrame(final byte[] data, Camera camera){
361         /*if (null != mStreamTask){
362             switch (mStreamTask.getStatus()){
363                 case RUNNING:
364                     Log.e(TAG, "onPreviewFrame Running");
365                     return;
366                 case PENDING:
367                     Log.e(TAG,"OnPreviewFrame Pending");
368                     mStreamTask.cancel(false);
369                     break;
370             }
371         }
372         mStreamTask = new StreamTask(data);
373         mStreamTask.execute((Void)null);*/
374
375
376         /*long endTime = System.currentTimeMillis();
377         mExecutor.execute(new Runnable() {
378             @Override
379             public void run() {
380                 long encodeTime = System.currentTimeMillis();
381                 ffmpeg.process(data);
382                 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
383             }
384         });
385         Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
386                 + (endTime - previewTime) + "  " + Thread.currentThread().getName());
387         previewTime = endTime;*/
388
389     }
390
391     // private
392     private boolean checkCameraHardware(Context context) {
393         return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
394     }
395
396     private static Camera getCameraInstance(){
397         Camera c = null;
398         try {
399             Log.e(TAG, "Open Camera");
400             c = Camera.open(0);
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();
405             for(int[] i : fps){
406                 Log.e(TAG, "###  fps range : [" + i[0] + "," + i[1] + "]\n");
407             }
408
409
410
411             Camera.Parameters parameters = c.getParameters();
412
413             List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
414             for (Camera.Size cc : sizes){
415                 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
416             }
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);
422         }
423         catch (Exception e){
424             e.printStackTrace();
425         }
426         return c;
427     }
428
429 //    private void changeCameraPermission(){
430 //        Log.e(TAG, "change /dev/video0 permission");
431 //        try{
432 //            /*Process sh = Runtime.getRuntime().exec("su", null,null);
433 //            OutputStream  os = sh.getOutputStream();
434 //            os.write(("chmod 666 /dev/video0").getBytes("ASCII"));
435 //            os.flush();
436 //            os.close();
437 //            sh.waitFor();*/
438 //
439 //            Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
440 //            sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"});
441 //            sh.waitFor();
442 //        } catch (Exception e){
443 //            e.printStackTrace();
444 //        }
445 //    }
446
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);
452     }
453
454 }