Android实现调用手机摄像头录像限制录像时长

Jade ·
更新时间:2024-11-10
· 589 次阅读

本文实例为大家分享了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;



手机摄像头 调用 摄像 摄像头 手机 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号