Camera 录制视频的实现
使用 Camera 录制视频, 实现步骤如下:
需要权限: android.permission.CAMERA
android.permission.RECORD_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
如果录制前后需要预览效果, 需要在录制开始前停止预览, 并解锁摄像头.
录制停止后锁上摄像头, 再开始预览.
MediaRecorder mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(camera);// 关联摄像头
mMediaRecorder.setAudioSource(AudioSource.CAMCORDER);// 设置音频源
mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 设置视频源
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);// 获得摄像质量低的配置
mMediaRecorder.setProfile(profile);// 设置配置文件
mMediaRecorder.setOutputFile(“/mnt/sdcard/test.mp4”);// 设置输出文件.
mMediaRecorder.setPreviewDisplay(mHolder.getSurface());// 设置预览显示
mMediaRecorder.prepare();// 准备
mMediaRecorder.start();// 录制
mMediaRecorder.stop();// 停止
mMediaRecorder.release();// 释放资源
public class MainActivity extends Activity implements Callback {
private Camera camera;
private SurfaceHolder mHolder;
private MediaRecorder mMediaRecorder;
private boolean isCapturing = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
mHolder = surfaceView.getHolder();
// 设置数据来源自外部, 不维护自己内部的缓冲区, 而是等待渲染引擎把数据推送到界面上.
// 注意: 4.0以前版本必须要设置, 4.0以后版本自动会设置.
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mHolder.addCallback(this); }
public void capture(View v) {
if(!isCapturing) {
isCapturing = true;
camera.stopPreview();
camera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(camera);
mMediaRecorder.setAudioSource(AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(VideoSource.CAMERA);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
mMediaRecorder.setProfile(profile);
File sdcardFile = Environment.getExternalStorageDirectory();
String path = new File(sdcardFile, "video" + System.currentTimeMillis() + ".mp4").getPath();
mMediaRecorder.setOutputFile(path);
mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (Exception e) { e.printStackTrace();
}
} else {
isCapturing = false;
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
camera.lock();
camera.startPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) { try {
camera = Camera.open();
camera.setPreviewDisplay(mHolder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
}
Camera 录制视频的实现的更多相关文章
- 3D图片采集与展示(SurfaceView 自适应 Camera, 录制视频, 抽取帧)
最近在做一个3D图片采集与展示. 主要功能为:自定义Camera(google 已经摈弃了Camera, 推荐使用Camera2,后续篇幅,我将会用Camera2取代Camera),围绕一个物体360 ...
- 错误:Camera录制视频(6.0错误),5.1正常,7.1正常 (java.lang.RuntimeException: start failed.at android.media.MediaRecorder.native_start(Native Method))
Process: com.example.mycamera2, PID: 24086 java.lang.RuntimeException: start failed. at android.medi ...
- Android Camera系列开发 (二)通过Intent录制视频
Android Camera系列开发 (二)通过Intent录制视频 作者:雨水 2013-8-18 CSDN博客:http://blog.csdn.net/gobitan/ 概述 使用Camera ...
- Android使用MediaRecorder和Camera实现视频录制及播放功能整理
转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/51878566 这两天产品经理向我丢来一个新需求,需要在项目里添加一个视频录制的 ...
- Android手机录制视频 实时传输(转载)
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- 【Android】 Android实现录音、播音、录制视频功能
智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景. Android ...
- 使用MediaRecorder录制视频短片
MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRe ...
- iOS 三种录制视频方式
随着每一代 iPhone 处理能力和相机硬件配置的提高,使用它来捕获视频也变得更加有意思.它们小巧,轻便,低调,而且与专业摄像机之间的差距已经变得非常小,小到在某些情况下,iPhone 可以真正替代它 ...
- android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好
public void startRecord() { mediarecorder = new MediaRecorder();// 创建mediarecorder对象 mCamera = getCa ...
随机推荐
- 三台服务器的时间同步-Linux
192.168.1.30 做服务器时间 192.168.1.40 同步30 192.168.1.50 同步30 step1.在30机器上修改ntp.conf 添加: restrict 1 ...
- 第二章、Django以及数据库的配置
目录 第二章.Django以及数据库的配置 一.小白必会三板斧 二.静态文件配置 三.form表单 action和method参数可以写的形式 四.request对象及方法 五.django连接数据库 ...
- briup_JDBC_自建工具类
1.操作的环境 STS,mysql,oracle orcle 所操作的数据库名为 ORCL 表为 m_stu 表结构如下 mysql 的表为:my_stu 表结构如下 工具类完整代码 package ...
- Delphi 抽象方法
- 【异常】诡异的mysql错误,Pagehelper插件混乱导致吗
1 详细的异常信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in ...
- MinGW-W64 编译 LLVM 与 Clang
原文: http://blog.csdn.net/happywjh666/article/details/51415723 编译环境: 系统 --win10 64位 gcc -- version 5. ...
- mysql 忘记密码如何修改
第一步:将服务停掉 /etc/init.d/mysqld stop 第二步:加参数启动服务 cd /application/mysql/bin/ mysqld_safe --skip-grant-ta ...
- 【LOJ6671】EntropyIncreaser 与 Minecraft
Orz lbt Description https://loj.ac/problem/6671 Solution
- 生成器(generator) 详解
1. 生成器是什么? 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成 ...
- loj515 「LibreOJ β Round #2」贪心只能过样例[bitset+bool背包]
由于bitset极其不熟练且在实际题目中想不起来运用它来优化,于是练了几道题. 这题是一个分组的bool背包,每组必须选一个,暴力的话是$O(n^5)$. 如果dp数组不要一维滚动的话,有两种枚举方法 ...