android用mediarecord录制视屏,可以设置视屏格式,大小,还有拍摄前预览,倒计时功能要自己用hander做。

1,CameraPreview.java

//预览class

public class CameraPreview extends SurfaceView implements Callback {

private static final String TAG = "TAG-CameraPreview";

private SurfaceHolder mHolder;

private Camera mCamera;

public CameraPreview(Context context, Camera camera) {

super(context);

mCamera = camera;

// 安装一个SurfaceHolder.Callback

mHolder = getHolder();

mHolder.addCallback(this);

// 针对低于3.0的Android

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

public void surfaceCreated(SurfaceHolder holder) {

// 把预览画面的位置通知摄像头

try {

mCamera.setPreviewDisplay(holder);

mCamera.startPreview();

} catch (IOException e) {

Log.d(TAG, "Error setting camera preview: " + e.getMessage());

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

if (mHolder.getSurface() == null){

// 预览surface不存在

return;

}

// 更改时停止预览

try {

mCamera.stopPreview();

} catch (Exception e){

}

// 在此进行缩放、旋转和重新组织格式

// 以新的设置启动预览

try {

mCamera.setPreviewDisplay(mHolder);

mCamera.startPreview();

} catch (Exception e){

Log.d(TAG, "Error starting camera preview: " + e.getMessage());

}

}

}

2,RecordMp4.java

public class RecordMp4 extends Activity implements SurfaceHolder.Callback {

private Button mStopButton;

// private SurfaceView mSurfaceView;

private SurfaceHolder mSurfaceHolder;

private MediaRecorder mMediaRecorder;

private String path, pid, uid;

private CheckBox playOrStop;

private Camera mCamera;

private CameraPreview mSurfaceView;

private TextView recor_mp4_left_time;

private int second = 20;

Handler handler;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 去掉标题栏

requestWindowFeature(Window.FEATURE_NO_TITLE);

// 设置全屏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

// 设置横屏显示

setContentView(R.layout.record_mp4);

handler = new Handler();

pid = getIntent().getStringExtra("pid");

uid = getIntent().getStringExtra("uid");

init();

}

private void init() {

playOrStop = (CheckBox) findViewById(R.id.etsound_playstop);

playOrStop.setOnClickListener(new ClickListenerImpl());

recor_mp4_left_time = (TextView) findViewById(R.id.recor_mp4_left_time);

mCamera = getCameraInstance();

// 创建Preview view并将其设为activity中的内容

mSurfaceView = new CameraPreview(this, mCamera);

FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);

preview.addView(mSurfaceView);

mSurfaceHolder = mSurfaceView.getHolder();

mSurfaceHolder.addCallback(this);

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

Runnable runnable = new Runnable() {

@Override

public void run() {

second--;

if (second <= 0) {

handler.removeCallbacks(this);

} else {

recor_mp4_left_time.setText("还剩" + second + "s");

handler.postDelayed(this, 1000);

}

}

};

private Camera getCameraInstance() {

Camera c = null;

try {

// 获取Camera实例

c = Camera.open();

c.setDisplayOrientation(90);

} catch (Exception e) {

// 摄像头不可用(正被占用或不存在)

}

// 不可用则返回null

return c;

}

@SuppressLint("NewApi")

private void initMediaRecorder() {

// next codes is right for 2.3 and 4.0

mMediaRecorder = new MediaRecorder();

// mCamera = Camera.open();

// mCamera.setDisplayOrientation(90);

mCamera.unlock();

mMediaRecorder.setCamera(mCamera);

// 设置视频源

mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

mMediaRecorder.setOrientationHint(90);// 视频旋转90度

// 设置音频源

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);

// 设置文件输出格式

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

// 设置视频编码方式

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

// 设置音频编码方式

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

// 设置视频高和宽,注意文档的说明:

// Must be called after setVideoSource().

// Call this after setOutFormat() but before prepare().

// 设置录制的视频帧率,注意文档的说明:

// Must be called after setVideoSource().

// Call this after setOutFormat() but before prepare().

mMediaRecorder.setVideoFrameRate(16);

// 设置预览画面

mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

// 设置输出路径

path =this.getFilesDir().getAbsolutePath()+File.separator+System.currentTimeMillis()+".mp4";

mMediaRecorder.setOutputFile(path);

mMediaRecorder.setVideoSize(640, 480);

// 设置视频的最大持续时间

mMediaRecorder.setMaxDuration(20000);

// 为MediaRecorder设置监听

mMediaRecorder.setOnInfoListener(new OnInfoListener() {

public void onInfo(MediaRecorder mr, int what, int extra) {

if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {

TCommUtil.showToast(RecordMp4.this, "已经达到最长录制时间", true);

System.out.println("已经达到最长录制时间");

if (mMediaRecorder != null) {

mMediaRecorder.stop();

mMediaRecorder.release();

mMediaRecorder = null;

}

}

}

});

}

private class ClickListenerImpl implements OnClickListener {

public void onClick(View v) {

CheckBox checkBox = (CheckBox) v;

if (checkBox.getId() == R.id.etsound_playstop) {

if (mMediaRecorder == null) {

try {

initMediaRecorder();

mMediaRecorder.prepare();

mMediaRecorder.start();

handler.postDelayed(runnable, 0);

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

} else {

if (mMediaRecorder != null) {

mMediaRecorder.stop();

releaseMediaRecorder();

mCamera.lock();

}

}

}

}

}

@Override

protected void onPause() {

super.onPause();

handler.removeCallbacks(runnable);

// 如果正在使用MediaRecorder,首先需要释放它。

releaseMediaRecorder();

// 在暂停事件中立即释放摄像头

releaseCamera();

}

private void releaseMediaRecorder() {

if (mMediaRecorder != null) {

// 清除recorder配置

handler.removeCallbacks(runnable);

mMediaRecorder.reset();

// 释放recorder对象

mMediaRecorder.release();

mMediaRecorder = null;

// 为后续使用锁定摄像头

mCamera.lock();

}

}

private void releaseCamera() {

if (mCamera != null) {

// 为其它应用释放摄像头

mCamera.release();

mCamera = null;

}

}

// SurfaceHolder.Callback接口

public void surfaceCreated(SurfaceHolder holder) {

try {

} catch (IllegalStateException e) {

e.printStackTrace();

}

}

//  在 surfaceChanged以后,才在 initMediaRecorder()方法里 MediaRecorder 变量设置参数,不然 会在

//mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 出报错。

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

System.out.println("SurfaceView---->Changed");

}

public void surfaceDestroyed(SurfaceHolder holder) {

System.out.println("SurfaceView---->Destroyed");

if (mMediaRecorder != null) {

mMediaRecorder.stop();

mMediaRecorder.release();

mMediaRecorder = null;

}

}

}

