1 package ai.suanzi.rtmpclient;
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.ExecutorService;
20 import java.util.concurrent.Executors;
24 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
26 private static final String TAG = "PENG";
27 private Ffmpeg ffmpeg = new Ffmpeg();
28 private Camera mCamera ;//= getCameraInstance();
29 private StreamTask mStreamTask;
30 private SurfaceHolder mHolder;
31 ExecutorService mExecutor = Executors.newSingleThreadExecutor();
34 protected void onCreate(Bundle savedInstanceState) {
35 super.onCreate(savedInstanceState);
36 setContentView(R.layout.activity_main);
37 Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
39 final Button btn = findViewById(R.id.button);
41 btn.setOnClickListener(new View.OnClickListener() {
43 public void onClick(View v) {
44 Log.e(TAG, "Button " + btn.getText() + " onClick");
45 if (mCamera == null) return;
46 if(btn.getText().equals("Start")){
47 mCamera.startPreview();
48 Camera.Parameters params = mCamera.getParameters();
49 //params.setPreviewFpsRange(30000, 30000);
50 //params.setPictureSize(320, 240);
51 //params.setPictureFormat(ImageFormat.NV21);
52 //mCamera.setParameters(params);
57 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
59 mCamera.setPreviewCallback(null);
60 Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
64 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
68 this.mCamera = getCameraInstance();
69 if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
71 final SurfaceView surfaceView = findViewById(R.id.surfaceView);
72 mHolder = surfaceView.getHolder();
73 mHolder.addCallback(this);
76 mCamera.setPreviewCallback(this);
79 mCamera.setPreviewTexture(st);
80 }catch (IOException e){
86 SurfaceTexture st = new SurfaceTexture(0);
90 protected void onPause(){
92 Log.e(TAG, "OnPause");
98 protected void onResume() {
100 Log.e(TAG, "OnResume");
104 protected void onStop() {
110 protected void onStart(){
112 Log.e(TAG,"onStart");
116 protected void onDestroy(){
118 Log.e(TAG,"onDestroy");
122 protected void onRestart(){
124 Log.e(TAG,"onRestart");
127 // class StreamTask AsyncTask
128 private class StreamTask extends AsyncTask<Void, Void, Void>{
131 StreamTask(byte[] data){
136 protected Void doInBackground(Void... params) {
138 if (this.data != null){
139 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
140 ffmpeg.process(this.data);
146 // SurfaceHolder.Callback implementation
148 public void surfaceCreated(final SurfaceHolder holder){
149 Log.e(TAG,"SurfacedCreated");
151 mCamera.setPreviewDisplay(holder);
152 //mCamera.startPreview();
153 } catch (IOException e) {
154 Log.d(TAG, "Error setting camera preview: " + e.getMessage());
159 public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
160 Log.e(TAG, "surfaceChanged");
161 //if(mCamera==null) return;
162 //Camera.Parameters parameters=mCamera.getParameters();
163 //parameters.setPreviewSize(640,480);
164 //parameters.setPictureSize(640,480);
165 //mCamera.setParameters(parameters);
169 public void surfaceDestroyed(SurfaceHolder holder){
170 Log.e(TAG, "surfaceDestroyed");
173 private long encodeCount = 0;
174 private long count = 0;
175 private long previewTime;
176 // Camera.PreviewCallback
178 public void onPreviewFrame(final byte[] data, Camera camera){
179 /*if (null != mStreamTask){
180 switch (mStreamTask.getStatus()){
182 Log.e(TAG, "onPreviewFrame Running");
185 Log.e(TAG,"OnPreviewFrame Pending");
186 mStreamTask.cancel(false);
190 mStreamTask = new StreamTask(data);
191 mStreamTask.execute((Void)null);*/
194 long endTime = System.currentTimeMillis();
195 mExecutor.execute(new Runnable() {
198 long encodeTime = System.currentTimeMillis();
199 ffmpeg.process(data);
200 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
203 Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
204 + (endTime - previewTime) + " " + Thread.currentThread().getName());
205 previewTime = endTime;
210 private boolean checkCameraHardware(Context context) {
211 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
214 private static Camera getCameraInstance(){
217 Log.e(TAG, "Open Camera");
219 Camera.Parameters params = c.getParameters();
220 Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
221 // NV21 : 17, JPEG 256
222 Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
223 List<int[]> fps = params.getSupportedPreviewFpsRange();
225 Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n");
230 Camera.Parameters parameters = c.getParameters();
231 //List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
232 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
233 for (Camera.Size cc : sizes){
234 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
236 Camera.Size cs = sizes.get(3);
237 params.setPreviewSize(cs.width, cs.height);
238 params.setPictureSize(cs.width, cs.height);
239 params.setPictureFormat(ImageFormat.NV21);
240 c.setParameters(params);