package com.fx.realtimevideodemo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback {
private static final String TAG = "MainActivity";
private SurfaceView surfaceView;
private Button start, stop;
private boolean mStartedFlg = false;//是否正在录像
private boolean mIsPlay = false;//是否正在播放录像
private MediaRecorder mRecorder;
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
private MediaPlayer mediaPlayer;
private String path;
private int mPreviewWidth;
private int mPreviewHeight;
private boolean bIfPreview;
boolean isStart = false;
List<byte[]> dataList = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isStart = true;
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isStart = false;
Camera.Size size = mCamera.getParameters().getPreviewSize();
for (byte[] b : dataList) {
try {
YuvImage image = new YuvImage(b, ImageFormat.NV21, size.width, size.height, null);
if (image != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
//图片旋转
rotateMyBitmap(bmp);
stream.close();
}
} catch (Exception ex) {
Log.e("Sys", "Error:" + ex.getMessage());
}
}
}
});
DisplayMetrics dm = new DisplayMetrics();
//取得窗口属性
getWindowManager().getDefaultDisplay().getMetrics(dm);
mPreviewWidth = dm.widthPixels;
mPreviewHeight = dm.heightPixels;
Log.i(TAG,"mPreviewWidth="+mPreviewWidth+"==mPreviewHeight=="+mPreviewHeight);
initSurfaceView();
}
private void initSurfaceView() {
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
mSurfaceHolder = surfaceView.getHolder(); // 绑定SurfaceView,取得SurfaceHolder对象
mSurfaceHolder.addCallback(this); // SurfaceHolder加入回调接口
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 設置顯示器類型,setType必须设置
}
int i= 0;
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Log.i(TAG , "onPreviewFrame"+i);
if (i<50 && isStart) {
i++;
dataList.add(data);
}
}
public void rotateMyBitmap(Bitmap bmp){
//*****旋转一下
Matrix matrix = new Matrix();
matrix.postRotate(270);
Bitmap nbmp2 = Bitmap.createBitmap(bmp, 0,0, bmp.getWidth(), bmp.getHeight(), matrix, true);
saveBitmap(nbmp2);
}
public void saveBitmap(Bitmap bitmap) {
// 首先保存图片
Log.i(TAG, "saveBitmap");
File appDir = new File(Environment.getExternalStorageDirectory(), "zxing_image");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = SystemClock.currentThreadTimeMillis() + ".png";
File file = new File(appDir, fileName);
Log.i(TAG, "file="+file.toString());
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
try {
Log.i(TAG, "SurfaceHolder.Callback:surface Created");
mCamera.setPreviewDisplay(mSurfaceHolder);
// mCamera.setOneShotPreviewCallback(this);
mCamera.setPreviewCallback(this);
} catch (IOException e) {
e.printStackTrace();
if (null != mCamera) {
mCamera.release();
mCamera = null;
}
Log.i(TAG + "initCamera", e.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
initCamera();
// 开始预览
mCamera.startPreview();
bIfPreview = true;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (null != mCamera) {
mCamera.setPreviewCallback(null); //!!这个必须在前,不然退出出错
mCamera.stopPreview();
bIfPreview = false;
mCamera.release();
mCamera = null;
}
}
/**
* 获取SD path
*
* @return
*/
public String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
return sdDir.toString();
}
return null;
}
private void initCamera(){//surfaceChanged中调用
//CameraID表示0或者1,表示是前置摄像头还是后置摄像头
mCamera.setDisplayOrientation(90);
//参数设置
Camera.Parameters parameters = mCamera.getParameters();
//设置放大倍数
parameters.setZoom(12);
parameters.setPreviewFrameRate(30);
//开启闪光灯 parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
//参数设置赋给Camera对象
mCamera.setParameters(parameters);
}
}
android获取帧保存到本地
最新推荐文章于 2024-03-04 16:37:10 发布