android调用摄像头录像的代码(录像并生成mp4文件)

news/2024/10/29 0:24:57/

直接给代码吧,首先是MainActivity:

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.util.Timer;
import java.util.TimerTask;public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
private TextView btn_stop;
private Button btn;
private int recLen = 11;
private Boolean isRecording = false;
private SurfaceHolder mSurfaceHolder;
private MediaRecorder mediaRecorder;
private Camera mCamera;
private String mVecordFilepath;
Timer timer = new Timer();final Handler handler = new Handler(){@Overridepublic 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() {@Overridepublic void run() {recLen--;Message message = new Message();message.what = 1;handler.sendMessage(message);//当倒计时时间到1的时候关闭录像if (recLen == 1){stopRecord();stopCamera();}}
};@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_stop = findViewById(R.id.luxiangtimer);btn = findViewById(R.id.luxiangbtn);SurfaceView mSurfaceview = (SurfaceView) findViewById(R.id.surfaceview_luxiang);mSurfaceHolder = mSurfaceview.getHolder();checkPermission(this);initCamera();
}public void luxiang(View view){if (Build.VERSION.SDK_INT >= 23) {int REQUEST_CODE_CONTACT = 101;}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();}isRecording = true;timer.schedule(task,1000,1000);
}private void setConfigRecord() {mediaRecorder = new MediaRecorder();mediaRecorder.reset();mediaRecorder.setCamera(mCamera);mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {@Overridepublic void onError(MediaRecorder mr, int what, int extra) {}});//录像角度mediaRecorder.setOrientationHint(90);//使用SurfaceView预览mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());//1.设置采集声音mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置采集图像mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//2.设置视频,音频的输出格式 mp4mediaRecorder.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(mVecordFilepath);
}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) {}
}private boolean createRecordDir() {if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {Toast.makeText(this, "SD卡不存在!", Toast.LENGTH_SHORT).show();return false;}mVecordFilepath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/videotest/luxiangtest.mp4";File f = new File(mVecordFilepath);if(!f.exists()){try {f.createNewFile();}catch (Exception e){}}return true;
}private void stopRecord() {try {if (isRecording && mediaRecorder != null) {mediaRecorder.setOnErrorListener(null);mediaRecorder.setPreviewDisplay(null);mediaRecorder.stop();mediaRecorder.reset();mediaRecorder.release();mediaRecorder = null;isRecording = false;}}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 static void checkPermission(AppCompatActivity activity) {if (Build.VERSION.SDK_INT >= 23) {int checkPermission =ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO)+ ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE)+ ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)+ ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);if (checkPermission != PackageManager.PERMISSION_GRANTED) {//动态申请ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123);return;} else {return;}}return;
}@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {Log.d("111","surfaceCreated");
}@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {Log.d("111","surfaceChanged");
}@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {Log.d("111","surfaceDestroyed");
}
}

下面是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"><SurfaceViewandroid:id="@+id/surfaceview_luxiang"android:layout_width="match_parent"android:layout_height="400dp" /><TextViewandroid:id="@+id/luxiangtimer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:layout_below="@id/surfaceview_luxiang"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/luxiangbtn"android:layout_below="@id/luxiangtimer"android:text="录像"android:onClick="luxiang"tools:ignore="OnClick" /></RelativeLayout>

下面是版本号:
在这里插入图片描述
下面是权限,我这里权限比较多,不光是录像的,不需要的可以删掉:
在这里插入图片描述

这样就可以运行啦~


http://www.ppmy.cn/news/551470.html

相关文章

EasyCVR实时录像接口教程:如何获取国标接入的摄像头设备录像?

EasyCVR视频融合云服务平台支持多协议、多类型的设备接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK&#xff0c;如海康Ehome、海康SDK、大华SDK等&#xff0c;对外可分发RTSP、RTMP、FLV、HLS、WebRTC等格式的高清/超高清…

Qt海康威视二次开发,摄像头,抓图,预览,布防,录像,停止录像

多说无意义 直接看图 下面有下载链接 这个VIP是别人帮我开的 VIP文章也不是我设置的 是万恶的资本家CSDN弄得 如果看不了 不要骂我 下面也就是几张演示图 和下载链接 我放到前面来了 环境是VS2013Qt5.6.2 CSDN下载链接 CSDN 完整开发包和海康的库 okjokullgmail.com 增加…

关于GStreamer 保存摄像头数据为MP4

最近项目用到了这个需求&#xff0c;然后使用gstreamer代码去实现把usb摄像头的数据保存为MP4数据&#xff0c;以前弄过转换为h264的&#xff0c;所以一开始都很顺利了&#xff0c;但是发现保存下来的文件播放器打不开&#xff0c;用工具检测发现没有PTS也就是时间戳&#xff0…

实现海康监控视频播放(录像回放)(抓拍,录像等功能)

1. 将需要存储的监控抓拍和录像功能存储到本地磁盘&#xff0c;使用输入报存到浏览器缓存里。在created拿取缓存数据&#xff0c;判断缓存里是否有数据。 如果没有弹出输入框。 <div v-if"cache true"><el-form><div>抓图存储地址</div><…

DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第4篇编码,录像部分)

本文DEMO源码下载&#xff1a; https://download.csdn.net/download/xjb2006/85109025 dxgi桌面屏幕录像&#xff08;windows屏幕录像&#xff0c;硬件编码&#xff0c;声音捕获&#xff0c;音视频同步&#xff09; 由于篇幅有限&#xff0c;分为4篇发表&#xff1a; 1、SD…

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)

100ask_imx6ull视频监控项目-摄像头和声卡编程(五) 我们如果用程序怎么操作摄像头操作声卡呢 参考第二节的视频&#xff0c;mjpg-streamer库里面查看v4l2uvc.c就可以快速掌握摄像头 不是你是cmos还是什么类型的摄像头&#xff0c;我们的应用程序都可以用一套程序访问不同的硬件…

大华摄像头实现web端实时播放以及录像回放

文章目录 前言一、在乐橙云平台上注册账号并添加设备创建应用二、利用云平台的api获取到前端展示需要的相关信息三、前端页面展示内容总结 前言 前段时间对接了大华摄像头&#xff0c;在此做一次总结&#xff0c;总体思路是&#xff1a;把大华摄像头绑定到乐橙云平台上&#x…

linux系统如何添加硬盘设备

前言&#xff1a; 今天记录一下硬盘方面的知识&#xff0c;主要讲一下分区、挂载方面的知识&#xff0c;心情太郁闷了&#xff0c;假期的最后一天。 1、硬盘的命名规则 现在的硬盘设备一般都会以“/dev/sd”开头&#xff0c;而一台主机上可以有多块硬盘设备&#xff0c;因此系…