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. OpenCL( 一)

    #include <CL/cl.h> #include <iostream> #include <string> #include <fstream> ...

  2. 第二次冲刺spring会议(第一次会议)

    [例会时间]2014/5/4  21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇 内部测试版发布时间5月11日 ...

  3. 推荐两个好用的Xcode插件(提供下载链接)

    这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImageNamed-Xcode-master 提供快速创建自动注释:V ...

  4. java的String类型为什么是final

    (转自:http://www.cnblogs.com/ikuman/archive/2013/08/27/3284410.html) 最佳答案: 主要是为了“效率” 和 “安全性” 的缘故.若 Str ...

  5. 飞雪桌面日历软件 V8.6 免费绿色版

    软件名称: 飞雪桌面日历软件软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP / Win2008软件大小: 4MB图片预览: 软件简介: ...

  6. Win7的64位系统如何搭建安卓Android开发环境

    在搭建安卓Android开发环境,那么现在比较主流的Win7的64位操作系统如何搭建呢?其实很简单,不需要设置任何环境变量,只需要下载两个程序包(ADT和JDK),下载的时候注意选择相应的64位程序包 ...

  7. CentOS安装配置JDK-7(.rpm)

    声明:本文转自:http://www.cnblogs.com/zhoulf/archive/2013/02/04/2891608.html 安装说明 系统环境:centos-6.3安装方式:rpm安装 ...

  8. 一个初学者的辛酸路程-初识Python-1

    前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...

  9. UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法

    有关UEFI BIOS基础知识的简介,一年前在网易博客做过详细的概述.鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解,虽然网上有各式各样的启动修复工具,但是对于新手来说,如果不明白其中的 ...

  10. H5加载优化