录制视频(Surfaceview+MediaRecorder)

本文介绍了一种使用SurfaceView和MediaRecorder在Android上录制视频的方法,强调了自适应尺寸以防止图像变形的重要性。代码示例中详细说明了如何根据设备屏幕尺寸动态调整预览和录制尺寸,确保录制视频的质量。此外,还提到了对于不支持指定录像尺寸的设备的处理策略,并提供了TextureView实现的参考资料。
摘要由CSDN通过智能技术生成

欢迎转载和提问,转载请注明出处
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) {
            
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值