Preview usb camera
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / MainActivity.java
1 package ai.suanzi.rtmpclient;
2
3 import android.graphics.ImageFormat;
4 import android.graphics.SurfaceTexture;
5 import android.support.v7.app.AppCompatActivity;
6 import android.os.Bundle;
7 import android.util.Log;
8 import android.view.SurfaceHolder;
9 import android.hardware.Camera;
10 import android.view.SurfaceView;
11 import android.view.View;
12 import android.widget.Button;
13 import android.widget.Toast;
14 import android.content.Context;
15 import android.content.pm.PackageManager;
16 import android.os.AsyncTask;
17 import java.util.List;
18 import java.io.IOException;
19 import java.util.concurrent.Executor;
20 import java.util.concurrent.ExecutorService;
21 import java.util.concurrent.Executors;
22
23
24
25 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
26
27     private static final String TAG = "PENG";
28     private Ffmpeg ffmpeg = new Ffmpeg();
29     private Camera mCamera ;//= getCameraInstance();
30     private StreamTask mStreamTask;
31     private SurfaceHolder mHolder;
32     ExecutorService mExecutor = Executors.newSingleThreadExecutor();
33
34     @Override
35     protected void onCreate(Bundle savedInstanceState) {
36         super.onCreate(savedInstanceState);
37         setContentView(R.layout.activity_main);
38         Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
39
40         final Button btn = findViewById(R.id.button);
41         btn.setText("Start");
42         btn.setOnClickListener(new View.OnClickListener() {
43             @Override
44             public void onClick(View v) {
45                 Log.e(TAG, "Button " + btn.getText() + " onClick");
46                 if (mCamera == null) return;
47                 if(btn.getText().equals("Start")){
48                     mCamera.startPreview();
49                     Camera.Parameters params = mCamera.getParameters();
50                     //params.setPreviewFpsRange(30000, 30000);
51                     //params.setPictureSize(320, 240);
52                     //params.setPictureFormat(ImageFormat.NV21);
53                     //mCamera.setParameters(params);
54
55
56
57
58                     ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
59                 } else {
60                     mCamera.setPreviewCallback(null);
61                     Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
62                     ffmpeg.flush();
63                     ffmpeg.close();
64                 }
65                 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
66             }
67         });
68
69         /*this.mCamera = getCameraInstance();
70         if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
71 */
72         final SurfaceView surfaceView = findViewById(R.id.surfaceView);
73         mHolder = surfaceView.getHolder();
74         mHolder.addCallback(this);
75
76         //
77         //mCamera.setPreviewCallback(this);
78
79         /*try{
80             mCamera.setPreviewTexture(st);
81         }catch (IOException e){
82             e.printStackTrace();
83         }*/
84
85         final Button btn2 = findViewById(R.id.button2);
86         btn2.setOnClickListener(new View.OnClickListener(){
87             @Override
88             public void onClick(View view){
89                 Log.e(TAG, "onclick2");
90                 ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv");
91
92             }
93
94         });
95
96         Log.e(TAG, "onclick2");
97         //ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
98         //ffmpeg.play(mHolder.getSurface(),"/data/local/tmp/big_buck_bunny_720p_10mb.mp4");
99
100
101         btn2.post(new Runnable(){
102             @Override
103             public void run() {
104                 btn2.performClick();
105             }
106         });
107
108
109     }
110
111     //SurfaceTexture st = new SurfaceTexture(0);
112
113
114     @Override
115     protected void onPause(){
116         super.onPause();
117         Log.e(TAG, "OnPause");
118         //ffmpeg.flush();
119         //ffmpeg.close();
120     }
121
122     @Override
123     protected void onResume() {
124         super.onResume();
125         Log.e(TAG, "OnResume");
126     }
127
128     @Override
129     protected void onStop() {
130         super.onStop();
131         Log.e(TAG,"onStop");
132     }
133
134     @Override
135     protected void onStart(){
136         super.onStart();
137         Log.e(TAG,"onStart");
138     }
139
140     @Override
141     protected void onDestroy(){
142         super.onDestroy();
143         Log.e(TAG,"onDestroy");
144     }
145
146     @Override
147     protected void onRestart(){
148         super.onStart();
149         Log.e(TAG,"onRestart");
150     }
151
152     // class StreamTask AsyncTask
153     private class StreamTask extends AsyncTask<Void, Void, Void>{
154         private byte[] data;
155
156         StreamTask(byte[] data){
157             this.data = data;
158         }
159
160         @Override
161         protected Void doInBackground(Void... params) {
162
163             if (this.data != null){
164                 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
165                 ffmpeg.process(this.data);
166             }
167             return null;
168         }
169     }
170
171     // SurfaceHolder.Callback implementation
172     @Override
173     public void surfaceCreated(final SurfaceHolder holder){
174         Log.e(TAG,"SurfacedCreated");
175         /*try {
176             mCamera.setPreviewDisplay(holder);
177             mCamera.startPreview();
178         } catch (IOException e) {
179             Log.d(TAG, "Error setting camera preview: " + e.getMessage());
180         }*/
181     }
182
183     @Override
184     public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
185         Log.e(TAG, "surfaceChanged");
186         //if(mCamera==null) return;
187         //Camera.Parameters parameters=mCamera.getParameters();
188         //parameters.setPreviewSize(640,480);
189         //parameters.setPictureSize(640,480);
190         //mCamera.setParameters(parameters);
191
192         //try{
193             //Thread.sleep(10000);
194             /*Log.e(TAG, "xxxxxxxxxxxxxx");
195             mExecutor.execute(new Runnable() {
196                 @Override
197                 public void run() {
198                     mCamera.startPreview();
199                     final Button btn = findViewById(R.id.button);
200                     Camera.Parameters params = mCamera.getParameters();
201                     ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
202                 }
203             });*/
204
205             //btn.performClick();
206         //} catch (InterruptedException e){
207          //   e.printStackTrace();
208         //}
209
210
211
212         //Camera.Parameters params = mCamera.getParameters();
213         //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
214         /*Thread t = new Thread(new Runnable() {
215             @Override
216             public void run() {
217                 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
218
219             }
220         });*/
221
222     }
223
224     @Override
225     public void surfaceDestroyed(SurfaceHolder holder){
226         Log.e(TAG, "surfaceDestroyed");
227     }
228
229     private long encodeCount = 0;
230     private long count = 0;
231     private long previewTime;
232     // Camera.PreviewCallback
233     @Override
234     public void  onPreviewFrame(final byte[] data, Camera camera){
235         /*if (null != mStreamTask){
236             switch (mStreamTask.getStatus()){
237                 case RUNNING:
238                     Log.e(TAG, "onPreviewFrame Running");
239                     return;
240                 case PENDING:
241                     Log.e(TAG,"OnPreviewFrame Pending");
242                     mStreamTask.cancel(false);
243                     break;
244             }
245         }
246         mStreamTask = new StreamTask(data);
247         mStreamTask.execute((Void)null);*/
248
249
250         /*long endTime = System.currentTimeMillis();
251         mExecutor.execute(new Runnable() {
252             @Override
253             public void run() {
254                 long encodeTime = System.currentTimeMillis();
255                 ffmpeg.process(data);
256                 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
257             }
258         });
259         Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
260                 + (endTime - previewTime) + "  " + Thread.currentThread().getName());
261         previewTime = endTime;*/
262
263     }
264
265     // private
266     private boolean checkCameraHardware(Context context) {
267         return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
268     }
269
270     private static Camera getCameraInstance(){
271         Camera c = null;
272         try {
273             Log.e(TAG, "Open Camera");
274             c = Camera.open(0);
275             Camera.Parameters params = c.getParameters();
276             Log.e(TAG, "Camera parameters:  " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
277             Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
278             List<int[]> fps = params.getSupportedPreviewFpsRange();
279             for(int[] i : fps){
280                 Log.e(TAG, "###  fps range : [" + i[0] + "," + i[1] + "]\n");
281             }
282
283
284
285             Camera.Parameters parameters = c.getParameters();
286
287             List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
288             for (Camera.Size cc : sizes){
289                 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
290             }
291             Camera.Size cs = sizes.get(3);
292             //params.setPreviewSize(cs.width, cs.height);
293             params.setPictureSize(cs.width, cs.height);
294             //params.setPictureFormat(ImageFormat.NV21);
295             c.setParameters(params);
296         }
297         catch (Exception e){
298             e.printStackTrace();
299         }
300         return c;
301     }
302
303 }