3,record_mp4.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/solid_white" >

android:id="@+id/camera_preview"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/etsound_rlcontent"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_alignParentBottom="true"

android:background="@color/transparent"

android:clickable="true"

android:focusable="true"

android:focusableInTouchMode="true"

android:visibility="visible" >

android:id="@+id/recor_mp4_left_time"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="10dp"

android:textColor="@color/titlebar_bg"

android:text="20s"

android:textSize="25sp" />

android:id="@+id/etsound_playstop_fl"

android:layout_width="100dp"

android:layout_height="100dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:background="@drawable/round_video" >

android:id="@+id/etsound_playstop"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:background="@drawable/play_video_stop_selector"

android:button="@null"

android:padding="10dp" />

原文:http://www.cnblogs.com/lsc183/p/3823338.html

android倒计时录制视频下载,android录制视屏(预览,倒计时)相关推荐

  1. 有没有计算机网课,有没有电脑录制视频工具可以录制网课?

    原标题:有没有电脑录制视频工具可以录制网课? 有上过网课的朋友应该都知道,现如今的网课,形式也是很丰富的,除了有传统的视频形式之外,也有音频形式的或者是PPT课件形式的.要说怎么录制视频和音频,相信大 ...

  2. Android源码 —— 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16)

    Android源码 -- 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16) 本文将介绍从Win7系统开始一步步构建下载Android源码的虚拟机环境: **1.使 ...

  3. 电脑如何批量下载哔哔视屏_我是电脑哔哔哔哔哔

    电脑如何批量下载哔哔视屏 编者的信 (Letter from the Editor) Here's my routine these days: I wake up at about 7:30 a.m ...

  4. android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...

    AssNineGridView 仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图(可自定义). 写在前面 这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀 ...

  5. android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc

    Android摄像头是全屏预览最简单的方式 Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏, ...

  6. android camera 全屏,Android Camera做全屏预览之最简单方法.doc

    Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏,我们之所以喜欢全屏的一个主要原因就是全屏的感 ...

  7. Android通过屏幕方向和摄像头方向实现屏幕预览

    Android通过屏幕方向和摄像头方向实现屏幕预览 1. 前言 2. Android 的屏幕方向 2.1 什么是屏幕方向 2.2 为什么要获取或设置屏幕方向 2.3 如何获取与设置屏幕方向 2.3.1 ...

  8. SkeyeVSS综合安防监控Onvif、RTSP、GB28181视频云无插件直播点播解决方案之监控视频实时多屏预览

    SkeyeVSS综合安防监控Onvif.RTSP.GB28181视频云无插件直播点播解决方案之监控视频实时多屏预览 SkeyeVSS支持一分屏.四分屏.九分屏.16分屏.25分屏.36分屏等几种N*N ...

  9. Cordova实现自定义下载插件和WPS在线预览

    Cordova实现自定义下载插件和WPS在线预览 简要描述 点击下载链接,请求URL,判断手机是否安装WPS,如果安装则调用wps在线编辑,没有安装则对文件进行下载,并在通知栏进行通知,显示下载进度( ...

最新文章

  1. labview虚拟心电监测系统_机器视觉系统单相机模型
  2. Android中Fragment+ViewPager的配合使用
  3. 你为何要带着我的爱远走
  4. Glide 这样用,更省内存!!!
  5. mt7620a拓展串口
  6. layui添加复选框_对layui初始化列表的CheckBox属性详解,初始化属性
  7. 【云笔记搭建】Visual Code + Github仓库 + Git
  8. 力扣--349两个数组的交集I-II
  9. Cocoa异常编程 NSException
  10. ❤️《集成SSM框架—图书系统》Mybatis+Spring+SpirngMVC
  11. java 接收前台富文本_前后端分离ueditor富文本编辑器的使用-Java版本
  12. 避免野指针的方法及结构体小细节
  13. c++对象模型大总结:第1-4章、对象初探与构造函数
  14. HDU 6599 I Love Palindrome String (回文树+hash)
  15. Leetcode之删除链表的倒数第N个节点
  16. 执行计划有时不准确_一张表格,帮助学生制定良好每日学习计划,提升学习积极性主动性...
  17. 2 测试方法与理论 - 软件测试
  18. 类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD
  19. 如何对多个文件夹进行重命名?这个方法可以批量修改文件夹名、给文件夹名加统一前缀或后缀
  20. coding部署博客 + 腾讯云 cdn 踩坑日记

热门文章

  1. android 服务的应用,在Activity中实现背景音乐播放
  2. Linux下VTK、ITK的安装及运行 转载
  3. Python系统调用——运行其他程序
  4. 【Leetcode】创建链表
  5. 云炬随笔20210819
  6. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)
  7. DAGNN:有向无环图神经网络
  8. 优秀程序员的45个习惯
  9. go语言中的匿名函数
  10. pikachu皮卡丘靶机系统安装~