欢迎转载和提问,转载请注明出处
http://blog.csdn.net/ning_gg/article/details/54314315
这个是自己写的录制视频,为了简单,全写在一个Activity中,可以切换照相机,没有带聚焦,需要聚焦自己写个OnTouch即可。在我的测试机上跑起来畅通无阻,我只有3个测试机。如果你使用了我的有问题可以告诉我。
这个demo比网上什么的写死录像尺寸强多了,全部自匹配尺寸。如果你的跑不起可以第一时间检测这个尺寸设置。我的思路是获取手机屏幕尺寸,得到高/宽的比 比如1280/720 或者1920/1080这样的。然后遍历Camera的预览尺寸,得到一个跟手机尺寸最合适的那一个,这样的话预览的时候图像不会变形,然后获取手机录像的尺寸,这里必须说下不是每个手机都提供这个录像尺寸,像华为mate7就不提供,不提供的另说,提供的会遍历这个尺寸,得到相同比例(比如预览是1920/1080=1.77777)最小的一个(800/450),这样的话比大部分提供的写死一个尺寸强多了,而且录制出来的东西不会变形。为什么要找最小的是因为我们的需求录制的视频最小越好。对于那些不提供录像尺寸的,直接把预览尺寸设成录像尺寸就可以了。mate7就是这样跑通的。
附上代码
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.imapedia.ykdemo.R;
import com.imapedia.ykdemo.base.BaseActivity;
import com.imapedia.ykdemo.utils.L;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by ning_gg on 2017/1/9.
* <p/>
* 录制视频,切换摄像头,尺寸匹配
*/
public class RecordVideoActivity extends BaseActivity implements MediaRecorder.OnErrorListener ,SurfaceHolder.Callback{
private String TAG=RecordVideoActivity.class.getSimpleName();
@BindView(R.id.activity_main_toolbar)
Toolbar activity_main_toolbar;
@BindView(R.id.recordvideo_sv)
SurfaceView recordvideo_sv;
private SurfaceHolder mSurfaceHolder;
@BindView(R.id.toolbar_change_tv)
TextView toolbar_change_tv;
@OnClick (R.id.toolbar_change_tv)
void toolbar_change_tvOnClick(){
if(recording){
try {
stopRecord();
} catch (Exception e) {
e.printStackTrace();
}
}
if (cameraPosition == Camera.CameraInfo.CAMERA_FACING_BACK) {
cameraPosition = Camera.CameraInfo.CAMERA_FACING_FRONT;
} else {
cameraPosition = Camera.CameraInfo.CAMERA_FACING_BACK;
}
if (isOpenCamera) {
mCamera.stopPreview();//停掉原来摄像头的预览
mCamera.release();//释放资源
mCamera = null;//取消原来摄像头
mCamera = Camera.open(cameraPosition);
try {
setCameraParms();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@BindView(R.id.recordvideo_btn)
Button recordvideo_btn;
@OnClick(R.id.recordvideo_btn)
void recordvideo_btnOnClick() {
if (!recording) {