X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fai%2Fsuanzi%2Frtmpclient%2FMainActivity.java;h=abef9c8fb756addc7893ade8f7786bebf794be1b;hb=6d410bf5e67288660c675d0aa76891eb8367e7cc;hp=31fcbf30cbff3899c687698a98c59e9765e0fb3c;hpb=214619593e74f6a04fa25f3614a99cf6b9704da5;p=rtmpclient.git diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java index 31fcbf3..abef9c8 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -1,18 +1,303 @@ package ai.suanzi.rtmpclient; +import android.graphics.ImageFormat; +import android.graphics.SurfaceTexture; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; +import android.view.SurfaceHolder; +import android.hardware.Camera; +import android.view.SurfaceView; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import java.util.List; +import java.io.IOException; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; -public class MainActivity extends AppCompatActivity { + + +public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{ private static final String TAG = "PENG"; private Ffmpeg ffmpeg = new Ffmpeg(); + private Camera mCamera ;//= getCameraInstance(); + private StreamTask mStreamTask; + private SurfaceHolder mHolder; + ExecutorService mExecutor = Executors.newSingleThreadExecutor(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion()); + + final Button btn = findViewById(R.id.button); + btn.setText("Start"); + btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.e(TAG, "Button " + btn.getText() + " onClick"); + if (mCamera == null) return; + if(btn.getText().equals("Start")){ + mCamera.startPreview(); + Camera.Parameters params = mCamera.getParameters(); + //params.setPreviewFpsRange(30000, 30000); + //params.setPictureSize(320, 240); + //params.setPictureFormat(ImageFormat.NV21); + //mCamera.setParameters(params); + + + + + ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + } else { + mCamera.setPreviewCallback(null); + Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show(); + ffmpeg.flush(); + ffmpeg.close(); + } + btn.setText(btn.getText().equals("Start") ? "Stop" : "Start"); + } + }); + + /*this.mCamera = getCameraInstance(); + if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras()); +*/ + final SurfaceView surfaceView = findViewById(R.id.surfaceView); + mHolder = surfaceView.getHolder(); + mHolder.addCallback(this); + + // + //mCamera.setPreviewCallback(this); + + /*try{ + mCamera.setPreviewTexture(st); + }catch (IOException e){ + e.printStackTrace(); + }*/ + + final Button btn2 = findViewById(R.id.button2); + btn2.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View view){ + Log.e(TAG, "onclick2"); + ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv"); + + } + + }); + + Log.e(TAG, "onclick2"); + //ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv"); + //ffmpeg.play(mHolder.getSurface(),"/data/local/tmp/big_buck_bunny_720p_10mb.mp4"); + + + btn2.post(new Runnable(){ + @Override + public void run() { + btn2.performClick(); + } + }); + + + } + + //SurfaceTexture st = new SurfaceTexture(0); + + + @Override + protected void onPause(){ + super.onPause(); + Log.e(TAG, "OnPause"); + //ffmpeg.flush(); + //ffmpeg.close(); + } + + @Override + protected void onResume() { + super.onResume(); + Log.e(TAG, "OnResume"); + } + + @Override + protected void onStop() { + super.onStop(); + Log.e(TAG,"onStop"); + } + + @Override + protected void onStart(){ + super.onStart(); + Log.e(TAG,"onStart"); + } + + @Override + protected void onDestroy(){ + super.onDestroy(); + Log.e(TAG,"onDestroy"); + } + + @Override + protected void onRestart(){ + super.onStart(); + Log.e(TAG,"onRestart"); + } + + // class StreamTask AsyncTask + private class StreamTask extends AsyncTask{ + private byte[] data; + + StreamTask(byte[] data){ + this.data = data; + } + + @Override + protected Void doInBackground(Void... params) { + + if (this.data != null){ + Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate()); + ffmpeg.process(this.data); + } + return null; + } + } + + // SurfaceHolder.Callback implementation + @Override + public void surfaceCreated(final SurfaceHolder holder){ + Log.e(TAG,"SurfacedCreated"); + /*try { + mCamera.setPreviewDisplay(holder); + mCamera.startPreview(); + } catch (IOException e) { + Log.d(TAG, "Error setting camera preview: " + e.getMessage()); + }*/ + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){ + Log.e(TAG, "surfaceChanged"); + //if(mCamera==null) return; + //Camera.Parameters parameters=mCamera.getParameters(); + //parameters.setPreviewSize(640,480); + //parameters.setPictureSize(640,480); + //mCamera.setParameters(parameters); + + //try{ + //Thread.sleep(10000); + /*Log.e(TAG, "xxxxxxxxxxxxxx"); + mExecutor.execute(new Runnable() { + @Override + public void run() { + mCamera.startPreview(); + final Button btn = findViewById(R.id.button); + Camera.Parameters params = mCamera.getParameters(); + ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + } + });*/ + + //btn.performClick(); + //} catch (InterruptedException e){ + // e.printStackTrace(); + //} + + + + //Camera.Parameters params = mCamera.getParameters(); + //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + /*Thread t = new Thread(new Runnable() { + @Override + public void run() { + ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv"); + + } + });*/ + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder){ + Log.e(TAG, "surfaceDestroyed"); + } + + private long encodeCount = 0; + private long count = 0; + private long previewTime; + // Camera.PreviewCallback + @Override + public void onPreviewFrame(final byte[] data, Camera camera){ + /*if (null != mStreamTask){ + switch (mStreamTask.getStatus()){ + case RUNNING: + Log.e(TAG, "onPreviewFrame Running"); + return; + case PENDING: + Log.e(TAG,"OnPreviewFrame Pending"); + mStreamTask.cancel(false); + break; + } + } + mStreamTask = new StreamTask(data); + mStreamTask.execute((Void)null);*/ + + + /*long endTime = System.currentTimeMillis(); + mExecutor.execute(new Runnable() { + @Override + public void run() { + long encodeTime = System.currentTimeMillis(); + ffmpeg.process(data); + Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime)); + } + }); + Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:" + + (endTime - previewTime) + " " + Thread.currentThread().getName()); + previewTime = endTime;*/ + + } + + // private + private boolean checkCameraHardware(Context context) { + return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); + } + + private static Camera getCameraInstance(){ + Camera c = null; + try { + Log.e(TAG, "Open Camera"); + c = Camera.open(0); + Camera.Parameters params = c.getParameters(); + Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height); + Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat()); + List fps = params.getSupportedPreviewFpsRange(); + for(int[] i : fps){ + Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n"); + } + + + + Camera.Parameters parameters = c.getParameters(); + + List sizes = parameters.getSupportedPictureSizes(); + for (Camera.Size cc : sizes){ + Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height); + } + Camera.Size cs = sizes.get(3); + //params.setPreviewSize(cs.width, cs.height); + params.setPictureSize(cs.width, cs.height); + //params.setPictureFormat(ImageFormat.NV21); + c.setParameters(params); + } + catch (Exception e){ + e.printStackTrace(); + } + return c; + } + }