Android 纯原生视频录制 MediaRecorder+SurfaceView 踩坑记录
最近因为公司的需求,想到用Mediarecorder+Surfaceview实现视频录制,而不依赖任何三方依赖。虽然最终实现了,但遇到了很多坑,如下:
坑1:视频录制变形或不清楚的问题:
解决方案:保证 parameters.setpreviewsize和Mediarecordersetvideosize的尺寸和比例一致;
确保setvideosize不能太小;
在这里,我给出了一种计算最佳分辨率的方法。在网上搜索的方法排名是错误的。我在这里更改了大小于号码:
/*
*作者:赵星海
*时间:2019/4/30 11:53
*用途:获取最佳分辨率
*/
public void getXY() {
//默认启动后置摄像头
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
if (mCamera == null) {
Toast.makeText(this, "未获取到相机!", Toast.LENGTH_SHORT).show();
return;
}
Camera.Parameters parameter = mCamera.getParameters();
List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
//降序排列
Collections.sort(videoSizeList, new Comparator<Camera.Size>() {
@Override
public int compare(Camera.Size lhs, Camera.Size rhs) {
if (lhs.width < rhs.width) {
return -1;
} else if (lhs.width == rhs.width) {
return 0;
} else {
return 1;
}
}
});
int index = 0;
for (int i = 0; i < videoSizeList.size(); i++) {
if (videoSizeList.get(i).width < prviewSizeList.get(0).width) {
index = i;
}
}
Video_W = videoSizeList.get(index).width;
Video_H = videoSizeList.get(index).height;
//parameter.setPreviewSize(prviewSizeList.get(0).width, prviewSizeList.get(0).height);
parameter.setPreviewSize(Video_W, Video_H);
}
标志记录:
网上给出的计算方法结果:当前录制分辨率:176-144
我这边计算的结果:目前录制分辨率:1280-720 型号:小米note1
坑2:前置摄像头预览为正,输出文件为倒立图像:
解决方法:
1.相机角度设置为90度 mCamera.setDisplayOrientation(90);
2.当前用后置摄像头录制时,mediaRecorder.设置为90度的setationhint设置为
使用前置摄像头录制时,mediaRecorder.setontionhint设置为270度
当然,要注意“Hint”这个词!这里只是手机播放器的一个角度标记。事实上,从物理角度来看,前摄像头录制的视频仍然是倒立的图像,
我这边用 三方库mp4parser的视频合成,当前后摄像头的视频混合时,第一个视频的角度标记orientation
它将成为合成视频结果的角度标志,然后发现视频在前摄像头段落中倒立,反之亦然.
然后,经过一番探索,深海和公司的CTO想到了使用mp4parser的旋转功能,即以下代码
Movie movie = MovieCreator.build(ziPuth);
movie.setMatrix(Matrix.ROTATE_90);