Camera preview变形和MediaRecorder录制视频太短崩的问题

1.预览照片被拉伸

通常,拍照预览页面的照片拉伸主要与下面两个因素有关  
            1.     Surfaceview的大小
           2.  Camera中的Preview的大小
如果surfaceview尺寸比例跟预览尺寸比例相同,那便不会产生变形,

那么问题就来了,怎么样才能够达到适配多台手机,界面不产生拉伸变形,而且程序又不崩溃?

思路如下:
1.     先将获取手机支持预览的尺寸列表通过方法parmeters.getSupportedPreviewSizes()来得到返回类型为List<Size>的值,
2.     先进行屏幕方向的一个判断,因为预览列表里面的尺寸都是w>h(即横屏),如果屏幕是竖屏则需要先将宽高进行调换,这样方便接下来的比较。
3.     先用for循环将预览尺寸列表每个元素宽高与surfaceview的宽高进行比较,如果存在宽高尺寸都与surfaceview宽高尺寸相同的size则将该宽高设置为预览尺寸。4.     如果步骤2找不到相同尺寸就得进行该步骤,将尺寸列表的宽高比例和surfaceview的比例作比较,找到一个相同或相近的。(一般来说,只要surfaceview的尺寸和屏幕尺寸相同,就可以找到相同的比例)然后将该尺寸的size设置为预览尺寸。

/**
* 通过对比得到与宽高比最接近的尺寸(如果有相同尺寸,优先选择)
*
* @param surfaceWidth
* 需要被进行对比的原宽,surface view的宽度
* @param surfaceHeight
* 需要被进行对比的原高 surface view的高度
* @param preSizeList 得到的支持预览尺寸的list,parmeters.getSupportedPreviewSizes()
* 需要对比的预览尺寸列表
* @return 得到与原宽高比例最接近的尺寸
*/

protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,

List<Size> preSizeList) {
int ReqTmpWidth;
int ReqTmpHeight;
// 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高
if (mIsPortrait) {
ReqTmpWidth = surfaceHeight;
ReqTmpHeight = surfaceWidth;
} else {
ReqTmpWidth = surfaceWidth;
ReqTmpHeight = surfaceHeight;
}
//先查找preview中是否存在与surfaceview相同宽高的尺寸
for(Camera.Size size : preSizeList){
if((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)){
return size;
}
}
// 得到与传入的宽高比最接近的size
float reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;
float curRatio, deltaRatio;
float deltaRatioMin = Float.MAX_VALUE;
Camera.Size retSize = null;
for (Camera.Size size : preSizeList) {
curRatio = ((float) size.width) / size.height;
deltaRatio = Math.abs(reqRatio - curRatio);
if (deltaRatio < deltaRatioMin) {
deltaRatioMin = deltaRatio;
retSize = size;
}
}
return retSize;
}

2.MediaRecorder录制视频太短崩的问题

只解决了部分手机,有些手机还是不行

1.Activity实现implements   android.media.MediaRecorder.OnErrorListener这个接口

2.开始录制视频时

 if (mMediaRecorder == null) {
                    mMediaRecorder = new MediaRecorder();
                    mMediaRecorder.setOnErrorListener(this);
                } else {
                    mMediaRecorder.reset();
                }

3.停止视频时 
mMediaRecorder.setOnErrorListener(null);
              mMediaRecorder.setPreviewDisplay(null);
                mMediaRecorder.stop();
4.实现接口方法

public void onError(MediaRecorder mr, int what, int extra) {
// TODO Auto-generated method stub
try {
            if (mr != null)
                mr.reset();
        } catch  (Exception e) {
        }
}

`MediaRecorder`是一个Web API,用于在浏览器环境中捕获音频和视频数据,并将其编码成可存储的文件格式,如MP4。它主要用于实时录制用户的麦克风声音或屏幕内容。以下是使用`MediaRecorder`的基本流程: 1. **初始化**:创建`MediaRecorder`实例,指定要录制的媒体源,通常是`getUserMedia()`返回的媒体流。 ```javascript if (typeof MediaRecorder === 'undefined') { console.log('MediaRecorder not supported in this browser'); } else { const mediaStream = getUserMedia({ audio: true, video: true }); const recorder = new MediaRecorder(mediaStream); } ``` 2. **设置配置**:你可以选择不同的编码质量、比特率等参数,但这通常不需要显式设置,因为`MediaRecorder`会自动调整。 3. **开始和停止录制**:调用`start()`开始记录,`stop()`停止记录。记录的时间点由`dataavailable`事件触发,这时你可以从`data`属性获取到一帧的记录数据。 ```javascript recorder.start(); recorder.ondataavailable = event => { const chunks = []; if (event.data.size > 0) { chunks.push(event.data); } if (event.data.size === Infinity || event.isLive) { // 如果数据无穷大或直播模式,则持续收集数据直到stop() } // 当所有数据收集完毕后,停止并生成文件 recorder.onstop = () => { const blob = new Blob(chunks, { type: 'video/mp4' }); saveOrDownloadBlob(blob); }; }; recorder.stop(); ``` 4. **保存或下载**:`blob`对象代表了录制好的视频,你可以将其转化为URL或直接下载到本地。例如: ```javascript function saveOrDownloadBlob(blob) { const url = URL.createObjectURL(blob); // 下载或显示在页面上... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值