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");
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");
101 btn2.post(new Runnable(){
111 //SurfaceTexture st = new SurfaceTexture(0);
115 protected void onPause(){
117 Log.e(TAG, "OnPause");
123 protected void onResume() {
125 Log.e(TAG, "OnResume");
129 protected void onStop() {
135 protected void onStart(){
137 Log.e(TAG,"onStart");
141 protected void onDestroy(){
143 Log.e(TAG,"onDestroy");
147 protected void onRestart(){
149 Log.e(TAG,"onRestart");
152 // class StreamTask AsyncTask
153 private class StreamTask extends AsyncTask<Void, Void, Void>{
156 StreamTask(byte[] data){
161 protected Void doInBackground(Void... params) {
163 if (this.data != null){
164 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
165 ffmpeg.process(this.data);
171 // SurfaceHolder.Callback implementation
173 public void surfaceCreated(final SurfaceHolder holder){
174 Log.e(TAG,"SurfacedCreated");
176 mCamera.setPreviewDisplay(holder);
177 mCamera.startPreview();
178 } catch (IOException e) {
179 Log.d(TAG, "Error setting camera preview: " + e.getMessage());
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);
193 //Thread.sleep(10000);
194 /*Log.e(TAG, "xxxxxxxxxxxxxx");
195 mExecutor.execute(new Runnable() {
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);
205 //btn.performClick();
206 //} catch (InterruptedException e){
207 // e.printStackTrace();
212 //Camera.Parameters params = mCamera.getParameters();
213 //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
214 /*Thread t = new Thread(new Runnable() {
217 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
225 public void surfaceDestroyed(SurfaceHolder holder){
226 Log.e(TAG, "surfaceDestroyed");
229 private long encodeCount = 0;
230 private long count = 0;
231 private long previewTime;
232 // Camera.PreviewCallback
234 public void onPreviewFrame(final byte[] data, Camera camera){
235 /*if (null != mStreamTask){
236 switch (mStreamTask.getStatus()){
238 Log.e(TAG, "onPreviewFrame Running");
241 Log.e(TAG,"OnPreviewFrame Pending");
242 mStreamTask.cancel(false);
246 mStreamTask = new StreamTask(data);
247 mStreamTask.execute((Void)null);*/
250 /*long endTime = System.currentTimeMillis();
251 mExecutor.execute(new Runnable() {
254 long encodeTime = System.currentTimeMillis();
255 ffmpeg.process(data);
256 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
259 Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
260 + (endTime - previewTime) + " " + Thread.currentThread().getName());
261 previewTime = endTime;*/
266 private boolean checkCameraHardware(Context context) {
267 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
270 private static Camera getCameraInstance(){
273 Log.e(TAG, "Open Camera");
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();
280 Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n");
285 Camera.Parameters parameters = c.getParameters();
287 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
288 for (Camera.Size cc : sizes){
289 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
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);