Skip to content

Commit

Permalink
代码整理修改
Browse files Browse the repository at this point in the history
  • Loading branch information
eric committed Nov 24, 2017
1 parent ce99897 commit 4444105
Show file tree
Hide file tree
Showing 4 changed files with 317 additions and 127 deletions.
156 changes: 29 additions & 127 deletions rtmpfile/src/main/java/com/wangheart/rtmpfile/CameraActivity.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
package com.wangheart.rtmpfile;

import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.widget.Toast;
import android.view.View;

import com.wangheart.rtmpfile.ffmpeg.FFmpegHandle;
import com.wangheart.rtmpfile.utils.LogUtils;

import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

Expand All @@ -32,184 +27,91 @@

public class CameraActivity extends Activity implements SurfaceHolder.Callback {
private MySurfaceView sv;
private int screenWidth = 480;
private int screenHeight = 320;
private final int WIDTH = 480;
private final int HEIGHT = 320;
private SurfaceHolder mHolder;
private Camera mCamera;
boolean isPreview = false; // 是否在浏览中
private String dir = "CameraDemo1";
private String url = "rtmp://192.168.31.127/live/test";
private StreamTask mStreamTask;
//采集到每帧数据时间
long previewTime = 0;
//开始编码时间
//每帧开始编码时间
long encodeTime = 0;
//采集数量
int count = 0;
//编码数量
int encodeCount = 0;
//采集数据回调
private StreamIt mStreamIt;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
File file = new File(Environment.getExternalStorageDirectory(), dir);
if (file.exists()) {
file.delete();
}
file.mkdirs();
init();
}

private void init() {
FFmpegHandle.init(this);
sv = findViewById(R.id.sv);
mStreamIt = new StreamIt();
CameraInterface.getInstance().openCamera(1);
Camera.Parameters params = CameraInterface.getInstance().getParams();
params.setPictureFormat(ImageFormat.NV21);
params.setPictureSize(WIDTH, HEIGHT);
params.setPreviewSize(WIDTH, HEIGHT);
params.setPreviewFpsRange(30000, 30000);
List<String> focusModes = params.getSupportedFocusModes();
if (focusModes.contains("continuous-video")) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
CameraInterface.getInstance().resetParams(params);
FFmpegHandle.init(this);
mHolder = sv.getHolder();
mHolder.addCallback(this);
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "CameraDemo1" + File.separator + "test.flv";
FFmpegHandle.getInstance().initVideo(url);
}

@Override
protected void onDestroy() {
super.onDestroy();
FFmpegHandle.getInstance().close();
CameraInterface.getInstance().releaseCamera();
}

@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = getCamera();
if (mHolder != null) {
setStartPreview(mCamera, mHolder);
}
if (mHolder != null) {
CameraInterface.getInstance().startPreview(mHolder, mStreamIt);
}
}

@Override
protected void onPause() {
super.onPause();
releaseCamera();
CameraInterface.getInstance().stopPreview();
}

private Camera getCamera() {
Camera camera;
try {
//打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置
camera = Camera.open(1);
if (camera != null && !isPreview) {
try {
Camera.Parameters parameters = camera.getParameters();
//对拍照参数进行设置
for (Camera.Size size : parameters.getSupportedPictureSizes()) {
LogUtils.d(size.width + " " + size.height);
}
LogUtils.d("============");
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
LogUtils.d(size.width + " " + size.height);
}
parameters.setPreviewSize(screenWidth, screenHeight); // 设置预览照片的大小
parameters.setPreviewFpsRange(30000, 30000);
parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式
parameters.setPictureSize(screenWidth, screenHeight); // 设置照片的大小
camera.setParameters(parameters);
//指定使用哪个SurfaceView来显示预览图片
camera.setPreviewDisplay(sv.getHolder()); // 通过SurfaceView显示取景画面
camera.setPreviewCallback(new StreamIt()); // 设置回调的类
camera.startPreview(); // 开始预览
//Camera.takePicture()方法进行拍照
camera.autoFocus(null); // 自动对焦
} catch (Exception e) {
e.printStackTrace();
}
isPreview = true;
}
} catch (Exception e) {
camera = null;
e.printStackTrace();
Toast.makeText(this, "无法获取前置摄像头", Toast.LENGTH_LONG);
}
return camera;
}

public static void followScreenOrientation(Context context, Camera camera) {
final int orientation = context.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
} else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
camera.setDisplayOrientation(90);
}
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera, mHolder);
CameraInterface.getInstance().startPreview(mHolder, mStreamIt);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
setStartPreview(mCamera, mHolder);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}


private void setStartPreview(Camera camera, SurfaceHolder holder) {
try {

camera.setPreviewDisplay(holder);
followScreenOrientation(this, camera);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
CameraInterface.getInstance().stopPreview();
CameraInterface.getInstance().releaseCamera();
}

ExecutorService executor = Executors.newSingleThreadExecutor();

private class StreamTask extends AsyncTask<Void, Void, Void> {

private byte[] mData;

//构造函数
StreamTask(byte[] data) {
this.mData = data;
}

@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
if (mData != null) {
encodeTime = System.currentTimeMillis();
FFmpegHandle.getInstance().onFrameCallback(mData);
LogUtils.d((++count) + "消耗时间:" + (System.currentTimeMillis() - encodeTime));
}
return null;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
}
}

/*
释放相机资源
*/
private void releaseCamera() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void btnStart(View view) {
}

ExecutorService executor = Executors.newSingleThreadExecutor();

public class StreamIt implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(final byte[] data, Camera camera) {
Expand Down
Loading

0 comments on commit 4444105

Please sign in to comment.