package com.bw.videorecorder;

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

private SurfaceView surfaceView;
private RelativeLayout layout;
private Button recordbutton;
private Button stopbutton;
private MediaRecorder mediaRecorder;

@Override
protected 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.activity_main);

surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
//设置参数 类型 把数据推送到前方显示出来
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置分辨率
surfaceView.getHolder().setFixedSize(176, 144);
//要求屏幕常量不要锁屏
surfaceView.getHolder().setKeepScreenOn(true);
//找到相对布局
layout = (RelativeLayout) findViewById(R.id.layout);
recordbutton = (Button) findViewById(R.id.recordbutton);
stopbutton = (Button) findViewById(R.id.stopbutton);

}
//当用户触摸屏幕时,显示按钮
@Override
public boolean onTouchEvent(MotionEvent event) {
//当用户触摸按下时
if (event.getAction()==MotionEvent.ACTION_DOWN) {
//将相对布局设置为可见
layout.setVisibility(ViewGroup.VISIBLE);
}
return super.onTouchEvent(event);
}
public void record(View v){
switch (v.getId()) {
case R.id.recordbutton:
try {
File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");
mediaRecorder = new MediaRecorder();
//设置声音的来源,来源于麦克风
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置视频的来源 来源于摄像头
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置输出格式 3g格式 MP4
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置视频大小
mediaRecorder.setVideoSize(320, 240);
//设置捕获画面速率 5帧清晰 3帧不清晰
mediaRecorder.setVideoFrameRate(3);
//设置声音编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

//设置视频编码
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//设置输出路径
mediaRecorder.setOutputFile(file.getAbsolutePath());
//把预览画面输送到屏幕上
mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
//缓冲
mediaRecorder.prepare();
//开始录制
mediaRecorder.start();

//当点击刻录时,停止可以点击
recordbutton.setEnabled(false);
stopbutton.setEnabled(true);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.stopbutton:
if (mediaRecorder!=null) {
//停止
mediaRecorder.stop();
//释放
mediaRecorder.release();
mediaRecorder=null;
}

//当点击停止时,刻录可以点击
recordbutton.setEnabled(true);
stopbutton.setEnabled(false);
break;

default:
break;
}

}

}

//-------------------Xml布局-----------------------------

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceView"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout"
android:visibility="gone"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/recordbutton"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="10dp"
android:text="@string/recordbutton"
android:onClick="record"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stopbutton"
android:layout_toLeftOf="@+id/recordbutton"
android:layout_alignTop="@+id/recordbutton"
android:layout_marginRight="30dp"
android:text="@string/stopdbutton"
android:onClick="record"/>
</RelativeLayout>

</FrameLayout>

//--------------------values 下的 string----------------------

//添加

<string name="recordbutton">刻录</string>
<string name="stopdbutton">停止</string>

//------------权限-----------------------

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

视频录制SurfaceView的更多相关文章

  1. Android音视频之MediaRecorder音视频录制

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  2. Android多媒体录制--MediaRecorder视频录制

    Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...

  3. Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...

  4. Android实现视频录制

    安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接 ...

  5. Android视频录制从不入门到入门系列教程(四)————Camera Parameter

    Camera提供了一个叫做setParameters的方法帮助开发者设置相机的相关参数. 通过Camera的getParameters方法可以获取到当前为相机设置的相关参数. 下面简单介绍下,视频录制 ...

  6. Android 音视频开发(七): 音视频录制流程总结

    在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...

  7. Android开发笔记——视频录制播放常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...

  8. Android使用MediaRecorder和Camera实现视频录制及播放功能整理

    转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/51878566 这两天产品经理向我丢来一个新需求,需要在项目里添加一个视频录制的 ...

  9. Android 开发 MediaRecorder视频录制入门

    前言 MediaRecorder是Android SDK提供用于录制音视频,关于音频的录制在我另一篇博客里已经介绍.传送门: https://www.cnblogs.com/guanxinjing/p ...

随机推荐

  1. 转 gl_VertexID的含义

    #version //layout(location = 0) in vec4 VERTEX; uniform mat4 MODEL_MATRIX; uniform mat4 VIEW_MATRIX; ...

  2. Spring AOP实现声明式事务代码分析

    众所周知,Spring的声明式事务是利用AOP手段实现的,所谓"深入一点,你会更快乐",本文试图给出相关代码分析. AOP联盟为增强定义了org.aopalliance.aop.A ...

  3. LeetCode OJ 63. Unique Paths II

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  4. Matlab - 矩阵元素引用

    >> A = [ ; ; ] A = 1. 选择第m行n列的元素 >> A(,) ans = 2. 选择第i列所有元素 >> A(:,) ans = 3. 选择第j ...

  5. digitalocean完成B轮8300万美元融资,赠送10美元优惠码

    7月8日,美国vps服务商digitalocean在官方博客宣传,公司完成高达8300万美元B轮融资.融资方包括 IA Ventures, Andreessen Horowitz和Access Ind ...

  6. 大数据加减(Big data addition and subtraction)

    题目描述 Description 加减法是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错.现在的问题是:给定任意位数(不超过1000位)的加减法算式,请给出正确结果.为提高速度,保证给定 ...

  7. The server instance Witness rejected configure request; read its error log file for more information. The reason 1427, and state 31, can be of use for

    数据库服务器做了镜像之后,发现有错误信息 The server instance Witness rejected configure request; read its error log file ...

  8. The Linux Storage Stack Diagram 内核 4.0 版的 I/O 栈

  9. java URL编程

    一.URL编程技术 URL是统一资源定位器的缩写,它是指向互联网“资源”的指针.URL表示了Internet上某个资源的地址.URL支持http,file,ftp等 多种协议.通过URL标识,可以直接 ...

  10. android 实践项目

    电子词典  http://files.cnblogs.com/blogLYF/lyf_danci.apk