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.Executor;
20 import java.util.concurrent.ExecutorService;
21 import java.util.concurrent.Executors;
25 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
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();
35 protected void onCreate(Bundle savedInstanceState) {
36 super.onCreate(savedInstanceState);
37 setContentView(R.layout.activity_main);
38 Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
40 final Button btn = findViewById(R.id.button);
42 btn.setOnClickListener(new View.OnClickListener() {
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);
58 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
60 mCamera.setPreviewCallback(null);
61 Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
65 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
69 /*this.mCamera = getCameraInstance();
70 if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
72 final SurfaceView surfaceView = findViewById(R.id.surfaceView);
73 mHolder = surfaceView.getHolder();
74 mHolder.addCallback(this);
77 //mCamera.setPreviewCallback(this);
80 mCamera.setPreviewTexture(st);
81 }catch (IOException e){
85 final Button btn2 = findViewById(R.id.button2);
86 btn2.setOnClickListener(new View.OnClickListener(){
88 public void onClick(View view){
89 Log.e(TAG, "onclick2");
90 //ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv");
91 ffmpeg.push(mHolder.getSurface());
97 Log.e(TAG, "onclick2");
98 //ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
99 //ffmpeg.play(mHolder.getSurface(),"/data/local/tmp/big_buck_bunny_720p_10mb.mp4");
102 btn2.post(new Runnable(){
112 //SurfaceTexture st = new SurfaceTexture(0);
116 protected void onPause(){
118 Log.e(TAG, "OnPause");
124 protected void onResume() {
126 Log.e(TAG, "OnResume");
130 protected void onStop() {
136 protected void onStart(){
138 Log.e(TAG,"onStart");
142 protected void onDestroy(){
144 Log.e(TAG,"onDestroy");
148 protected void onRestart(){
150 Log.e(TAG,"onRestart");
153 // class StreamTask AsyncTask
154 private class StreamTask extends AsyncTask<Void, Void, Void>{
157 StreamTask(byte[] data){
162 protected Void doInBackground(Void... params) {
164 if (this.data != null){
165 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
166 ffmpeg.process(this.data);
172 // SurfaceHolder.Callback implementation
174 public void surfaceCreated(final SurfaceHolder holder){
175 Log.e(TAG,"SurfacedCreated");
177 mCamera.setPreviewDisplay(holder);
178 mCamera.startPreview();
179 } catch (IOException e) {
180 Log.d(TAG, "Error setting camera preview: " + e.getMessage());
185 public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
186 Log.e(TAG, "surfaceChanged");
187 //if(mCamera==null) return;
188 //Camera.Parameters parameters=mCamera.getParameters();
189 //parameters.setPreviewSize(640,480);
190 //parameters.setPictureSize(640,480);
191 //mCamera.setParameters(parameters);
194 //Thread.sleep(10000);
195 /*Log.e(TAG, "xxxxxxxxxxxxxx");
196 mExecutor.execute(new Runnable() {
199 mCamera.startPreview();
200 final Button btn = findViewById(R.id.button);
201 Camera.Parameters params = mCamera.getParameters();
202 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
206 //btn.performClick();
207 //} catch (InterruptedException e){
208 // e.printStackTrace();
213 //Camera.Parameters params = mCamera.getParameters();
214 //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
215 /*Thread t = new Thread(new Runnable() {
218 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
226 public void surfaceDestroyed(SurfaceHolder holder){
227 Log.e(TAG, "surfaceDestroyed");
230 private long encodeCount = 0;
231 private long count = 0;
232 private long previewTime;
233 // Camera.PreviewCallback
235 public void onPreviewFrame(final byte[] data, Camera camera){
236 /*if (null != mStreamTask){
237 switch (mStreamTask.getStatus()){
239 Log.e(TAG, "onPreviewFrame Running");
242 Log.e(TAG,"OnPreviewFrame Pending");
243 mStreamTask.cancel(false);
247 mStreamTask = new StreamTask(data);
248 mStreamTask.execute((Void)null);*/
251 /*long endTime = System.currentTimeMillis();
252 mExecutor.execute(new Runnable() {
255 long encodeTime = System.currentTimeMillis();
256 ffmpeg.process(data);
257 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
260 Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
261 + (endTime - previewTime) + " " + Thread.currentThread().getName());
262 previewTime = endTime;*/
267 private boolean checkCameraHardware(Context context) {
268 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
271 private static Camera getCameraInstance(){
274 Log.e(TAG, "Open Camera");
276 Camera.Parameters params = c.getParameters();
277 Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
278 Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
279 List<int[]> fps = params.getSupportedPreviewFpsRange();
281 Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n");
286 Camera.Parameters parameters = c.getParameters();
288 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
289 for (Camera.Size cc : sizes){
290 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
292 Camera.Size cs = sizes.get(3);
293 //params.setPreviewSize(cs.width, cs.height);
294 params.setPictureSize(cs.width, cs.height);
295 //params.setPictureFormat(ImageFormat.NV21);
296 c.setParameters(params);