1 package ai.suanzi.rtmpclient;
3 import android.app.Activity;
4 import android.graphics.ImageFormat;
5 import android.graphics.SurfaceTexture;
6 import android.support.v7.app.AppCompatActivity;
7 import android.os.Bundle;
8 import android.util.Log;
9 import android.view.SurfaceHolder;
10 import android.hardware.Camera;
11 import android.view.SurfaceView;
12 import android.view.View;
13 import android.widget.Button;
14 import android.widget.Toast;
15 import android.content.Context;
16 import android.content.pm.PackageManager;
17 import android.os.AsyncTask;
18 import java.util.List;
19 import java.io.IOException;
20 import java.util.concurrent.Executor;
21 import java.util.concurrent.ExecutorService;
22 import java.util.concurrent.Executors;
23 import android.content.Intent;
24 import java.io.OutputStream;
28 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
30 private static final String TAG = "PENG";
31 private Ffmpeg ffmpeg = new Ffmpeg();
32 private Camera mCamera ;//= getCameraInstance();
33 private StreamTask mStreamTask;
34 private SurfaceHolder mHolder;
35 ExecutorService mExecutor = Executors.newSingleThreadExecutor();
36 //Intent it = new Intent(getApplicationContext(), MyService.class);
37 Intent intent = new Intent();
41 protected void onCreate(Bundle savedInstanceState) {
42 super.onCreate(savedInstanceState);
43 setContentView(R.layout.activity_main);
44 Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
46 final Button btn = findViewById(R.id.button);
48 /*btn.setOnClickListener(new View.OnClickListener() {
50 public void onClick(View v) {
51 Log.e(TAG, "Button " + btn.getText() + " onClick");
52 if (mCamera == null) return;
53 if(btn.getText().equals("Start")){
54 mCamera.startPreview();
55 Camera.Parameters params = mCamera.getParameters();
56 //params.setPreviewFpsRange(30000, 30000);
57 //params.setPictureSize(320, 240);
58 //params.setPictureFormat(ImageFormat.NV21);
59 //mCamera.setParameters(params);
64 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
66 mCamera.setPreviewCallback(null);
67 Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
71 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
75 /*this.mCamera = getCameraInstance();
76 if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
78 final SurfaceView surfaceView = findViewById(R.id.surfaceView);
79 mHolder = surfaceView.getHolder();
80 mHolder.addCallback(this);
82 intent.setPackage(this.getPackageName());
83 intent.setAction("ai.suanzi.rtmpclient.service");
86 final Button btn2 = findViewById(R.id.button);
89 btn2.setOnClickListener(new View.OnClickListener(){
91 public void onClick(View view){
92 Log.e(TAG, "onclick2");
93 //ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv");
94 //ffmpeg.push(mHolder.getSurface());
95 //ffmpeg.preview(mHolder.getSurface());
96 // intent.putExtra("cmd",0);//0,开启前台服务,1,关闭前台服务
102 btn2.post(new Runnable(){
110 switchToBackground();
113 //SurfaceTexture st = new SurfaceTexture(0);
117 protected void onPause(){
119 Log.e(TAG, "OnPause");
125 protected void onResume() {
127 Log.e(TAG, "OnResume");
131 protected void onStop() {
137 protected void onStart(){
139 Log.e(TAG,"onStart");
143 protected void onDestroy(){
145 Log.e(TAG,"onDestroy");
149 protected void onRestart(){
151 Log.e(TAG,"onRestart");
154 // class StreamTask AsyncTask
155 private class StreamTask extends AsyncTask<Void, Void, Void>{
158 StreamTask(byte[] data){
163 protected Void doInBackground(Void... params) {
165 if (this.data != null){
166 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
167 ffmpeg.process(this.data);
173 // SurfaceHolder.Callback implementation
175 public void surfaceCreated(final SurfaceHolder holder){
176 Log.e(TAG,"SurfacedCreated");
178 mCamera.setPreviewDisplay(holder);
179 mCamera.startPreview();
180 } catch (IOException e) {
181 Log.d(TAG, "Error setting camera preview: " + e.getMessage());
186 public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
187 Log.e(TAG, "surfaceChanged");
188 //if(mCamera==null) return;
189 //Camera.Parameters parameters=mCamera.getParameters();
190 //parameters.setPreviewSize(640,480);
191 //parameters.setPictureSize(640,480);
192 //mCamera.setParameters(parameters);
195 //Thread.sleep(10000);
196 /*Log.e(TAG, "xxxxxxxxxxxxxx");
197 mExecutor.execute(new Runnable() {
200 mCamera.startPreview();
201 final Button btn = findViewById(R.id.button);
202 Camera.Parameters params = mCamera.getParameters();
203 ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
207 //btn.performClick();
208 //} catch (InterruptedException e){
209 // e.printStackTrace();
214 //Camera.Parameters params = mCamera.getParameters();
215 //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
216 /*Thread t = new Thread(new Runnable() {
219 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
227 public void surfaceDestroyed(SurfaceHolder holder){
228 Log.e(TAG, "surfaceDestroyed");
231 private long encodeCount = 0;
232 private long count = 0;
233 private long previewTime;
234 // Camera.PreviewCallback
236 public void onPreviewFrame(final byte[] data, Camera camera){
237 /*if (null != mStreamTask){
238 switch (mStreamTask.getStatus()){
240 Log.e(TAG, "onPreviewFrame Running");
243 Log.e(TAG,"OnPreviewFrame Pending");
244 mStreamTask.cancel(false);
248 mStreamTask = new StreamTask(data);
249 mStreamTask.execute((Void)null);*/
252 /*long endTime = System.currentTimeMillis();
253 mExecutor.execute(new Runnable() {
256 long encodeTime = System.currentTimeMillis();
257 ffmpeg.process(data);
258 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
261 Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
262 + (endTime - previewTime) + " " + Thread.currentThread().getName());
263 previewTime = endTime;*/
268 private boolean checkCameraHardware(Context context) {
269 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
272 private static Camera getCameraInstance(){
275 Log.e(TAG, "Open Camera");
277 Camera.Parameters params = c.getParameters();
278 Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
279 Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
280 List<int[]> fps = params.getSupportedPreviewFpsRange();
282 Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n");
287 Camera.Parameters parameters = c.getParameters();
289 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
290 for (Camera.Size cc : sizes){
291 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
293 Camera.Size cs = sizes.get(3);
294 //params.setPreviewSize(cs.width, cs.height);
295 params.setPictureSize(cs.width, cs.height);
296 //params.setPictureFormat(ImageFormat.NV21);
297 c.setParameters(params);
305 private void changeCameraPermission(){
306 Log.e(TAG, "change /dev/video0 permission");
308 /*Process sh = Runtime.getRuntime().exec("su", null,null);
309 OutputStream os = sh.getOutputStream();
310 os.write(("chmod 666 /dev/video0").getBytes("ASCII"));
315 Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
316 sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"});
318 } catch (Exception e){
323 private void switchToBackground(){
324 Intent i = new Intent();
325 i.setAction(Intent.ACTION_MAIN);
326 i.addCategory(Intent.CATEGORY_HOME);
327 this.startActivity(i);