本文实例为大家分享了android实现调用手机摄像头录像限制录像时长的具体代码,供大家参考,具体内容如下
因为服务器空间有限,所以视频时长必须有所限制。
在xml中先布局一个按钮,点击开始录频。布局一个textview用于显示倒计时的时间。
一、使用hander+timertask完成定时操作
private textview btn_stop; private int reclen = 11; timer timer = new timer(); //时间倒计时放在开始按钮事件后,看标题7那里是时间倒计时开始的时候 //timer.schedule(task,1000,1000); final handler handler = new handler(){ @override public void handlemessage(message msg){ switch (msg.what){ case 1: btn_stop.settext(""+reclen); if(reclen<0){ timer.cancel(); btn_stop.setvisibility(view.gone); } } } }; timertask task = new timertask() { @override public void run() { reclen--; message message = new message(); message.what = 1; handler.sendmessage(message); //当倒计时时间到1的时候关闭录像 if (reclen == 1){ customtimer.stop(); stoprecord(); } } };
二、初始化摄像头
private void initcamera() { mcamera = camera.open(0); //① mcamera.setdisplayorientation(90); try { mcamera.setpreviewdisplay(msurfaceholder); mcamera.cancelautofocus();//此句加上 可自动聚焦 必须加 camera.parameters parameters = mcamera.getparameters(); //查询摄像头支持的分辨率 parameters.getsupportedpreviewsizes(); for (int i = 0; i < parameters.getsupportedpreviewsizes().size(); i++) { log.i("<><><><>width", parameters.getsupportedpreviewsizes().get(i).width + ""); log.i("<><><><>height", parameters.getsupportedpreviewsizes().get(i).height + ""); } //设置分辨率 parameters.setpreviewsize(1280, 720); //设置聚焦模式 parameters.setfocusmode(camera.parameters.focus_mode_continuous_video); //缩短recording启动时间 parameters.setrecordinghint(true); //是否支持影像稳定能力,支持则开启 if (parameters.isvideostabilizationsupported()) parameters.setvideostabilization(true); mcamera.setparameters(parameters); mcamera.startpreview(); } catch (exception e) { log.i(tag, "error starting camera preview: " + e.getmessage()); } }
三、创建视频文件
private boolean createrecorddir() { if (!environment.media_mounted.equals(environment.getexternalstoragestate())) { toast.maketext(this, "sd卡不存在!", toast.length_short).show(); return false; } file sampledir = new file("/sdcard/myvideo/"); if (!sampledir.exists()) { sampledir.mkdirs(); } videoname = "vid_" + dateutils.getdata(dateutils.format_yyyymmddhhmmss) + ".mp4"; mvecordfile = new file(sampledir, videoname); return true; }
四、配置mediarecorder
private void setconfigrecord() { mediarecorder = new mediarecorder(); mediarecorder.reset(); mediarecorder.setcamera(mcamera); mediarecorder.setonerrorlistener(onerrorlistener); //录像角度 mediarecorder.setorientationhint(90); //使用surfaceview预览 mediarecorder.setpreviewdisplay(msurfaceholder.getsurface()); //1.设置采集声音 mediarecorder.setaudiosource(mediarecorder.audiosource.mic); //设置采集图像 mediarecorder.setvideosource(mediarecorder.videosource.camera); //2.设置视频,音频的输出格式 mp4 mediarecorder.setoutputformat(mediarecorder.outputformat.default); //3.设置音频的编码格式 mediarecorder.setaudioencoder(mediarecorder.audioencoder.aac); //设置图像的编码格式 mediarecorder.setvideoencoder(mediarecorder.videoencoder.h264); camcorderprofile mprofile = camcorderprofile.get(camcorderprofile.quality_480p); mediarecorder.setaudioencodingbitrate(44100); if (mprofile.videobitrate > 2 * 1024 * 1024) { mediarecorder.setvideoencodingbitrate(2 * 1024 * 1024); } else { mediarecorder.setvideoencodingbitrate(1024 * 1024); } mediarecorder.setvideoframerate(mprofile.videoframerate); mediarecorder.setvideosize(1280, 720); mediarecorder.setoutputfile(mvecordfile.getabsolutepath()); }
五、停止录制
private void stoprecord() { try { if (isrecording && mediarecorder != null) { mediarecorder.setonerrorlistener(null); mediarecorder.setpreviewdisplay(null); mediarecorder.stop(); mediarecorder.reset(); mediarecorder.release(); mediarecorder = null; isrecording = false; log.i(tag, "" + mvecordfile.tostring()); //new imagetask().execute(mvecordfile); messagedata md = new messagedata(); md.srdatatype = srdatatype.录像返回; md.data = mvecordfile.getabsolutepath(); intent intent = new intent(broadcastparameter.action); intent.putextra("data", md); sendbroadcast(intent); // fragment页面广播通知 localbroadcastmanager.getinstance(customrecorder.this).sendbroadcast(intent); finish(); } }catch (exception ex) { //toast.maketext(getapplicationcontext(),ex.getmessage(),1).show(); } }
六、关闭摄像头
private void stopcamera() { if (mcamera != null) { mcamera.setpreviewcallback(null); mcamera.stoppreview(); mcamera.release(); mcamera = null; } }
七、点击开始录像按钮
public void onviewclicked(view view) { if (build.version.sdk_int >= 23) { int request_code_contact = 101; //验证是否许可权限 for (string str : permissions) { if (this.checkselfpermission(str) != packagemanager.permission_granted) { toast.maketext(getapplicationcontext(),"存储权限未授权",1).show(); return; } } } switch (view.getid()) { //开始 case r.id.btn_start: btn_start.setvisibility(view.gone); btn_stop.setvisibility(view.visible); //这是是判断视频文件有没有创建,如果没有就返回 boolean creakok = createrecorddir(); if (!creakok) { return; } try { mcamera.unlock(); setconfigrecord(); mediarecorder.prepare(); mediarecorder.start(); } catch (exception e) { //toast.maketext(getapplicationcontext(),e.getmessage(),toast.length_long).show(); } starttime = new date(system.currenttimemillis()); isrecording = true; customtimer.restart(); timer.schedule(task,1000,1000); break;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。